diff options
author | Julien Duroure <julien.duroure@gmail.com> | 2019-02-22 00:38:15 +0300 |
---|---|---|
committer | Julien Duroure <julien.duroure@gmail.com> | 2019-02-22 00:38:15 +0300 |
commit | 2ee886c25b107bd716591a12c74fb180997af2c8 (patch) | |
tree | 1deb4db1f5ef4ac52214eeb344ccacefd14ba575 | |
parent | 3f91b7f68083a221c8b222860f749a85c0c810ce (diff) |
glTF importer: do not use same mesh instance if node has some animation on morph target
-rwxr-xr-x | io_scene_gltf2/blender/imp/gltf2_blender_gltf.py | 8 | ||||
-rwxr-xr-x | io_scene_gltf2/blender/imp/gltf2_blender_node.py | 19 |
2 files changed, 24 insertions, 3 deletions
diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_gltf.py b/io_scene_gltf2/blender/imp/gltf2_blender_gltf.py index 3f55f933..637cd72f 100755 --- a/io_scene_gltf2/blender/imp/gltf2_blender_gltf.py +++ b/io_scene_gltf2/blender/imp/gltf2_blender_gltf.py @@ -202,6 +202,10 @@ class BlenderGlTF(): node.transform = mat + # Weight animation management + node.weight_animation = False + + # joint management for node_idx, node in enumerate(gltf.data.nodes): is_joint, skin_idx = gltf.is_node_joint(node_idx) @@ -229,9 +233,13 @@ class BlenderGlTF(): if anim_idx not in gltf.data.nodes[channel.target.node].animations.keys(): gltf.data.nodes[channel.target.node].animations[anim_idx] = [] gltf.data.nodes[channel.target.node].animations[anim_idx].append(channel_idx) + # Manage node with animation on weights, that are animated in meshes in Blender (ShapeKeys) + if channel.target.path == "weights": + gltf.data.nodes[channel.target.node].weight_animation = True # Meshes if gltf.data.meshes: for mesh in gltf.data.meshes: mesh.blender_name = None + mesh.is_weight_animated = False diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_node.py b/io_scene_gltf2/blender/imp/gltf2_blender_node.py index df5b5a42..0792b96d 100755 --- a/io_scene_gltf2/blender/imp/gltf2_blender_node.py +++ b/io_scene_gltf2/blender/imp/gltf2_blender_node.py @@ -39,9 +39,18 @@ class BlenderNode(): instance = False if gltf.data.meshes[pynode.mesh].blender_name is not None: # Mesh is already created, only create instance - instance = True - mesh = bpy.data.meshes[gltf.data.meshes[pynode.mesh].blender_name] - else: + # Except is current node is animated with path weight + # Or if previous instance is animation at node level + if pynode.weight_animation is True: + instance = False + else: + if gltf.data.meshes[pynode.mesh].is_weight_animated is True: + instance = False + else: + instance = True + mesh = bpy.data.meshes[gltf.data.meshes[pynode.mesh].blender_name] + + if instance is False: if pynode.name: gltf.log.info("Blender create Mesh node " + pynode.name) else: @@ -49,6 +58,10 @@ class BlenderNode(): mesh = BlenderMesh.create(gltf, pynode.mesh, node_idx, parent) + if pynode.weight_animation is True: + # flag this mesh instance as created only for this node, because of weight animation + gltf.data.meshes[pynode.mesh].is_weight_animated = True + if pynode.name: name = pynode.name else: |