From 1d5c8b54ee99433ff5c3ef416f1f9bc1fd8780ef Mon Sep 17 00:00:00 2001 From: Julien Duroure Date: Tue, 29 Mar 2022 17:39:41 +0200 Subject: glTF exporter: Fix T96517 better instance management when no modifiers --- io_scene_gltf2/__init__.py | 2 +- .../blender/exp/gltf2_blender_gather_mesh.py | 1 - .../blender/exp/gltf2_blender_gather_nodes.py | 47 ++++++++++++---------- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/io_scene_gltf2/__init__.py b/io_scene_gltf2/__init__.py index c2704ffd..11dbdce6 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, 15), + "version": (3, 2, 16), 'blender': (3, 1, 0), 'location': 'File > Import-Export', 'description': 'Import-Export as glTF 2.0', diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py index c8987127..fd334cb3 100755 --- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py +++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py @@ -12,7 +12,6 @@ from io_scene_gltf2.io.com.gltf2_io_debug import print_console from io_scene_gltf2.io.exp.gltf2_io_user_extensions import export_user_extensions -@cached def get_mesh_cache_key(blender_mesh, blender_object, vertex_groups, diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py b/io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py index 25784960..b0b2d4b8 100755 --- a/io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py +++ b/io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py @@ -194,28 +194,31 @@ def __gather_mesh(vnode, blender_object, export_settings): if len(modifiers) == 0: modifiers = None - # TODO for objects without any modifiers, we can keep original mesh_data - # It will instance mesh in glTF - if export_settings[gltf2_blender_export_keys.APPLY]: - armature_modifiers = {} - if export_settings[gltf2_blender_export_keys.SKINS]: - # temporarily disable Armature modifiers if exporting skins - for idx, modifier in enumerate(blender_object.modifiers): - if modifier.type == 'ARMATURE': - armature_modifiers[idx] = modifier.show_viewport - modifier.show_viewport = False - - depsgraph = bpy.context.evaluated_depsgraph_get() - blender_mesh_owner = blender_object.evaluated_get(depsgraph) - blender_mesh = blender_mesh_owner.to_mesh(preserve_all_data_layers=True, depsgraph=depsgraph) - for prop in blender_object.data.keys(): - blender_mesh[prop] = blender_object.data[prop] - skip_filter = True - if export_settings[gltf2_blender_export_keys.SKINS]: - # restore Armature modifiers - for idx, show_viewport in armature_modifiers.items(): - blender_object.modifiers[idx].show_viewport = show_viewport + if export_settings[gltf2_blender_export_keys.APPLY]: + if modifiers is None: # If no modifier, use original mesh, it will instance all shared mesh in a single glTF mesh + blender_mesh = blender_object.data + skip_filter = False + else: + armature_modifiers = {} + if export_settings[gltf2_blender_export_keys.SKINS]: + # temporarily disable Armature modifiers if exporting skins + for idx, modifier in enumerate(blender_object.modifiers): + if modifier.type == 'ARMATURE': + armature_modifiers[idx] = modifier.show_viewport + modifier.show_viewport = False + + depsgraph = bpy.context.evaluated_depsgraph_get() + blender_mesh_owner = blender_object.evaluated_get(depsgraph) + blender_mesh = blender_mesh_owner.to_mesh(preserve_all_data_layers=True, depsgraph=depsgraph) + for prop in blender_object.data.keys(): + blender_mesh[prop] = blender_object.data[prop] + skip_filter = True + + if export_settings[gltf2_blender_export_keys.SKINS]: + # restore Armature modifiers + for idx, show_viewport in armature_modifiers.items(): + blender_object.modifiers[idx].show_viewport = show_viewport else: blender_mesh = blender_object.data skip_filter = False @@ -249,7 +252,7 @@ def __gather_mesh(vnode, blender_object, export_settings): None, export_settings) - if export_settings[gltf2_blender_export_keys.APPLY]: + if export_settings[gltf2_blender_export_keys.APPLY] and modifiers is not None: blender_mesh_owner.to_mesh_clear() return result -- cgit v1.2.3