From acc30d67859ccd4ee52ba080f53e3681bfb153ca Mon Sep 17 00:00:00 2001 From: Julien Duroure Date: Thu, 31 Oct 2024 13:27:37 +0100 Subject: [PATCH] glTF exporter: Fix #129548 - Regression - Export ShapeKeys when only Armature modifier Set a custom property (ignore at export) that can identify and differenciate: - evaluated mesh - geometry node with SK --- scripts/addons_core/io_scene_gltf2/__init__.py | 2 +- .../io_scene_gltf2/blender/com/gltf2_blender_extras.py | 2 +- .../io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py | 4 ++-- .../io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py | 2 ++ .../blender/exp/gltf2_blender_gather_primitives_extract.py | 3 +-- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/scripts/addons_core/io_scene_gltf2/__init__.py b/scripts/addons_core/io_scene_gltf2/__init__.py index a7e38678d68..f78791f6a2f 100755 --- a/scripts/addons_core/io_scene_gltf2/__init__.py +++ b/scripts/addons_core/io_scene_gltf2/__init__.py @@ -5,7 +5,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": (4, 2, 70), + "version": (4, 2, 71), 'blender': (4, 2, 0), 'location': 'File > Import-Export', 'description': 'Import-Export as glTF 2.0', diff --git a/scripts/addons_core/io_scene_gltf2/blender/com/gltf2_blender_extras.py b/scripts/addons_core/io_scene_gltf2/blender/com/gltf2_blender_extras.py index 4a9680c3bcd..f35e9dc87b7 100644 --- a/scripts/addons_core/io_scene_gltf2/blender/com/gltf2_blender_extras.py +++ b/scripts/addons_core/io_scene_gltf2/blender/com/gltf2_blender_extras.py @@ -8,7 +8,7 @@ from .gltf2_blender_json import is_json_convertible # Custom properties, which are in most cases present and should not be imported/exported. -BLACK_LIST = ['cycles', 'cycles_visibility', 'cycles_curves', 'glTF2ExportSettings'] +BLACK_LIST = ['cycles', 'cycles_visibility', 'cycles_curves', 'glTF2ExportSettings', 'gltf2_mesh_applied'] def generate_extras(blender_element): diff --git a/scripts/addons_core/io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py b/scripts/addons_core/io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py index e9f47bb991b..340de5f735b 100755 --- a/scripts/addons_core/io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py +++ b/scripts/addons_core/io_scene_gltf2/blender/exp/gltf2_blender_gather_mesh.py @@ -107,7 +107,7 @@ def __gather_extras(blender_mesh: bpy.types.Mesh, extras = generate_extras(blender_mesh) or {} # Not for GN Instances - if export_settings['gltf_morph'] and blender_mesh.shape_keys and blender_mesh.users != 0: + if export_settings['gltf_morph'] and blender_mesh.shape_keys and ((blender_mesh.is_evaluated is True and blender_mesh.get('gltf2_mesh_applied') is not None) or blender_mesh.is_evaluated is False): morph_max = len(blender_mesh.shape_keys.key_blocks) - 1 if morph_max > 0: extras['targetNames'] = [k.name for k in get_sk_exported(blender_mesh.shape_keys.key_blocks)] @@ -150,7 +150,7 @@ def __gather_weights(blender_mesh: bpy.types.Mesh, return None # Not for GN Instances - if blender_mesh.users == 0: + if blender_mesh.is_evaluated is True and blender_mesh.get('gltf2_mesh_applied') is None: return None morph_max = len(blender_mesh.shape_keys.key_blocks) - 1 diff --git a/scripts/addons_core/io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py b/scripts/addons_core/io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py index 88a4ff9bc71..adae9bec01e 100755 --- a/scripts/addons_core/io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py +++ b/scripts/addons_core/io_scene_gltf2/blender/exp/gltf2_blender_gather_nodes.py @@ -307,6 +307,8 @@ def __gather_mesh(vnode, blender_object, export_settings): # But we need to remove some properties that are not needed for prop in [p for p in blender_object.data.keys() if p in BLACK_LIST]: del blender_mesh[prop] + # Store that this evaluated mesh has been created by the exporter, and is not a GN instance mesh + blender_mesh['gltf2_mesh_applied'] = True if export_settings['gltf_skins']: # restore Armature modifiers diff --git a/scripts/addons_core/io_scene_gltf2/blender/exp/gltf2_blender_gather_primitives_extract.py b/scripts/addons_core/io_scene_gltf2/blender/exp/gltf2_blender_gather_primitives_extract.py index 0899658da1d..5d564c21c8a 100644 --- a/scripts/addons_core/io_scene_gltf2/blender/exp/gltf2_blender_gather_primitives_extract.py +++ b/scripts/addons_core/io_scene_gltf2/blender/exp/gltf2_blender_gather_primitives_extract.py @@ -151,8 +151,7 @@ class PrimitiveCreator: # We need to check if we are in a GN Instance, because for GN instances, it seems that shape keys are preserved, # even if we apply modifiers # (For classic objects, shape keys are not preserved if we apply modifiers) - # We can check it by checking if the mesh is used by a user - if self.blender_mesh.shape_keys and self.export_settings['gltf_morph'] and self.blender_mesh.users != 0: + if self.blender_mesh.shape_keys and self.export_settings['gltf_morph'] and ((self.blender_mesh.is_evaluated is True and self.blender_mesh.get('gltf2_mesh_applied') is not None) or self.blender_mesh.is_evaluated is False): self.key_blocks = get_sk_exported(self.blender_mesh.shape_keys.key_blocks) # Fetch vert positions and bone data (joint,weights)