diff options
author | Julien Duroure <julien.duroure@gmail.com> | 2020-03-28 17:43:28 +0300 |
---|---|---|
committer | Julien Duroure <julien.duroure@gmail.com> | 2020-03-28 17:43:28 +0300 |
commit | 2f43f0802f6edc04f92cf756eda46750fd3bdb61 (patch) | |
tree | 28d4dc62a406143c7783537611afbd72857972f4 /io_scene_gltf2/blender | |
parent | ea2965438756165bc28b7d52e472b2c5984d64be (diff) |
glTF importer: refactor vertex group/armature modifier creation
Diffstat (limited to 'io_scene_gltf2/blender')
-rwxr-xr-x | io_scene_gltf2/blender/imp/gltf2_blender_node.py | 20 | ||||
-rwxr-xr-x | io_scene_gltf2/blender/imp/gltf2_blender_scene.py | 6 | ||||
-rwxr-xr-x | io_scene_gltf2/blender/imp/gltf2_blender_skin.py | 55 |
3 files changed, 20 insertions, 61 deletions
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 |