From 5838e260366aebd1a1b014bcd84ad05728739005 Mon Sep 17 00:00:00 2001 From: Julien Duroure Date: Sun, 13 Mar 2022 11:17:33 +0100 Subject: 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 --- io_scene_gltf2/__init__.py | 25 ++++++++++- .../blender/com/gltf2_blender_material_helpers.py | 9 ++++ io_scene_gltf2/blender/com/gltf2_blender_ui.py | 49 ++++++++++++++++++++++ .../imp/gltf2_blender_pbrMetallicRoughness.py | 9 +--- 4 files changed, 83 insertions(+), 9 deletions(-) create mode 100644 io_scene_gltf2/blender/com/gltf2_blender_ui.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 -- cgit v1.2.3