From 52bfc6a430ecf210400efab83832eebb38820b58 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Sun, 13 Jun 2010 22:57:01 +0900 Subject: [PATCH] fix bone. --- include/pmd.h | 1 + src/pmd.cpp | 5 +++++ swig/blender/bl24.py | 28 +++++++++++++++++++++++++++- swig/blender/bl25.py | 30 ++++++++++++++++++++++++++++++ swig/blender/pmd_export.py | 43 +++++++++++++++++++++---------------------- swig/pmd.i | 14 +++++++------- 6 files changed, 91 insertions(+), 30 deletions(-) diff --git a/include/pmd.h b/include/pmd.h index ed2c1e6..573882f 100644 --- a/include/pmd.h +++ b/include/pmd.h @@ -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) diff --git a/src/pmd.cpp b/src/pmd.cpp index 2a3d556..bb20068 100644 --- a/src/pmd.cpp +++ b/src/pmd.cpp @@ -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 diff --git a/swig/blender/bl24.py b/swig/blender/bl24.py index 1819ac2..f08ff30 100644 --- a/swig/blender/bl24.py +++ b/swig/blender/bl24.py @@ -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] + diff --git a/swig/blender/bl25.py b/swig/blender/bl25.py index d3f74b3..8c02157 100644 --- a/swig/blender/bl25.py +++ b/swig/blender/bl25.py @@ -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 + diff --git a/swig/blender/pmd_export.py b/swig/blender/pmd_export.py index 2690b82..c0e52cb 100644 --- a/swig/blender/pmd_export.py +++ b/swig/blender/pmd_export.py @@ -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 diff --git a/swig/pmd.i b/swig/pmd.i index b75ef33..c07ce3a 100644 --- a/swig/pmd.i +++ b/swig/pmd.i @@ -1,4 +1,11 @@ %module pmd + +/////////////////////////////////////////////////////////////////////////////// +// bytearray typemap +/////////////////////////////////////////////////////////////////////////////// +%include +%pybuffer_string(const char *src); + %{ #include using namespace meshio; @@ -24,13 +31,6 @@ using namespace pmd; %template(PBoneVector) std::vector; /////////////////////////////////////////////////////////////////////////////// -// bytearray typemap -/////////////////////////////////////////////////////////////////////////////// -%include -%pybuffer_string(const char *src); -%pybuffer_string(const char *path); - -/////////////////////////////////////////////////////////////////////////////// // meshio::pmd::IO::each_vertex /////////////////////////////////////////////////////////////////////////////// %inline %{ -- 2.11.0