11 class ConvertException(Exception):
19 convert pmd model to pmx model.
22 dst.name=src.name.decode("cp932")
23 dst.english_name=src.english_name.decode("cp932")
24 dst.comment=src.comment.replace(
25 b"\n", b"\r\n").decode("cp932")
26 dst.english_comment=src.english_comment.replace(
27 b"\n", b"\r\n").decode("cp932")
28 def createDeform(bone0, bone1, weight0):
30 return pmx.Bdef1(bone1)
32 return pmx.Bdef1(bone0)
34 return pmx.Bdef2(bone0, bone1, weight0*0.01)
40 createDeform(v.bone0, v.bone1, v.weight0),
41 1.0 if v.edge_flag==0 else 0.0
43 for v in src.vertices]
44 dst.indices=[i for i in src.indices]
50 (2 if (m.edge_flag & 1!=0) else 0)+
53 (16 if (m.edge_flag & 1!=0) else 0)
55 def get_texture_file(path):
58 elif path.find(b'*')==-1:
61 return b'*'.split(path)[0]
62 def get_sphere_texture_file(path):
65 elif path.find(b'*')==-1:
68 return b'*'.split(path)[1]
69 def get_texture_index(path):
71 return texture_map[get_texture_file(path)]
74 def get_sphere_texture_index(path):
76 return texture_map[get_sphere_texture_file(path)]
79 def get_sphere_texture_flag(path):
80 sphere_texture=get_sphere_texture_file(path)
82 if sphere_texture.endswith('.sph'):
84 elif sphere_texture.endswith('.spa'):
87 raise ConvertException(
88 "invalid sphere texture: {0}".format(sphere_texture))
90 for m in src.materials:
91 texture=get_texture_file(m.texture_file)
92 if texture and not texture in texture_map:
93 texture_map[texture]=len(texture_map)
94 dst.textures.append(texture.decode("cp932"))
95 sphere_texture=get_sphere_texture_file(m.texture_file)
96 if sphere_texture and not sphere_texture in texture_map:
97 texture_map[sphere_texture]=len(texture_map)
98 dst.textures.append(sphere_texture.decode("cp932"))
101 name=common.unicode(""),
102 english_name=common.unicode(""),
103 diffuse_color=m.diffuse_color,
105 specular_factor=m.specular_factor,
106 specular_color=m.specular_color,
107 ambient_color=m.ambient_color,
109 edge_color=common.RGBA(0.0, 0.0, 0.0, 1.0),
111 texture_index=get_texture_index(m.texture_file),
112 sphere_texture_index=get_sphere_texture_index(m.texture_file),
113 sphere_mode=get_sphere_texture_flag(m.texture_file),
115 toon_texture_index=m.toon_index,
116 comment=common.unicode(""),
117 vertex_count=m.vertex_count
119 for i, m in enumerate(src.materials)]
122 for ik in src.ik_list:
126 if isinstance(b, pmd.Bone_Rolling):
128 if isinstance(b, pmd.Bone_Tweak):
132 if isinstance(b, pmd.Bone_Rotate):
134 if isinstance(b, pmd.Bone_RotateMove):
136 if isinstance(b, pmd.Bone_RotateInfl):
138 if isinstance(b, pmd.Bone_IKRotateInfl):
140 if isinstance(b, pmd.Bone_Rolling):
142 if isinstance(b, pmd.Bone_IKTarget):
144 if isinstance(b, pmd.Bone_IK):
146 if isinstance(b, pmd.Bone_Unvisible):
148 if isinstance(b, pmd.Bone_Tweak):
151 if isinstance(b, pmd.Bone_RotateMove):
153 if isinstance(b, pmd.Bone_IK):
156 if isinstance(b, pmd.Bone_Unvisible):
158 if isinstance(b, pmd.Bone_IKTarget):
160 if isinstance(b, pmd.Bone_Tweak):
163 def is_manupilatable(b):
166 if isinstance(b, pmd.Bone_IK):
168 def is_external_rotation(b):
169 if isinstance(b, pmd.Bone_RotateInfl):
171 if isinstance(b, pmd.Bone_Tweak):
173 def is_fixed_axis(b):
174 if isinstance(b, pmd.Bone_Rolling):
176 def is_local_axis(b):
178 def after_physics(b):
180 def external_parent(b):
182 def get_bone_flag(b):
184 (1 if is_connected(b) else 0)+
185 (2 if is_rotatable(b) else 0)+
186 (4 if is_movable(b) else 0)+
187 (8 if is_visible(b) else 0)+
189 (16 if is_manupilatable(b) else 0)+
190 (32 if has_ik(b) else 0)+
194 (256 if is_external_rotation(b) else 0)+
196 (1024 if is_fixed_axis(b) else 0)+
197 (2048 if is_local_axis(b) else 0)+
199 (4096 if after_physics(b) else 0)+
200 (8192 if external_parent(b) else 0)
203 def get_tail_position(b):
204 return common.Vector3()
205 def get_tail_index(b):
206 if isinstance(b, pmd.Bone_Rolling):
208 if isinstance(b, pmd.Bone_IKTarget):
210 if isinstance(b, pmd.Bone_Unvisible):
212 if isinstance(b, pmd.Bone_Tweak):
215 def get_ik_link(bone_index):
216 b=src.bones[bone_index]
217 if b.english_name.find(b'knee')==-1:
225 common.Vector3(-3.1415927410125732, 0.0, 0.0),
226 common.Vector3(-0.00872664619237184524536132812500, 0.0, 0.0))
228 if isinstance(b, pmd.Bone_IK):
231 ik.target, ik.iterations, ik.weight * 4, [
232 get_ik_link(child) for child in ik.children ])
238 name=b.name.decode('cp932'),
239 english_name=b.english_name.decode('cp932'),
241 parent_index=b.parent_index if b.parent_index!=65535 else -1,
243 flag=get_bone_flag(b),
244 tail_position=get_tail_position(b),
245 tail_index=get_tail_index(b),
248 fixed_axis=common.Vector3(),
249 local_x_vector=common.Vector3(),
250 local_z_vector=common.Vector3(),
254 for i, b in enumerate(src.bones)]
259 if isinstance(b, pmd.Bone_Unvisible):
263 def is_manupilatable(b):
267 def is_fixed_axis(b):
268 if isinstance(b, pmd.Bone_Rolling):
270 def is_local_axis(b):
272 def after_physics(b):
274 def external_parent(b):
276 def get_bone_flag(b):
278 (1 if is_connected(b) else 0)+
279 (2 if is_rotatable(b) else 0)+
280 (4 if is_movable(b) else 0)+
281 (8 if is_visible(b) else 0)+
283 (16 if is_manupilatable(b) else 0)+
284 (32 if has_ik(b) else 0)+
288 (256 if isinstance(b, pmd.Bone_RotateInfl) else 0)+
290 (1024 if is_fixed_axis(b) else 0)+
291 (2048 if is_local_axis(b) else 0)+
293 (4096 if after_physics(b) else 0)+
294 (8192 if external_parent(b) else 0)
297 def get_tail_position(b):
298 return common.Vector3()
299 def get_tail_index(b):
300 if isinstance(b, pmd.Bone_Rolling):
309 name=b.name.decode('cp932'),
310 english_name=b.english_name.decode('cp932'),
312 parent_index=b.parent_index if b.parent_index!=65535 else -1,
314 flag=get_bone_flag(b),
315 tail_position=get_tail_position(b),
316 tail_index=get_tail_index(b),
319 fixed_axis=common.Vector3(),
320 local_x_vector=common.Vector3(),
321 local_z_vector=common.Vector3(),
325 for i, b in enumerate(src.bones)]