5 from . import oneskinmesh
6 from .pymeshio import pmx
7 from .pymeshio import common
8 from .pymeshio.pmx import writer
14 model.comment=ex.comment
16 def get_deform(b0, b1, weight):
19 return pmx.Bdef1(b1, weight)
21 return pmx.Bdef1(b0, weight)
23 return pmx.Bdef2(b0, b1, weight)
25 model.vertices=[pmx.Vertex(
26 # convert right-handed z-up to left-handed y-up
27 common.Vector3(pos[0], pos[2], pos[1]),
28 # convert right-handed z-up to left-handed y-up
29 common.Vector3(attribute.nx, attribute.nz, attribute.ny),
31 common.Vector2(attribute.u, 1.0-attribute.v),
32 get_deform(ex.skeleton.indexByName(b0), ex.skeleton.indexByName(b1), weight),
33 # edge flag, 0: enable edge, 1: not edge
36 for pos, attribute, b0, b1, weight in ex.oneSkinMesh.vertexArray.zip()]
40 for i, b in enumerate(self.skeleton.bones):
44 v=englishmap.getUnicodeBoneName(b.name)
49 bone.english_name=b.name
54 b.ik_index=self.skeleton.indexByName('eyes')
59 bone.parent_index=b.parent_index
60 bone.tail_index=b.tail_index
61 bone.ik_index=b.ik_index
63 # convert right-handed z-up to left-handed y-up
64 bone.pos.x=b.pos[0] if not near(b.pos[0], 0) else 0
65 bone.pos.y=b.pos[2] if not near(b.pos[2], 0) else 0
66 bone.pos.z=b.pos[1] if not near(b.pos[1], 0) else 0
68 model.bones.append(bone)
72 for ik in self.skeleton.ik_list:
74 solver.index=self.skeleton.getIndex(ik.target)
75 solver.target=self.skeleton.getIndex(ik.effector)
76 solver.length=ik.length
77 b=self.skeleton.bones[ik.effector.parent_index]
78 for i in range(solver.length):
79 solver.children.append(self.skeleton.getIndex(b))
80 b=self.skeleton.bones[b.parent_index]
81 solver.iterations=ik.iterations
82 solver.weight=ik.weight
83 model.ik_list.append(solver)
86 vertexCount=self.oneSkinMesh.getVertexCount()
87 for material_name, indices in self.oneSkinMesh.vertexArray.each():
88 #print('material:', material_name)
90 m=bl.material.get(material_name)
93 def get_texture_name(texture):
94 pos=texture.replace("\\", "/").rfind("/")
98 return texture[pos+1:]
99 textures=[get_texture_name(path)
100 for path in bl.material.eachEnalbeTexturePath(m)]
103 model.materials.append(pmd.Material(
105 common.RGB(m.diffuse_color[0], m.diffuse_color[1], m.diffuse_color[2]),
108 0 if m.specular_toon_size<1e-5 else m.specular_hardness*10,
110 common.RGB(m.specular_color[0], m.specular_color[1], m.specular_color[2]),
112 common.RGB(m.mirror_color[0], m.mirror_color[1], m.mirror_color[2]),
114 1 if m.subsurface_scattering.use else 0,
120 ('*'.join(textures) if len(textures)>0 else "").encode('cp932')
124 assert(i<vertexCount)
125 for i in range(0, len(indices), 3):
127 model.indices.append(indices[i])
128 model.indices.append(indices[i+1])
129 model.indices.append(indices[i+2])
132 for i, m in enumerate(self.oneSkinMesh.morphList):
133 v=englishmap.getUnicodeSkinName(m.name)
135 v=[m.name, m.name, 0]
138 morph=pmd.Morph(v[1].encode("cp932"))
139 morph.english_name=m.name.encode("cp932")
142 for index, offset in m.offsets:
143 # convert right-handed z-up to left-handed y-up
144 morph.append(index, offset[0], offset[2], offset[1])
145 morph.vertex_count=len(m.offsets)
149 for i, m in enumerate(self.oneSkinMesh.morphList):
151 model.morph_indices.append(i)
152 for i, m in enumerate(self.oneSkinMesh.morphList):
154 model.morph_indices.append(i)
155 for i, m in enumerate(self.oneSkinMesh.morphList):
157 model.morph_indices.append(i)
158 for i, m in enumerate(self.oneSkinMesh.morphList):
160 model.morph_indices.append(i)
163 for g in self.skeleton.bone_groups:
164 name=englishmap.getUnicodeBoneGroupName(g[0])
169 model.bone_group_list.append(pmd.BoneGroup(
170 (name+'\n').encode('cp932'),
171 (englishName+'\n').encode('cp932')
175 for i, b in enumerate(self.skeleton.bones):
180 model.bone_display_list.append((i, self.skeleton.getBoneGroup(b)))
183 model.english_name=self.englishName.encode('cp932')
184 model.english_comment=self.englishComment.encode('cp932')
188 for o in bl.object.each():
190 if o.name.startswith(bl.TOON_TEXTURE_OBJECT):
196 toonMesh=bl.object.getData(toonMeshObject)
197 toonMaterial=bl.mesh.getMaterial(toonMesh, 0)
199 t=bl.material.getTexture(toonMaterial, i)
201 model.toon_textures[i]=("%s" % t.name).encode('cp932')
203 model.toon_textures[i]=("toon%02d.bmp" % (i+1)).encode('cp932')
206 model.toon_textures[i]=("toon%02d.bmp" % (i+1)).encode('cp932')
210 for i, obj in enumerate(self.oneSkinMesh.rigidbodies):
211 name=obj[bl.RIGID_NAME] if bl.RIGID_NAME in obj else obj.name
214 boneIndex=boneNameMap[obj[bl.RIGID_BONE_NAME]]
217 bone=self.skeleton.bones[0]
219 bone=self.skeleton.bones[boneIndex]
220 if obj[bl.RIGID_SHAPE_TYPE]==0:
221 shape_type=pmd.SHAPE_SPHERE
222 shape_size=common.Vector3(obj.scale[0], 0, 0)
223 elif obj[bl.RIGID_SHAPE_TYPE]==1:
224 shape_type=pmd.SHAPE_BOX
225 shape_size=common.Vector3(obj.scale[0], obj.scale[1], obj.scale[2])
226 elif obj[bl.RIGID_SHAPE_TYPE]==2:
227 shape_type=pmd.SHAPE_CAPSULE
228 shape_size=common.Vector3(obj.scale[0], obj.scale[2], 0)
229 rigidBody=pmd.RigidBody(
230 name.encode('cp932'),
231 collision_group=obj[bl.RIGID_GROUP],
232 no_collision_group=obj[bl.RIGID_INTERSECTION_GROUP],
233 bone_index=boneIndex,
234 shape_position=common.Vector3(
235 obj.location.x-bone.pos[0],
236 obj.location.z-bone.pos[2],
237 obj.location.y-bone.pos[1]),
238 shape_rotation=common.Vector3(
239 -obj.rotation_euler[0],
240 -obj.rotation_euler[2],
241 -obj.rotation_euler[1]),
242 shape_type=shape_type,
243 shape_size=shape_size,
244 mass=obj[bl.RIGID_WEIGHT],
245 linear_damping=obj[bl.RIGID_LINEAR_DAMPING],
246 angular_damping=obj[bl.RIGID_ANGULAR_DAMPING],
247 restitution=obj[bl.RIGID_RESTITUTION],
248 friction=obj[bl.RIGID_FRICTION],
249 mode=obj[bl.RIGID_PROCESS_TYPE]
251 model.rigidbodies.append(rigidBody)
254 model.joints=[pmd.Joint(
255 name=obj[bl.CONSTRAINT_NAME].encode('cp932'),
256 rigidbody_index_a=rigidNameMap[obj[bl.CONSTRAINT_A]],
257 rigidbody_index_b=rigidNameMap[obj[bl.CONSTRAINT_B]],
258 position=common.Vector3(
262 rotation=common.Vector3(
263 -obj.rotation_euler[0],
264 -obj.rotation_euler[2],
265 -obj.rotation_euler[1]),
266 translation_limit_min=common.Vector3(
267 obj[bl.CONSTRAINT_POS_MIN][0],
268 obj[bl.CONSTRAINT_POS_MIN][1],
269 obj[bl.CONSTRAINT_POS_MIN][2]
271 translation_limit_max=common.Vector3(
272 obj[bl.CONSTRAINT_POS_MAX][0],
273 obj[bl.CONSTRAINT_POS_MAX][1],
274 obj[bl.CONSTRAINT_POS_MAX][2]
276 rotation_limit_min=common.Vector3(
277 obj[bl.CONSTRAINT_ROT_MIN][0],
278 obj[bl.CONSTRAINT_ROT_MIN][1],
279 obj[bl.CONSTRAINT_ROT_MIN][2]),
280 rotation_limit_max=common.Vector3(
281 obj[bl.CONSTRAINT_ROT_MAX][0],
282 obj[bl.CONSTRAINT_ROT_MAX][1],
283 obj[bl.CONSTRAINT_ROT_MAX][2]),
284 spring_constant_translation=common.Vector3(
285 obj[bl.CONSTRAINT_SPRING_POS][0],
286 obj[bl.CONSTRAINT_SPRING_POS][1],
287 obj[bl.CONSTRAINT_SPRING_POS][2]),
288 spring_constant_rotation=common.Vector3(
289 obj[bl.CONSTRAINT_SPRING_ROT][0],
290 obj[bl.CONSTRAINT_SPRING_ROT][1],
291 obj[bl.CONSTRAINT_SPRING_ROT][2])
293 for obj in self.oneSkinMesh.constraints]
296 bl.message('write: %s' % path)
297 return writer.write(io.open(path, 'wb'), model)
300 def _execute(filepath):
301 active=bl.object.getActive()
303 print("abort. no active object.")
306 exporter=oneskinmesh.Exporter()
309 model=create_pmx(exporter)
310 bl.object.activate(active)
311 with io.open(filepath, 'wb') as f:
312 writer.write(f, model)