[Bf-extensions-cvs] [09bbef31] master: glTF importer: avoid "husks" left behind when moving skinned meshes

Julien Duroure noreply at git.blender.org
Wed Jan 29 21:44:37 CET 2020


Commit: 09bbef319f5e05e48cbf3614408ecaae424308c4
Author: Julien Duroure
Date:   Wed Jan 29 21:44:09 2020 +0100
Branches: master
https://developer.blender.org/rBA09bbef319f5e05e48cbf3614408ecaae424308c4

glTF importer: avoid "husks" left behind when moving skinned meshes

===================================================================

M	io_scene_gltf2/__init__.py
M	io_scene_gltf2/blender/imp/gltf2_blender_vnode.py

===================================================================

diff --git a/io_scene_gltf2/__init__.py b/io_scene_gltf2/__init__.py
index 25b4edcd..7cecb34e 100755
--- a/io_scene_gltf2/__init__.py
+++ b/io_scene_gltf2/__init__.py
@@ -15,7 +15,7 @@
 bl_info = {
     'name': 'glTF 2.0 format',
     'author': 'Julien Duroure, Norbert Nopper, Urs Hanselmann, Moritz Becher, Benjamin Schmithüsen, Jim Eckerlein, and many external contributors',
-    "version": (1, 2, 12),
+    "version": (1, 2, 13),
     'blender': (2, 81, 6),
     'location': 'File > Import-Export',
     'description': 'Import-Export as glTF 2.0',
diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_vnode.py b/io_scene_gltf2/blender/imp/gltf2_blender_vnode.py
index 114d7193..4e1c6235 100644
--- a/io_scene_gltf2/blender/imp/gltf2_blender_vnode.py
+++ b/io_scene_gltf2/blender/imp/gltf2_blender_vnode.py
@@ -178,12 +178,11 @@ def move_skinned_meshes(gltf):
     joints in its skin affect it.
 
     To do this in Blender:
-     * Move a skinned mesh to become a child of the armature that affects it
+     * Move a skinned mesh to become a child of the armature that skins it.
+       Have to ensure the mesh and arma have the same world transform.
      * When we do mesh creation, we will also need to put all the verts in
        their rest pose (ie. the pose the edit bones are in)
     """
-    # TODO: this leaves behind empty "husk" nodes where the skinned meshes
-    #       used to be, which is ugly.
     ids = list(gltf.vnodes.keys())
     for id in ids:
         vnode = gltf.vnodes[id]
@@ -199,15 +198,53 @@ def move_skinned_meshes(gltf):
         pyskin = gltf.data.skins[skin]
         arma = gltf.vnodes[pyskin.joints[0]].bone_arma
 
+        # First try moving the whole node if we can do it without
+        # messing anything up.
+        is_animated = (
+            gltf.data.animations and
+            isinstance(id, int) and
+            gltf.data.nodes[id].animations
+        )
+        ok_to_move = (
+            not is_animated and
+            vnode.type == VNode.Object and
+            not vnode.is_arma and
+            not vnode.children and
+            vnode.camera_node_idx is None and
+            vnode.light_node_idx is None
+        )
+        if ok_to_move:
+            reparent(gltf, id, new_parent=arma)
+            vnode.trs = (
+                Vector((0, 0, 0)),
+                Quaternion((1, 0, 0, 0)),
+                Vector((1, 1, 1)),
+            )
+            continue
+
+        # Otherwise, create a new child of the arma and move
+        # the mesh instance there, leaving the node behind.
         new_id = str(id) + '.skinned'
         gltf.vnodes[new_id] = VNode()
         gltf.vnodes[new_id].name = gltf.data.meshes[mesh].name or 'Mesh_%d' % mesh
         gltf.vnodes[new_id].parent = arma
         gltf.vnodes[arma].children.append(new_id)
-
         gltf.vnodes[new_id].mesh_node_idx = vnode.mesh_node_idx
         vnode.mesh_node_idx = None
 
+def reparent(gltf, vnode_id, new_parent):
+    """Moves a VNode to a new parent."""
+    vnode = gltf.vnodes[vnode_id]
+    if vnode.parent == new_parent:
+        return
+    if vnode.parent is not None:
+        parent_vnode = gltf.vnodes[vnode.parent]
+        index = parent_vnode.children.index(vnode_id)
+        del parent_vnode.children[index]
+    vnode.parent = new_parent
+    gltf.vnodes[new_parent].children.append(vnode_id)
+
+
 
 def fixup_multitype_nodes(gltf):
     """



More information about the Bf-extensions-cvs mailing list