: parent(0)
{}
std::wstring getName()const;
+ void setName(const char *src);
};
inline std::ostream &operator<<(std::ostream &os,
const Bone &rhs)
strncpy(english_name, src, 20);
}
+void Bone::setName(const char *src)
+{
+ strncpy(name, src, 20);
+}
+
} // namespace
} // namespace
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
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]
+
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):
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
+
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)
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)
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
####################
# IK chain
e=b.parent
- chainLength=c[cSetting.CHAINLEN]
+ chainLength=bl.ikChainLen(c)
for i in range(chainLength):
# IK影響下
chainBone=self.__boneByName(e.name)
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
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
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
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
%module pmd
+
+///////////////////////////////////////////////////////////////////////////////
+// bytearray typemap
+///////////////////////////////////////////////////////////////////////////////
+%include <pybuffer.i>
+%pybuffer_string(const char *src);
+
%{
#include <pmd.h>
using namespace meshio;
%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 %{