[Bf-extensions-cvs] [5838e260] master: glTF exporter: Add glTF settings node in shader menu

Julien Duroure noreply at git.blender.org
Sun Mar 13 11:19:57 CET 2022


Commit: 5838e260366aebd1a1b014bcd84ad05728739005
Author: Julien Duroure
Date:   Sun Mar 13 11:17:33 2022 +0100
Branches: master
https://developer.blender.org/rBA5838e260366aebd1a1b014bcd84ad05728739005

glTF exporter: Add glTF settings node in shader menu

This menu (in Add > Output) will be displayed only if activated in addon preferences.
The node is sed for AO export. This is a shortcut, avoiding user to create it him/herself

===================================================================

M	io_scene_gltf2/__init__.py
M	io_scene_gltf2/blender/com/gltf2_blender_material_helpers.py
A	io_scene_gltf2/blender/com/gltf2_blender_ui.py
M	io_scene_gltf2/blender/imp/gltf2_blender_pbrMetallicRoughness.py

===================================================================

diff --git a/io_scene_gltf2/__init__.py b/io_scene_gltf2/__init__.py
index b290f946..7c39ac3f 100755
--- a/io_scene_gltf2/__init__.py
+++ b/io_scene_gltf2/__init__.py
@@ -4,7 +4,7 @@
 bl_info = {
     'name': 'glTF 2.0 format',
     'author': 'Julien Duroure, Scurest, Norbert Nopper, Urs Hanselmann, Moritz Becher, Benjamin Schmithüsen, Jim Eckerlein, and many external contributors',
-    "version": (3, 2, 9),
+    "version": (3, 2, 10),
     'blender': (3, 1, 0),
     'location': 'File > Import-Export',
     'description': 'Import-Export as glTF 2.0',
@@ -1171,6 +1171,20 @@ class ImportGLTF2(Operator, ImportHelper):
             self.loglevel = logging.NOTSET
 
 
+class GLTF_AddonPreferences(bpy.types.AddonPreferences):
+    bl_idname = __package__
+
+    settings_node_ui : bpy.props.BoolProperty(
+            default= False,
+            description="Displays glTF Settings node in Shader Editor (Menu Add > Ouput)"
+            )
+
+
+    def draw(self, context):
+        layout = self.layout
+        row = layout.row()
+        row.prop(self, "settings_node_ui", text="Shader Editor Add-ons")
+
 def menu_func_import(self, context):
     self.layout.operator(ImportGLTF2.bl_idname, text='glTF 2.0 (.glb/.gltf)')
 
@@ -1188,21 +1202,26 @@ classes = (
     GLTF_PT_export_animation_skinning,
     GLTF_PT_export_user_extensions,
     ImportGLTF2,
-    GLTF_PT_import_user_extensions
+    GLTF_PT_import_user_extensions,
+    GLTF_AddonPreferences
 )
 
 
 def register():
+    import io_scene_gltf2.blender.com.gltf2_blender_ui as blender_ui
     for c in classes:
         bpy.utils.register_class(c)
     # bpy.utils.register_module(__name__)
 
+    blender_ui.register()
+
     # add to the export / import menu
     bpy.types.TOPBAR_MT_file_export.append(menu_func_export)
     bpy.types.TOPBAR_MT_file_import.append(menu_func_import)
 
 
 def unregister():
+    import io_scene_gltf2.blender.com.gltf2_blender_ui as blender_ui
     for c in classes:
         bpy.utils.unregister_class(c)
     for f in exporter_extension_panel_unregister_functors:
@@ -1213,6 +1232,8 @@ def unregister():
         f()
     importer_extension_panel_unregister_functors.clear()
 
+    blender_ui.unregister()
+
     # bpy.utils.unregister_module(__name__)
 
     # remove from the export / import menu
diff --git a/io_scene_gltf2/blender/com/gltf2_blender_material_helpers.py b/io_scene_gltf2/blender/com/gltf2_blender_material_helpers.py
index f3d7122e..7b90b0a3 100755
--- a/io_scene_gltf2/blender/com/gltf2_blender_material_helpers.py
+++ b/io_scene_gltf2/blender/com/gltf2_blender_material_helpers.py
@@ -1,6 +1,15 @@
 # SPDX-License-Identifier: Apache-2.0
 # Copyright 2018-2021 The glTF-Blender-IO authors.
 
+import bpy
 
 def get_gltf_node_name():
     return "glTF Settings"
+
+def create_settings_group(name):
+    gltf_node_group = bpy.data.node_groups.new(name, 'ShaderNodeTree')
+    gltf_node_group.inputs.new("NodeSocketFloat", "Occlusion")
+    gltf_node_group.nodes.new('NodeGroupOutput')
+    gltf_node_group_input = gltf_node_group.nodes.new('NodeGroupInput')
+    gltf_node_group_input.location = -200, 0
+    return gltf_node_group
\ No newline at end of file
diff --git a/io_scene_gltf2/blender/com/gltf2_blender_ui.py b/io_scene_gltf2/blender/com/gltf2_blender_ui.py
new file mode 100644
index 00000000..59c364fb
--- /dev/null
+++ b/io_scene_gltf2/blender/com/gltf2_blender_ui.py
@@ -0,0 +1,49 @@
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2018-2022 The glTF-Blender-IO authors.
+
+import bpy
+from ..com.gltf2_blender_material_helpers import get_gltf_node_name, create_settings_group
+
+def create_gltf_ao_group(operator, group_name):
+
+    # create a new group
+    gltf_ao_group = bpy.data.node_groups.new(group_name, "ShaderNodeTree")
+    
+    return gltf_ao_group
+
+class NODE_OT_GLTF_SETTINGS(bpy.types.Operator):
+    bl_idname = "node.gltf_settings_node_operator"
+    bl_label  = "glTF Settings"
+
+
+    @classmethod
+    def poll(cls, context):
+        space = context.space_data
+        return space.type == "NODE_EDITOR" \
+            and context.object and context.object.active_material \
+            and context.object.active_material.use_nodes is True \
+            and bpy.context.preferences.addons['io_scene_gltf2'].preferences.settings_node_ui is True
+
+    def execute(self, context):
+        gltf_settings_node_name = get_gltf_node_name()
+        if gltf_settings_node_name in bpy.data.node_groups:
+            my_group = bpy.data.node_groups[get_gltf_node_name()]
+        else:
+            my_group = create_settings_group(gltf_settings_node_name)
+        node_tree = context.object.active_material.node_tree
+        new_node = node_tree.nodes.new("ShaderNodeGroup")
+        new_node.node_tree = bpy.data.node_groups[my_group.name]
+        return {"FINISHED"}
+
+
+def add_gltf_settings_to_menu(self, context) :
+    if bpy.context.preferences.addons['io_scene_gltf2'].preferences.settings_node_ui is True:
+        self.layout.operator("node.gltf_settings_node_operator")
+
+
+def register():
+    bpy.utils.register_class(NODE_OT_GLTF_SETTINGS)
+    bpy.types.NODE_MT_category_SH_NEW_OUTPUT.append(add_gltf_settings_to_menu)
+
+def unregister():
+    bpy.utils.unregister_class(NODE_OT_GLTF_SETTINGS)
diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_pbrMetallicRoughness.py b/io_scene_gltf2/blender/imp/gltf2_blender_pbrMetallicRoughness.py
index 1780998c..a5d10a7a 100755
--- a/io_scene_gltf2/blender/imp/gltf2_blender_pbrMetallicRoughness.py
+++ b/io_scene_gltf2/blender/imp/gltf2_blender_pbrMetallicRoughness.py
@@ -3,7 +3,7 @@
 
 import bpy
 from ...io.com.gltf2_io import TextureInfo, MaterialPBRMetallicRoughness
-from ..com.gltf2_blender_material_helpers import get_gltf_node_name
+from ..com.gltf2_blender_material_helpers import get_gltf_node_name, create_settings_group
 from .gltf2_blender_texture import texture
 from .gltf2_blender_KHR_materials_clearcoat import \
     clearcoat, clearcoat_roughness, clearcoat_normal
@@ -552,16 +552,11 @@ def make_settings_node(mh):
     node.node_tree = get_settings_group()
     return node
 
-
 def get_settings_group():
     gltf_node_group_name = get_gltf_node_name()
     if gltf_node_group_name in bpy.data.node_groups:
         gltf_node_group = bpy.data.node_groups[gltf_node_group_name]
     else:
         # Create a new node group
-        gltf_node_group = bpy.data.node_groups.new(gltf_node_group_name, 'ShaderNodeTree')
-        gltf_node_group.inputs.new("NodeSocketFloat", "Occlusion")
-        gltf_node_group.nodes.new('NodeGroupOutput')
-        gltf_node_group_input = gltf_node_group.nodes.new('NodeGroupInput')
-        gltf_node_group_input.location = -200, 0
+        gltf_node_group = create_settings_group(gltf_node_group_name)
     return gltf_node_group



More information about the Bf-extensions-cvs mailing list