1 #!/usr/bin/env python
\r
7 PMDEditor's Lib/PMX仕様/PMX仕様.txt
\r
9 __author__="ousttrue"
\r
11 __versioon__="1.0.0"
\r
17 from pymeshio import common
\r
30 def __init__(self, target_index, loop, limit_radian):
\r
31 self.target_index=target_index
\r
33 self.limit_radian=limit_radian
\r
37 class IkLink(object):
\r
46 def __init__(self, bone_index, limit_angle):
\r
47 self.bone_index=bone_index
\r
48 self.limit_angle=limit_angle
\r
85 self.english_name=english_name
\r
86 self.position=position
\r
87 self.parent_index=parent_index
\r
91 def getConnectionFlag(self):
\r
92 return self.flag & 0x0001
\r
94 def getIkFlag(self):
\r
95 return (self.flag & 0x0020) >> 5
\r
97 def getRotationFlag(self):
\r
98 return (self.flag & 0x0100) >> 8
\r
100 def getTranslationFlag(self):
\r
101 return (self.flag & 0x0200) >> 9
\r
103 def getFixedAxisFlag(self):
\r
104 return (self.flag & 0x0400) >> 10
\r
106 def getLocalCoordinateFlag(self):
\r
107 return (self.flag & 0x0800) >> 11
\r
109 def getExternalParentDeformFlag(self):
\r
110 return (self.flag & 0x2000) >> 13
\r
113 class Material(object):
\r
116 Attributes: see __init__
\r
130 'sphia_texture_index',
\r
132 'toon_sharing_flag',
\r
133 'toon_texture_index',
\r
149 sphia_texture_index,
\r
154 self.english_name=english_name
\r
155 self.diffuse_color=diffuse_color
\r
156 self.diffuse_alpha=diffuse_alpha
\r
157 self.specular_color=specular_color
\r
158 self.specular_factor=specular_factor
\r
159 self.ambient_color=ambient_color
\r
161 self.edge_color=edge_color
\r
162 self.edge_size=edge_size
\r
163 self.texture_index=texture_index
\r
164 self.sphia_texture_index=sphia_texture_index
\r
165 self.sphia_mode=sphia_mode
\r
166 self.toon_sharing_flag=toon_sharing_flag
\r
168 self.toon_texture_index=None
\r
170 self.vertex_count=0
\r
173 return ("<pmx.Material {name}>".format(
\r
174 name=self.english_name
\r
178 class Deform(object):
\r
182 class Bdef1(object):
\r
183 """bone deform. use a weight
\r
185 Attributes: see __init__
\r
187 __slots__=[ 'index0']
\r
188 def __init__(self, index0):
\r
192 class Bdef2(object):
\r
193 """bone deform. use two weights
\r
195 Attributes: see __init__
\r
197 __slots__=[ 'index0', 'index1', 'weight0']
\r
198 def __init__(self,
\r
204 self.weight0=weight0
\r
207 class Vertex(object):
\r
210 Attributes: see __init__
\r
212 __slots__=[ 'position', 'normal', 'uv', 'deform', 'edge_factor' ]
\r
213 def __init__(self,
\r
219 self.position=position
\r
223 self.edge_factor=edge_factor
\r
226 class Morph(object):
\r
243 def __init__(self, name, english_name, panel, morph_type):
\r
245 self.english_name=english_name
\r
247 self.morph_type=morph_type
\r
251 class VerexMorphOffset(object):
\r
252 """pmx vertex morph offset
\r
256 position_offset: Vector3
\r
262 def __init__(self, vertex_index, position_offset):
\r
263 self.vertex_index=vertex_index
\r
264 self.position_offset=position_offset
\r
267 class DisplaySlot(object):
\r
268 """pmx display slot
\r
274 refrences: list of (ref_type, ref_index)
\r
282 def __init__(self, name, english_name, special_flag):
\r
284 self.english_name=english_name
\r
285 self.special_flag=special_flag
\r
289 class Shape(object):
\r
293 class SphereShape(Shape):
\r
294 __slots__=['radius']
\r
295 def __init__(self, radius):
\r
299 class CapsuleShape(Shape):
\r
300 __slots__=['short_radius', 'long_radius']
\r
301 def __init__(self, short_radius, long_radius):
\r
302 self.short_radius=short_radius
\r
303 self.long_radius=long_radius
\r
306 class BoxShape(Shape):
\r
307 __slots__=['x', 'y', 'z']
\r
308 def __init__(self, x, y, z):
\r
314 class RigidBodyParam(object):
\r
315 """pmx rigidbody param(for bullet)
\r
331 def __init__(self, mass,
\r
332 linear_damping, angular_damping, restitution, friction):
\r
334 self.linear_damping=linear_damping
\r
335 self.angular_damping=angular_damping
\r
336 self.restitution=restitution
\r
337 self.friction=friction
\r
340 class RigidBody(object):
\r
348 no_collision_group:
\r
358 'no_collision_group',
\r
368 no_collision_group,
\r
381 self.english_name=english_name
\r
382 self.bone_index=bone_index
\r
383 self.collision_group=collision_group
\r
384 self.no_collision_group=no_collision_group
\r
386 self.shape=SphereShape(shape_size.x)
\r
387 elif shape_type==1:
\r
388 self.shape=BoxShape(shape_size.x, shape_size.y, shape_size.z)
\r
389 elif shape_type==2:
\r
390 self.shape=CapsuleShape(shape_size.x, shape_size.y)
\r
392 raise pymeshio.common.ParseException(
\r
393 "unknown shape_type: {0}".format(shape_type))
\r
394 self.param=RigidBodyParam(mass,
\r
395 linear_damping, angular_damping,
\r
396 restitution, friction)
\r
400 class Joint(object):
\r
411 translation_limit_min: Vector3
\r
412 translation_limit_max: Vector3
\r
413 rotation_limit_min: Vector3
\r
414 rotation_limit_max: Vector3
\r
415 spring_constant_translation: Vector3
\r
416 spring_constant_rotation: Vector3
\r
422 'rigidbody_index_a',
\r
423 'rigidbody_index_b',
\r
426 'translation_limit_min',
\r
427 'translation_limit_max',
\r
428 'rotation_limit_min',
\r
429 'rotation_limit_max',
\r
430 'spring_constant_translation',
\r
431 'spring_constant_rotation',
\r
433 def __init__(self, name, english_name,
\r
439 translation_limit_min,
\r
440 translation_limit_max,
\r
441 rotation_limit_min,
\r
442 rotation_limit_max,
\r
443 spring_constant_translation,
\r
444 spring_constant_rotation
\r
447 self.english_name=english_name
\r
448 self.joint_type=joint_type
\r
449 self.rigidbody_index_a=rigidbody_index_a
\r
450 self.rigidbody_index_b=rigidbody_index_b
\r
451 self.position=position
\r
452 self.rotation=rotation
\r
453 self.translation_limit_min=translation_limit_min
\r
454 self.translation_limit_max=translation_limit_max
\r
455 self.rotation_limit_min=rotation_limit_min
\r
456 self.rotation_limit_max=rotation_limit_max
\r
457 self.spring_constant_translation=spring_constant_translation
\r
458 self.spring_constant_rotation=spring_constant_rotation
\r
461 class Model(object):
\r
462 """pmx data representation
\r
465 version: pmx version(expected 2.0)
\r
480 'version', # pmx version
\r
481 'name', # model name
\r
482 'english_name', # model name in english
\r
483 'comment', # model comment
\r
484 'english_comment', # model comment in english
\r
495 def __init__(self, version):
\r
496 self.version=version
\r
498 self.english_name=''
\r
500 self.english_comment=''
\r
506 self.rigidbodies=[]
\r
510 return ('<pmx-{version} "{name}" {vertices}vertices>'.format(
\r
511 version=self.version,
\r
512 name=self.english_name,
\r
513 vertices=len(self.vertices)
\r