[Bf-extensions-cvs] [2f43f080] master: glTF importer: refactor vertex group/armature modifier creation

Julien Duroure noreply at git.blender.org
Sat Mar 28 15:43:56 CET 2020


Commit: 2f43f0802f6edc04f92cf756eda46750fd3bdb61
Author: Julien Duroure
Date:   Sat Mar 28 15:43:28 2020 +0100
Branches: master
https://developer.blender.org/rBA2f43f0802f6edc04f92cf756eda46750fd3bdb61

glTF importer: refactor vertex group/armature modifier creation

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

M	io_scene_gltf2/__init__.py
M	io_scene_gltf2/blender/imp/gltf2_blender_node.py
M	io_scene_gltf2/blender/imp/gltf2_blender_scene.py
D	io_scene_gltf2/blender/imp/gltf2_blender_skin.py

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

diff --git a/io_scene_gltf2/__init__.py b/io_scene_gltf2/__init__.py
index bd71223d..92d452c0 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, 56),
+    "version": (1, 2, 57),
     'blender': (2, 82, 7),
     'location': 'File > Import-Export',
     'description': 'Import-Export as glTF 2.0',
diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_node.py b/io_scene_gltf2/blender/imp/gltf2_blender_node.py
index 8c732949..f6759224 100755
--- a/io_scene_gltf2/blender/imp/gltf2_blender_node.py
+++ b/io_scene_gltf2/blender/imp/gltf2_blender_node.py
@@ -207,6 +207,9 @@ class BlenderNode():
         if pymesh.shapekey_names:
             BlenderNode.set_morph_weights(gltf, pynode, obj)
 
+        if pynode.skin is not None:
+            BlenderNode.setup_skinning(gltf, pynode, obj)
+
         return obj
 
     @staticmethod
@@ -216,3 +219,20 @@ class BlenderNode():
         for i, weight in enumerate(weights):
             if pymesh.shapekey_names[i] is not None:
                 obj.data.shape_keys.key_blocks[pymesh.shapekey_names[i]].value = weight
+
+    @staticmethod
+    def setup_skinning(gltf, pynode, obj):
+        pyskin = gltf.data.skins[pynode.skin]
+
+        # Armature/bones should have already been created.
+
+        # Create vertex groups for each joint
+        for node_idx in pyskin.joints:
+            bone = gltf.vnodes[node_idx]
+            obj.vertex_groups.new(name=bone.blender_bone_name)
+
+        # Create an Armature modifier
+        first_bone = gltf.vnodes[pyskin.joints[0]]
+        arma = gltf.vnodes[first_bone.bone_arma]
+        mod = obj.modifiers.new(name="Armature", type="ARMATURE")
+        mod.object = arma.blender_object
diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_scene.py b/io_scene_gltf2/blender/imp/gltf2_blender_scene.py
index 691ced91..109d6b28 100755
--- a/io_scene_gltf2/blender/imp/gltf2_blender_scene.py
+++ b/io_scene_gltf2/blender/imp/gltf2_blender_scene.py
@@ -16,7 +16,6 @@ import bpy
 from math import sqrt
 from mathutils import Quaternion
 from .gltf2_blender_node import BlenderNode
-from .gltf2_blender_skin import BlenderSkin
 from .gltf2_blender_animation import BlenderAnimation
 from .gltf2_blender_animation_utils import simulate_stash
 from .gltf2_blender_vnode import VNode, compute_vnodes
@@ -42,11 +41,6 @@ class BlenderScene():
         gltf.display_current_node = 0  # for debugging
         BlenderNode.create_vnode(gltf, 'root')
 
-        # Now that all mesh / bones are created, create vertex groups on mesh
-        if gltf.data.skins:
-            BlenderSkin.create_vertex_groups(gltf)
-            BlenderSkin.create_armature_modifiers(gltf)
-
         BlenderScene.create_animations(gltf)
 
         if bpy.context.mode != 'OBJECT':
diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_skin.py b/io_scene_gltf2/blender/imp/gltf2_blender_skin.py
deleted file mode 100755
index 043d8f26..00000000
--- a/io_scene_gltf2/blender/imp/gltf2_blender_skin.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright 2018-2019 The glTF-Blender-IO authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-import bpy
-
-class BlenderSkin():
-    """Blender Skinning / Armature."""
-    def __new__(cls, *args, **kwargs):
-        raise RuntimeError("%s should not be instantiated" % cls)
-
-    @staticmethod
-    def create_vertex_groups(gltf):
-        """Create vertex groups for all skinned meshes."""
-        for vnode in gltf.vnodes.values():
-            if vnode.mesh_node_idx is None:
-                continue
-            pynode = gltf.data.nodes[vnode.mesh_node_idx]
-            if pynode.skin is None:
-                continue
-            pyskin = gltf.data.skins[pynode.skin]
-
-            obj = vnode.blender_object
-            for node_idx in pyskin.joints:
-                bone = gltf.vnodes[node_idx]
-                obj.vertex_groups.new(name=bone.blender_bone_name)
-
-    @staticmethod
-    def create_armature_modifiers(gltf):
-        """Create Armature modifiers for all skinned meshes."""
-        for vnode in gltf.vnodes.values():
-            if vnode.mesh_node_idx is None:
-                continue
-            pynode = gltf.data.nodes[vnode.mesh_node_idx]
-            if pynode.skin is None:
-                continue
-            pyskin = gltf.data.skins[pynode.skin]
-
-            first_bone = gltf.vnodes[pyskin.joints[0]]
-            arma = gltf.vnodes[first_bone.bone_arma]
-
-            obj = vnode.blender_object
-            mod = obj.modifiers.new(name="Armature", type="ARMATURE")
-            mod.object = arma.blender_object



More information about the Bf-extensions-cvs mailing list