Skip to content

Commit

Permalink
Fix #2253 - update user extension UI after changes in Blender
Browse files Browse the repository at this point in the history
  • Loading branch information
julienduroure committed May 30, 2024
1 parent 3103e30 commit fae512b
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 114 deletions.
29 changes: 16 additions & 13 deletions addons/io_scene_gltf2/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ def reload_package_recursive(current_dir, module_dict):
# Functions / Classes.
#

exporter_extension_panel_unregister_functors = []
importer_extension_panel_unregister_functors = []
exporter_extension_layout_draw = {}
importer_extension_layout_draw = {}


def ensure_filepath_matches_export_format(filepath, export_format):
Expand Down Expand Up @@ -992,11 +992,11 @@ def invoke(self, context, event):
for addon_name in preferences.addons.keys():
try:
if hasattr(sys.modules[addon_name], 'glTF2ExportUserExtension') or hasattr(sys.modules[addon_name], 'glTF2ExportUserExtensions'):
exporter_extension_panel_unregister_functors.append(sys.modules[addon_name].register_panel())
exporter_extension_layout_draw[addon_name] = sys.modules[addon_name].draw
except Exception:
pass

self.has_active_exporter_extensions = len(exporter_extension_panel_unregister_functors) > 0
self.has_active_exporter_extensions = len(exporter_extension_layout_draw.keys()) > 0
return ExportHelper.invoke(self, context, event)

def save_settings(self, context):
Expand Down Expand Up @@ -1299,6 +1299,8 @@ def draw(self, context):
if gltfpack_path != '':
export_panel_gltfpack(layout, operator)

export_panel_user_extension(context, layout)

def export_main(layout, operator, is_file_browser):
layout.prop(operator, 'export_format')
if operator.export_format == 'GLTF_SEPARATE':
Expand Down Expand Up @@ -1674,6 +1676,9 @@ def export_panel_gltfpack(layout, operator):
col = body.column(heading = "Miscellaneous", align = True)
col.prop(operator, 'export_gltfpack_noq')

def export_panel_user_extension(context, layout):
for draw in exporter_extension_layout_draw.values():
draw(context, layout)

class ExportGLTF2(bpy.types.Operator, ExportGLTF2_Base, ExportHelper):
"""Export scene as glTF 2.0 file"""
Expand Down Expand Up @@ -1785,17 +1790,19 @@ def draw(self, context):
layout.prop(self, 'export_import_convert_lighting_mode')
layout.prop(self, 'import_webp_texture')

import_panel_user_extension(context, layout)

def invoke(self, context, event):
import sys
preferences = bpy.context.preferences
for addon_name in preferences.addons.keys():
try:
if hasattr(sys.modules[addon_name], 'glTF2ImportUserExtension') or hasattr(sys.modules[addon_name], 'glTF2ImportUserExtensions'):
importer_extension_panel_unregister_functors.append(sys.modules[addon_name].register_panel())
importer_extension_layout_draw[addon_name] = sys.modules[addon_name].draw
except Exception:
pass

self.has_active_importer_extensions = len(importer_extension_panel_unregister_functors) > 0
self.has_active_importer_extensions = len(importer_extension_layout_draw.keys()) > 0
return ImportHelper.invoke_popup(self, context)

def execute(self, context):
Expand Down Expand Up @@ -1876,6 +1883,9 @@ def set_debug_log(self):
elif bpy.app.debug_value == 4:
self.loglevel = logging.DEBUG

def import_panel_user_extension(context, layout):
for draw in importer_extension_layout_draw.values():
draw(context, layout)

class GLTF2_filter_action(bpy.types.PropertyGroup):
keep : bpy.props.BoolProperty(name="Keep Animation")
Expand Down Expand Up @@ -1995,13 +2005,6 @@ def unregister():

for c in classes:
bpy.utils.unregister_class(c)
for f in exporter_extension_panel_unregister_functors:
f()
exporter_extension_panel_unregister_functors.clear()

for f in importer_extension_panel_unregister_functors:
f()
importer_extension_panel_unregister_functors.clear()

# bpy.utils.unregister_module(__name__)

Expand Down
57 changes: 6 additions & 51 deletions example-addons/example_gltf_exporter_extension/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,64 +40,19 @@ def register():
bpy.utils.register_class(ExampleExtensionProperties)
bpy.types.Scene.ExampleExtensionProperties = bpy.props.PointerProperty(type=ExampleExtensionProperties)

def register_panel():
# Register the panel on demand, we need to be sure to only register it once
# This is necessary because the panel is a child of the extensions panel,
# which may not be registered when we try to register this extension
try:
bpy.utils.register_class(GLTF_PT_UserExtensionPanel)
except Exception:
pass

# If the glTF exporter is disabled, we need to unregister the extension panel
# Just return a function to the exporter so it can unregister the panel
return unregister_panel


def unregister_panel():
# Since panel is registered on demand, it is possible it is not registered
try:
bpy.utils.unregister_class(GLTF_PT_UserExtensionPanel)
except Exception:
pass


def unregister():
unregister_panel()
bpy.utils.unregister_class(ExampleExtensionProperties)
del bpy.types.Scene.ExampleExtensionProperties

class GLTF_PT_UserExtensionPanel(bpy.types.Panel):

bl_space_type = 'FILE_BROWSER'
bl_region_type = 'TOOL_PROPS'
bl_label = "Enabled"
bl_parent_id = "GLTF_PT_export_user_extensions"
bl_options = {'DEFAULT_CLOSED'}

@classmethod
def poll(cls, context):
sfile = context.space_data
operator = sfile.active_operator
return operator.bl_idname == "EXPORT_SCENE_OT_gltf"

def draw_header(self, context):
props = bpy.context.scene.ExampleExtensionProperties
self.layout.prop(props, 'enabled')

def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False # No animation.

props = bpy.context.scene.ExampleExtensionProperties
layout.active = props.enabled
def draw(context, layout):
header, body = layout.panel("GLTF_addon_example_exporter", default_closed=False)

box = layout.box()
box.label(text=glTF_extension_name)
props = bpy.context.scene.ExampleExtensionProperties

props = bpy.context.scene.ExampleExtensionProperties
layout.prop(props, 'float_property', text="Some float value")
header.prop(props, 'enabled')
body.active = props.enabled
body.prop(props, 'float_property', text="Some float value")


class glTF2ExportUserExtension:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
schema_version = "1.0.0"
id = "GLTF_EXT_example_extension_export"
name = "glTF user extension example for export"
version = "0.0.1"
tagline = "glTF user extension example for export"
maintainer = "Community"
type = "add-on"
permissions = ["files"]
tags = ["Import-Export"]
blender_version_min = "4.2.0"
license = ["SPDX:GPL-2.0-or-later"]
website = "https://github.com/KhronosGroup/glTF-Blender-IO"
copyright = ["The glTF-Blender-IO authors"]
56 changes: 6 additions & 50 deletions example-addons/example_gltf_importer_extension/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,43 +32,22 @@ class ExampleImporterExtensionProperties(bpy.types.PropertyGroup):
)


class GLTF_PT_UserExtensionPanel(bpy.types.Panel):

bl_space_type = 'FILE_BROWSER'
bl_region_type = 'TOOL_PROPS'
bl_label = "Enabled"
bl_parent_id = "GLTF_PT_import_user_extensions"
bl_options = {'DEFAULT_CLOSED'}

@classmethod
def poll(cls, context):
sfile = context.space_data
operator = sfile.active_operator
return operator.bl_idname == "IMPORT_SCENE_OT_gltf"
def draw(context, layout):
header, body = layout.panel("GLTF_addon_example_importer", default_closed=False)

def draw_header(self, context):
props = bpy.context.scene.ExampleExtensionProperties
self.layout.prop(props, 'enabled')
props = bpy.context.scene.ExampleImporterExtensionProperties

def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False # No animation.

props = bpy.context.scene.ExampleExtensionProperties
layout.active = props.enabled

box = layout.box()
box.label(text=glTF_extension_name)

layout.prop(props, 'float_property', text="Some float value")
header.prop(props, 'enabled')
body.active = props.enabled
body.prop(props, 'float_property', text="Some float value")


class glTF2ImportUserExtension:

def __init__(self):
self.properties = bpy.context.scene.ExampleImporterExtensionProperties
self.extensions = [Extension(name="TEST_extension1", extension={}, required=True), Extension(name="TEST_extension2", extension={}, required=False)]

def gather_import_node_before_hook(self, vnode, gltf_node, gltf):
if self.properties.enabled:
Expand All @@ -83,28 +62,5 @@ def register():
bpy.types.Scene.ExampleImporterExtensionProperties = bpy.props.PointerProperty(type=ExampleImporterExtensionProperties)

def unregister():
unregister_panel()
bpy.utils.unregister_class(ExampleImporterExtensionProperties)
del bpy.types.Scene.ExampleImporterExtensionProperties


def register_panel():
# Register the panel on demand, we need to be sure to only register it once
# This is necessary because the panel is a child of the extensions panel,
# which may not be registered when we try to register this extension
try:
bpy.utils.register_class(GLTF_PT_UserExtensionPanel)
except Exception:
pass

# If the glTF importer is disabled, we need to unregister the extension panel
# Just return a function to the importer so it can unregister the panel
return unregister_panel


def unregister_panel():
# Since panel is registered on demand, it is possible it is not registered
try:
bpy.utils.unregister_class(GLTF_PT_UserExtensionPanel)
except Exception:
pass
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
schema_version = "1.0.0"
id = "GLTF_EXT_example_extension_import"
name = "glTF user extension example for import"
version = "0.0.1"
tagline = "glTF user extension example for import"
maintainer = "Community"
type = "add-on"
permissions = ["files"]
tags = ["Import-Export"]
blender_version_min = "4.2.0"
license = ["SPDX:GPL-2.0-or-later"]
website = "https://github.com/KhronosGroup/glTF-Blender-IO"
copyright = ["The glTF-Blender-IO authors"]

0 comments on commit fae512b

Please sign in to comment.