+ # parent index
+ bone.parent_index=b.parent_index if b.parent_index!=None else 0xFFFF
+
+ # tail index
+ if b.tail_index!=None:
+ if bone.type==9:
+ bone.tail_index=0
+ else:
+ bone.tail_index=b.tail_index
+ else:
+ bone.tail_index=0
+
+ bone.ik_index=b.ik_index
+
+ # convert right-handed z-up to left-handed y-up
+ bone.pos.x=b.pos[0] if not near(b.pos[0], 0) else 0
+ bone.pos.y=b.pos[2] if not near(b.pos[2], 0) else 0
+ bone.pos.z=b.pos[1] if not near(b.pos[1], 0) else 0
+
+ # IK
+ print('ik')
+ for ik in self.builder.ik_list:
+ solver=io.addIK()
+ solver.index=self.builder.getIndex(ik.target)
+ solver.target=self.builder.getIndex(ik.effector)
+ solver.length=ik.length
+ b=self.builder.bones[ik.effector.parent_index]
+ for i in xrange(solver.length):
+ solver.children.append(self.builder.getIndex(b))
+ b=self.builder.bones[b.parent_index]
+ solver.iterations=ik.iterations
+ solver.weight=ik.weight
+
+ # 表情
+ print('shape keys')
+ for i, m in enumerate(self.oneSkinMesh.morphList):
+ # morph
+ morph=io.addMorph()
+
+ v=englishmap.getUnicodeSkinName(m.name)
+ assert(v)
+ cp932=v[1].encode('cp932')
+ morph.name="%s\n" % cp932
+
+ morph.english_name="%s\n" % m.name
+ m.type=v[2]
+ morph.type=v[2]
+ for index, offset in m.offsets:
+ # convert right-handed z-up to left-handed y-up
+ morph.append(index, offset[0], offset[2], offset[1])
+ morph.vertex_count=len(m.offsets)
+
+ # 表情枠
+ print('display list')
+ # type==0はbase
+ for i, m in enumerate(self.oneSkinMesh.morphList):
+ if m.type==3:
+ io.face_list.append(i)
+ for i, m in enumerate(self.oneSkinMesh.morphList):
+ if m.type==2:
+ io.face_list.append(i)
+ for i, m in enumerate(self.oneSkinMesh.morphList):
+ if m.type==1:
+ io.face_list.append(i)
+ for i, m in enumerate(self.oneSkinMesh.morphList):
+ if m.type==4:
+ io.face_list.append(i)
+
+ # ボーン表示枠
+ print('bone display list')
+ def createBoneDisplayName(name, english):
+ boneDisplayName=io.addBoneDisplayName()
+ boneDisplayName.name=name.decode('utf-8').encode('cp932')
+ boneDisplayName.english_name=english
+ boneDisplayName=createBoneDisplayName("IK\n", "IK\n")
+ boneDisplayName=createBoneDisplayName("体(上)\n", "Body[u]\n")
+ boneDisplayName=createBoneDisplayName("髪\n", "Hair\n")
+ boneDisplayName=createBoneDisplayName("腕\n", "Arms\n")
+ boneDisplayName=createBoneDisplayName("指\n", "Fingers\n")
+ boneDisplayName=createBoneDisplayName("体(下)\n", "Body[l]\n")
+ boneDisplayName=createBoneDisplayName("足\n", "Legs\n")
+ for i, b in enumerate(self.builder.bones):
+ if i==0:
+ continue
+ if b.type in [6, 7]:
+ continue
+ io.addBoneDisplay(i, getBoneDisplayGroup(b))
+
+ # English
+ print('english')
+ io.english_name="blender export"
+ io.english_coment="blender export"
+
+ for i in range(10):
+ io.getToonTexture(i).name="toon%02d.bmp\n" % i
+
+ # 書き込み
+ return io.write(path)
+
+
+def getBoneDisplayGroup(bone):
+ boneGroups=[
+ [ # IK
+ "necktie IK", "hair IK_L", "hair IK_R", "leg IK_L", "leg IK_R",
+ "toe IK_L", "toe IK_R",
+ ],
+ [ # 体(上)
+ "upper body", "neck", "head", "eye_L", "eye_R",
+ "necktie1", "necktie2", "necktie3", "eyes",
+ "eyelight_L", "eyelight_R",
+ ],
+ [ # 髪
+ "front hair1", "front hair2", "front hair3",
+ "hair1_L", "hair2_L", "hair3_L",
+ "hair4_L", "hair5_L", "hair6_L",
+ "hair1_R", "hair2_R", "hair3_R",
+ "hair4_R", "hair5_R", "hair6_R",
+ ],
+ [ # 腕
+ "shoulder_L", "arm_L", "arm twist_L", "elbow_L",
+ "wrist twist_L", "wrist_L", "sleeve_L",
+ "shoulder_R", "arm_R", "arm twist_R", "elbow_R",
+ "wrist twist_R", "wrist_R", "sleeve_R",
+ ],
+ [ # 指
+ "thumb1_L", "thumb2_L", "fore1_L", "fore2_L", "fore3_L",
+ "middle1_L", "middle2_L", "middle3_L",
+ "third1_L", "third2_L", "third3_L",
+ "little1_L", "little2_L", "little3_L",
+ "thumb1_R", "thumb2_R", "fore1_R", "fore2_R", "fore3_R",
+ "middle1_R", "middle2_R", "middle3_R",
+ "third1_R", "third2_R", "third3_R",
+ "little1_R", "little2_R", "little3_R",
+ ],
+ [ # 体(下)
+ "lower body", "waist accessory",
+ "front skirt_L", "back skirt_L",
+ "front skirt_R", "back skirt_R",
+ ],
+ [ # 足
+ "leg_L", "knee_L", "ankle_L",
+ "leg_R", "knee_R", "ankle_R",
+ ],
+ ]
+ index=1
+ for g in boneGroups:
+ if bone.name in g:
+ return index
+ index+=1
+ print(bone)
+ return -1