OSDN Git Service

pmx bug fix
authorousttrue <ousttrue@gmail.com>
Wed, 12 Oct 2011 16:47:48 +0000 (01:47 +0900)
committerousttrue <ousttrue@gmail.com>
Wed, 12 Oct 2011 16:47:48 +0000 (01:47 +0900)
blender26-meshio/bl.py
blender26-meshio/import_pmd.py
blender26-meshio/import_pmx.py
pymeshio/pmx/__init__.py
pymeshio/pmx/reader.py
pymeshio/pmx/writer.py

index c7353ec..4d5afde 100644 (file)
@@ -255,6 +255,7 @@ class object:
         g=pose.bone_groups.active
         g.name=name
         g.color_set=color_set
+        return g
 
     @staticmethod
     def boneGroups(o):
@@ -595,15 +596,17 @@ class armature:
         bpy.ops.object.mode_set(mode='EDIT', toggle=False)
 
     @staticmethod
-    def createIkConstraint(armature_object, p_bone, effector_name, ik):
+    def createIkConstraint(armature_object, p_bone, effector_name, 
+            chain, weight, iterations):
         constraint = p_bone.constraints.new('IK')
-        constraint.chain_count=len(ik.children)
+        constraint.chain_count=len(chain)
         constraint.target=armature_object
         constraint.subtarget=effector_name
         constraint.use_tail=False
+        # ToDo
         # not used. place folder when export.
-        constraint.weight=ik.weight
-        constraint.iterations=ik.iterations * 10
+        #constraint.weight=weight
+        #constraint.iterations=iterations * 10
         return constraint
 
     @staticmethod
index ac6323e..42ee11f 100644 (file)
@@ -303,7 +303,8 @@ def __importArmature(l):
             effector_name=l.bones[ik.index].name.decode('cp932')
 
         constraint=bl.armature.createIkConstraint(armature_object,
-                p_bone, effector_name, ik)
+                p_bone, effector_name, 
+                ik.children, ik.weight, ik.iterations)
 
     bl.armature.makeEditable(armature_object)
     bl.armature.update(armature)
index c317315..8ffe81c 100644 (file)
@@ -48,7 +48,7 @@ def __create_a_material(m, name, textures_and_images):
     texture_index=bl.material.addTexture(material, textures_and_images[m.texture_index][0])
     return material
 
-def __create_armature(bones):
+def __create_armature(bones, display_slots):
     """
     armatureを作成する
 
@@ -58,8 +58,8 @@ def __create_armature(bones):
     """
     armature, armature_object=bl.armature.create()
 
-    bl.armature.makeEditable(armature_object)
     # create bones
+    bl.armature.makeEditable(armature_object)
     def create_bone(b):
         bone=bl.armature.createBone(armature, b.name)
         # bone position
@@ -74,6 +74,7 @@ def __create_armature(bones):
 
     # build skeleton
     for b, bone in zip(bones, bl_bones):
+        assert(b.name==bone.name)
         if b.parent_index!=-1:
             print("%s -> %s" % (bones[b.parent_index].name, b.name))
             parent_bone=bl_bones[b.parent_index]
@@ -85,11 +86,38 @@ def __create_armature(bones):
                 bl.bone.setConnected(tail_bone)
         else:
             print("no parent %s" % b.name)
+    bl.armature.update(armature)
 
-    # fix
+    # create ik constraint
+    bl.enterObjectMode()
+    pose = bl.object.getPose(armature_object)
+    for b, bone in zip(bones, bl_bones):
+        if b.getIkFlag():
+            ik=b.ik
+            assert(len(ik.link)<16)
+            p_bone=pose.bones[bones[ik.target_index].name]
+            assert(p_bone)
+            constraint=bl.armature.createIkConstraint(
+                    armature_object, p_bone, bone.name,
+                    ik.link, ik.limit_radian, ik.loop)
+    bl.armature.makeEditable(armature_object)
     bl.armature.update(armature)
+
+    # create bone group
     bl.enterObjectMode()
+    pose = bl.object.getPose(armature_object)
+    for i, ds in enumerate(display_slots):
+        print(ds)
+        g=bl.object.createBoneGroup(armature_object, ds.name, "THEME%02d" % (i+1))
+        for t, index in ds.references:
+            if t==0:
+                name=bones[index].name
+                try:
+                    pose.bones[name].bone_group=g
+                except KeyError as e:
+                    print("pose %s is not found" % name)
 
+    bl.enterObjectMode()
     return armature_object
 
 def _execute(filepath):
@@ -117,7 +145,7 @@ def _execute(filepath):
     root_object[bl.MMD_COMMENT]=model.english_comment
 
     # armatureを作る
-    armature_object=__create_armature(model.bones)
+    armature_object=__create_armature(model.bones, model.display_slots)
     if armature_object:
         bl.object.makeParent(root_object, armature_object)
 
index f98032c..3f36686 100644 (file)
@@ -74,11 +74,11 @@ class Ik(Diff):
             'limit_radian',\r
             'link',\r
             ]\r
-    def __init__(self, target_index, loop, limit_radian, link=[]):\r
+    def __init__(self, target_index, loop, limit_radian, link=None):\r
         self.target_index=target_index\r
         self.loop=loop\r
         self.limit_radian=limit_radian\r
-        self.link=link\r
+        self.link=link or []\r
 \r
     def __eq__(self, rhs):\r
         return (\r
@@ -470,12 +470,12 @@ class Morph(Diff):
             'morph_type',\r
             'offsets',\r
             ]\r
-    def __init__(self, name, english_name, panel, morph_type, offsets=[]):\r
+    def __init__(self, name, english_name, panel, morph_type, offsets=None):\r
         self.name=name\r
         self.english_name=english_name\r
         self.panel=panel\r
         self.morph_type=morph_type\r
-        self.offsets=offsets\r
+        self.offsets=offsets or []\r
 \r
     def __eq__(self, rhs):\r
         return (\r
@@ -533,26 +533,29 @@ class DisplaySlot(Diff):
         name: \r
         english_name: \r
         special_flag:\r
-        refrences: list of (ref_type, ref_index)\r
+        references: list of (ref_type, ref_index)\r
     """\r
     __slots__=[\r
             'name',\r
             'english_name',\r
             'special_flag',\r
-            'refrences',\r
+            'references',\r
             ]\r
-    def __init__(self, name, english_name, special_flag, refrences=[]):\r
+    def __init__(self, name, english_name, special_flag, references=None):\r
         self.name=name\r
         self.english_name=english_name\r
         self.special_flag=special_flag\r
-        self.refrences=refrences\r
+        self.references=references or []\r
+\r
+    def __str__(self):\r
+        return "<DisplaySlots %s(%d)>" % (self.name, len(self.references))\r
 \r
     def __eq__(self, rhs):\r
         return (\r
                 self.name==rhs.name\r
                 and self.english_name==rhs.english_name\r
                 and self.special_flag==rhs.special_flag\r
-                and self.refrences==rhs.refrences\r
+                and self.references==rhs.references\r
                 )\r
 \r
     def __ne__(self, rhs):\r
@@ -562,7 +565,7 @@ class DisplaySlot(Diff):
         self._diff(rhs, 'name')\r
         self._diff(rhs, 'english_name')\r
         self._diff(rhs, 'special_flag')\r
-        #self._diff_array(rhs, 'refrences')\r
+        #self._diff_array(rhs, 'references')\r
 \r
 \r
 class RigidBodyParam(Diff):\r
index dfa8b1d..b7227ba 100644 (file)
@@ -226,10 +226,10 @@ class Reader(common.BinaryReader):
         for _ in range(display_count):\r
             display_type=self.read_int(1)\r
             if display_type==0:\r
-                display_slot.refrences.append(\r
+                display_slot.references.append(\r
                         (display_type, self.read_bone_index()))\r
             elif display_type==1:\r
-                display_slot.refrences.append(\r
+                display_slot.references.append(\r
                         (display_type, self.read_morph_index()))\r
             else:\r
                 raise common.ParseException(\r
index 2d6a89a..0937b10 100644 (file)
@@ -211,8 +211,8 @@ class Writer(common.BinaryWriter):
             self.write_text(s.name)\r
             self.write_text(s.english_name)\r
             self.write_int(s.special_flag, 1)\r
-            self.write_int(len(s.refrences), 4)\r
-            for r in s.refrences:\r
+            self.write_int(len(s.references), 4)\r
+            for r in s.references:\r
                 self.write_int(r[0], 1)\r
                 if r[0]==0:\r
                     self.write_bone_index(r[1])\r