g=pose.bone_groups.active
g.name=name
g.color_set=color_set
+ return g
@staticmethod
def boneGroups(o):
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
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)
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を作成する
"""
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
# 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]
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):
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)
'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
'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
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
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
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
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