11 class ConvertException(Exception):
20 return pymeshio.pmx.Model.
27 dst.name=src.name.decode("cp932")
28 dst.english_name=src.english_name.decode("cp932")
29 dst.comment=src.comment.replace(
30 b"\n", b"\r\n").decode("cp932")
31 dst.english_comment=src.english_comment.replace(
32 b"\n", b"\r\n").decode("cp932")
33 def createDeform(bone0, bone1, weight0):
35 return pmx.Bdef1(bone1)
37 return pmx.Bdef1(bone0)
39 return pmx.Bdef2(bone0, bone1, weight0*0.01)
45 createDeform(v.bone0, v.bone1, v.weight0),
46 1.0 if v.edge_flag==0 else 0.0
48 for v in src.vertices]
49 dst.indices=[i for i in src.indices]
55 (2 if (m.edge_flag & 1!=0) else 0)+
58 (16 if (m.edge_flag & 1!=0) else 0)
60 def get_texture_file(path):
63 elif path.find(b'*')==-1:
66 return b'*'.split(path)[0]
67 def get_sphere_texture_file(path):
70 elif path.find(b'*')==-1:
73 return b'*'.split(path)[1]
74 def get_texture_index(path):
76 return texture_map[get_texture_file(path)]
79 def get_sphere_texture_index(path):
81 return texture_map[get_sphere_texture_file(path)]
84 def get_sphere_texture_flag(path):
85 sphere_texture=get_sphere_texture_file(path)
87 if sphere_texture.endswith('.sph'):
89 elif sphere_texture.endswith('.spa'):
92 raise ConvertException(
93 "invalid sphere texture: {0}".format(sphere_texture))
95 for m in src.materials:
96 texture=get_texture_file(m.texture_file)
97 if texture and not texture in texture_map:
98 texture_map[texture]=len(texture_map)
99 dst.textures.append(texture.decode("cp932"))
100 sphere_texture=get_sphere_texture_file(m.texture_file)
101 if sphere_texture and not sphere_texture in texture_map:
102 texture_map[sphere_texture]=len(texture_map)
103 dst.textures.append(sphere_texture.decode("cp932"))
106 name=common.unicode(""),
107 english_name=common.unicode(""),
108 diffuse_color=m.diffuse_color,
110 specular_factor=m.specular_factor,
111 specular_color=m.specular_color,
112 ambient_color=m.ambient_color,
114 edge_color=common.RGBA(0.0, 0.0, 0.0, 1.0),
116 texture_index=get_texture_index(m.texture_file),
117 sphere_texture_index=get_sphere_texture_index(m.texture_file),
118 sphere_mode=get_sphere_texture_flag(m.texture_file),
120 toon_texture_index=m.toon_index,
121 comment=common.unicode(""),
122 vertex_count=m.vertex_count
124 for i, m in enumerate(src.materials)]
127 for ik in src.ik_list:
131 if isinstance(b, pmd.Bone_Rolling):
133 if isinstance(b, pmd.Bone_Tweak):
137 if isinstance(b, pmd.Bone_Rotate):
139 if isinstance(b, pmd.Bone_RotateMove):
141 if isinstance(b, pmd.Bone_RotateInfl):
143 if isinstance(b, pmd.Bone_IKRotateInfl):
145 if isinstance(b, pmd.Bone_Rolling):
147 if isinstance(b, pmd.Bone_IKTarget):
149 if isinstance(b, pmd.Bone_IK):
151 if isinstance(b, pmd.Bone_Unvisible):
153 if isinstance(b, pmd.Bone_Tweak):
156 if isinstance(b, pmd.Bone_RotateMove):
158 if isinstance(b, pmd.Bone_IK):
161 if isinstance(b, pmd.Bone_Unvisible):
163 if isinstance(b, pmd.Bone_IKTarget):
165 if isinstance(b, pmd.Bone_Tweak):
168 def is_manupilatable(b):
171 if isinstance(b, pmd.Bone_IK):
173 def is_external_rotation(b):
174 if isinstance(b, pmd.Bone_RotateInfl):
176 if isinstance(b, pmd.Bone_Tweak):
178 def is_fixed_axis(b):
179 if isinstance(b, pmd.Bone_Rolling):
181 def is_local_axis(b):
183 def after_physics(b):
185 def external_parent(b):
187 def get_bone_flag(b):
189 (1 if is_connected(b) else 0)+
190 (2 if is_rotatable(b) else 0)+
191 (4 if is_movable(b) else 0)+
192 (8 if is_visible(b) else 0)+
194 (16 if is_manupilatable(b) else 0)+
195 (32 if has_ik(b) else 0)+
199 (256 if is_external_rotation(b) else 0)+
201 (1024 if is_fixed_axis(b) else 0)+
202 (2048 if is_local_axis(b) else 0)+
204 (4096 if after_physics(b) else 0)+
205 (8192 if external_parent(b) else 0)
208 def get_tail_position(b):
209 return common.Vector3()
210 def get_tail_index(b):
211 if isinstance(b, pmd.Bone_Rolling):
213 if isinstance(b, pmd.Bone_IKTarget):
215 if isinstance(b, pmd.Bone_Unvisible):
217 if isinstance(b, pmd.Bone_Tweak):
220 def get_ik_link(bone_index):
221 b=src.bones[bone_index]
222 if b.english_name.find(b'knee')==-1:
230 common.Vector3(-3.1415927410125732, 0.0, 0.0),
231 common.Vector3(-0.00872664619237184524536132812500, 0.0, 0.0))
233 if isinstance(b, pmd.Bone_IK):
236 ik.target, ik.iterations, ik.weight * 4, [
237 get_ik_link(child) for child in ik.children ])
243 name=b.name.decode('cp932'),
244 english_name=b.english_name.decode('cp932'),
246 parent_index=b.parent_index if b.parent_index!=65535 else -1,
248 flag=get_bone_flag(b),
249 tail_position=get_tail_position(b),
250 tail_index=get_tail_index(b),
253 fixed_axis=common.Vector3(),
254 local_x_vector=common.Vector3(),
255 local_z_vector=common.Vector3(),
259 for i, b in enumerate(src.bones)]
264 if isinstance(b, pmd.Bone_Unvisible):
268 def is_manupilatable(b):
272 def is_fixed_axis(b):
273 if isinstance(b, pmd.Bone_Rolling):
275 def is_local_axis(b):
277 def after_physics(b):
279 def external_parent(b):
281 def get_bone_flag(b):
283 (1 if is_connected(b) else 0)+
284 (2 if is_rotatable(b) else 0)+
285 (4 if is_movable(b) else 0)+
286 (8 if is_visible(b) else 0)+
288 (16 if is_manupilatable(b) else 0)+
289 (32 if has_ik(b) else 0)+
293 (256 if isinstance(b, pmd.Bone_RotateInfl) else 0)+
295 (1024 if is_fixed_axis(b) else 0)+
296 (2048 if is_local_axis(b) else 0)+
298 (4096 if after_physics(b) else 0)+
299 (8192 if external_parent(b) else 0)
302 def get_tail_position(b):
303 return common.Vector3()
304 def get_tail_index(b):
305 if isinstance(b, pmd.Bone_Rolling):
314 name=b.name.decode('cp932'),
315 english_name=b.english_name.decode('cp932'),
317 parent_index=b.parent_index if b.parent_index!=65535 else -1,
319 flag=get_bone_flag(b),
320 tail_position=get_tail_position(b),
321 tail_index=get_tail_index(b),
324 fixed_axis=common.Vector3(),
325 local_x_vector=common.Vector3(),
326 local_z_vector=common.Vector3(),
330 for i, b in enumerate(src.bones)]