OSDN Git Service

fix bone.
authorousttrue <ousttrue@gmail.com>
Sun, 13 Jun 2010 13:57:01 +0000 (22:57 +0900)
committerousttrue <ousttrue@gmail.com>
Sun, 13 Jun 2010 13:57:01 +0000 (22:57 +0900)
include/pmd.h
src/pmd.cpp
swig/blender/bl24.py
swig/blender/bl25.py
swig/blender/pmd_export.py
swig/pmd.i

index ed2c1e6..573882f 100644 (file)
@@ -174,6 +174,7 @@ struct Bone
                : parent(0)
                {}
        std::wstring getName()const;
+       void setName(const char *src);
 };
 inline std::ostream &operator<<(std::ostream &os,
                const Bone &rhs)
index 2a3d556..bb20068 100644 (file)
@@ -714,6 +714,11 @@ void BoneDisplayName::setEnglishName(const char *src)
        strncpy(english_name, src, 20);
 }
 
+void Bone::setName(const char *src)
+{
+       strncpy(name, src, 20);
+}
+
 } // namespace
 } // namespace
 
index 1819ac2..f08ff30 100644 (file)
@@ -729,7 +729,6 @@ def createIkConstraint(armature_object, p_bone, effector_name, ik):
     constraint[cSetting.TARGET]=armature_object
     constraint[cSetting.USETIP]=False
     constraint[cSetting.BONE]=effector_name
-    #ik_solver.influence=ik.weight
     # not used. place folder when export.
     constraint[cSetting.ROTWEIGHT]=ik.weight
     constraint[cSetting.ITERATIONS]=ik.iterations * 10
@@ -801,3 +800,30 @@ def meshVertexGroup(meshObject, name):
 def materialGet(scene, material_name):
     return Blender.Material.Get(material_name)
 
+def modifierIsArmature(m):
+    return m.name=="Armature"
+
+def boneHeadLocal(b):
+    return b.head['ARMATURESPACE'][0:3]
+
+def boneTailLocal(b):
+    return b.tail['ARMATURESPACE'][0:3]
+
+def boneIsConnected(b):
+    return Blender.Armature.CONNECTED in b.options
+
+def constraintIsIKSolver(c):
+    return c.type==Blender.Constraint.Type.IKSOLVER:
+
+def ikChainLen(c):
+    return c[Blender.Constraint.Settings.CHAINLEN]
+
+def ikTarget(c):
+    return c[Blender.Constraint.Settings.BONE])
+
+def ikItration(c):
+    return c[Blender.Constraint.Settings.ITERATIONS]
+
+def ikRotationWeight(c):
+    return c[Blender.Constraint.Settings.ROTWEIGHT]
+
index d3f74b3..8c02157 100644 (file)
@@ -372,6 +372,9 @@ def createIkConstraint(armature_object, p_bone, effector_name, ik):
     constraint.target=armature_object
     constraint.subtarget=effector_name
     constraint.use_tail=False
+    # not used. place folder when export.
+    constraint.weight=ik.weight
+    constraint.iterations=ik.iterations * 10
     return constraint
 
 def createArmatureBone(armature, name):
@@ -438,3 +441,30 @@ def meshVertexGroup(meshObject, name):
 def materialGet(scene, material_name):
     return bpy.data.materials[material_name]
 
+def modifierIsArmature(m):
+    return m.type=="ARMATURE"
+
+def boneHeadLocal(b):
+    return b.head_local[0:3]
+
+def boneTailLocal(b):
+    return b.tail_local[0:3]
+
+def boneIsConnected(b):
+    return b.connected
+
+def constraintIsIKSolver(c):
+    return c.type=='IK'
+
+def ikChainLen(c):
+    return c.chain_length
+
+def ikTarget(c):
+    return c.subtarget
+
+def ikItration(c):
+    return c.iterations
+
+def ikRotationWeight(c):
+    return c.weight
+
index 2690b82..c0e52cb 100644 (file)
@@ -470,13 +470,13 @@ class BoneBuilder(object):
             return
 
         print("gather bones")
-        armature=armatureObj.getData()
+        armature=bl.objectGetData(armatureObj)
         for b in armature.bones.values():
             if b.name=='center':
                 # root bone
                 bone=Bone(b.name, 
-                        b.head['ARMATURESPACE'][0:3], 
-                        b.tail['ARMATURESPACE'][0:3])
+                        bl.boneHeadLocal(b),
+                        bl.boneTailLocal(b))
                 self.__addBone(bone)
                 self.__getBone(bone, b)
 
@@ -484,8 +484,8 @@ class BoneBuilder(object):
             if not b.parent and b.name!='center':
                 # root bone
                 bone=Bone(b.name, 
-                        b.head['ARMATURESPACE'][0:3], 
-                        b.tail['ARMATURESPACE'][0:3])
+                        bl.boneHeadLocal(b),
+                        bl.boneTailLocal(b))
                 self.__addBone(bone)
                 self.__getBone(bone, b)
 
@@ -495,17 +495,14 @@ class BoneBuilder(object):
                 self.__checkConnection(b, None)
 
         print("gather ik")
-        pose = armatureObj.getPose()
-        cSetting=Blender.Constraint.Settings
+        pose = bl.objectGetPose(armatureObj)
         for b in pose.bones.values():
             for c in b.constraints:
-                if c.type==Blender.Constraint.Type.IKSOLVER:
+                if bl.constraintIsIKSolver(c):
                     ####################
                     # IK target
                     ####################
-                    assert(c[cSetting.TARGET]==armatureObj)
-                    target=self.__boneByName(
-                            c[Blender.Constraint.Settings.BONE])
+                    target=self.__boneByName(bl.ikTarget(c))
                     target.type=2
 
                     ####################
@@ -517,7 +514,7 @@ class BoneBuilder(object):
 
                     # IK chain
                     e=b.parent
-                    chainLength=c[cSetting.CHAINLEN]
+                    chainLength=bl.ikChainLen(c)
                     for i in range(chainLength):
                         # IK影響下
                         chainBone=self.__boneByName(e.name)
@@ -526,12 +523,12 @@ class BoneBuilder(object):
                         e=e.parent
                     self.ik_list.append(
                             IKSolver(target, link, chainLength, 
-                                int(c[cSetting.ITERATIONS] * 0.1), 
-                                c[cSetting.ROTWEIGHT]
+                                int(bl.ikItration(c) * 0.1), 
+                                bl.ikRotationWeight(c)
                                 ))
 
     def __checkConnection(self, b, p):
-        if Blender.Armature.CONNECTED in b.options:
+        if bl.boneIsConnected(b):
             parent=self.__boneByName(p.name)
             parent.isConnect=True
 
@@ -586,8 +583,8 @@ class BoneBuilder(object):
 
         for i, c in enumerate(b.children):
             bone=Bone(c.name, 
-                    c.head['ARMATURESPACE'][0:3], 
-                    c.tail['ARMATURESPACE'][0:3])
+                    bl.boneHeadLocal(c),
+                    bl.boneTailLocal(c))
             self.__addBone(bone)
             if parent:
                 bone.parent_index=parent.index
@@ -638,11 +635,12 @@ class PmdExporter(object):
             self.builder.ik_list.sort(key=getIndex)
 
     def __createOneSkinMesh(self, node):
+        print(node)
         ############################################################
         # search armature modifier
         ############################################################
         for m in node.o.modifiers:
-            if m.name=="Armature":
+            if bl.modifierIsArmature(m):
                 armatureObj=bl.armatureModifierGetObject(m)
                 if not self.armatureObj:
                     self.armatureObj=armatureObj
@@ -738,14 +736,15 @@ class PmdExporter(object):
 
             bone=io.addBone()
 
+            # name
             v=englishmap.getUnicodeBoneName(b.name)
             assert(v)
             cp932=v[1].encode('cp932')
-            bone_name="%s" % cp932
-            assert(len(bone_name)<20)
-            bone.name=bone_name
+            assert(len(cp932)<20)
+            bone.setName(cp932)
 
-            bone_english_name="%s" % b.name
+            # english name
+            bone_english_name=b.name
             assert(len(bone_english_name)<20)
             bone.english_name=bone_english_name
 
index b75ef33..c07ce3a 100644 (file)
@@ -1,4 +1,11 @@
 %module pmd
+
+///////////////////////////////////////////////////////////////////////////////
+// bytearray typemap
+///////////////////////////////////////////////////////////////////////////////
+%include <pybuffer.i>
+%pybuffer_string(const char *src);
+
 %{
 #include <pmd.h>
 using namespace meshio;
@@ -24,13 +31,6 @@ using namespace pmd;
 %template(PBoneVector) std::vector<meshio::pmd::Bone*>;
 
 ///////////////////////////////////////////////////////////////////////////////
-// bytearray typemap
-///////////////////////////////////////////////////////////////////////////////
-%include <pybuffer.i>
-%pybuffer_string(const char *src);
-%pybuffer_string(const char *path);
-
-///////////////////////////////////////////////////////////////////////////////
 // meshio::pmd::IO::each_vertex
 ///////////////////////////////////////////////////////////////////////////////
 %inline %{