self.refrences=[]\r
\r
\r
+class Shape(object):\r
+ pass\r
+\r
+\r
+class SphereShape(Shape):\r
+ __slots__=['radius']\r
+ def __init__(self, radius):\r
+ self.radius=radius\r
+\r
+\r
+class CapsuleShape(Shape):\r
+ __slots__=['short_radius', 'long_radius']\r
+ def __init__(self, short_radius, long_radius): \r
+ self.short_radius=short_radius\r
+ self.long_radius=long_radius\r
+\r
+\r
+class BoxShape(Shape):\r
+ __slots__=['x', 'y', 'z']\r
+ def __init__(self, x, y, z):\r
+ self.x=x\r
+ self.y=y\r
+ self.z=z\r
+\r
+\r
+class RigidBodyParam(object):\r
+ """pmx rigidbody param(for bullet)\r
+\r
+ Attributes:\r
+ mass:\r
+ linear_damping:\r
+ angular_damping:\r
+ restitution:\r
+ friction:\r
+ """\r
+ __slots__=[\r
+ 'mass',\r
+ 'linear_damping',\r
+ 'angular_damping',\r
+ 'restitution',\r
+ 'friction',\r
+ ]\r
+ def __init__(self, mass, \r
+ linear_damping, angular_damping, restitution, friction):\r
+ self.mass=mass\r
+ self.linear_damping=linear_damping\r
+ self.angular_damping=angular_damping\r
+ self.restitution=restitution\r
+ self.friction=friction\r
+\r
+class RigidBody(object):\r
+ """pmx rigidbody\r
+\r
+ Attributes:\r
+ name: \r
+ english_name: \r
+ bone_index:\r
+ collision_group:\r
+ no_collision_flag:\r
+ shape:\r
+ param:\r
+ mode:\r
+ """\r
+ __slots__=[\r
+ 'name',\r
+ 'english_name',\r
+ 'bone_index',\r
+ 'collision_group',\r
+ 'no_collision_flag',\r
+ 'shape',\r
+ 'param',\r
+ 'mode',\r
+ ]\r
+ def __init__(self,\r
+ name,\r
+ english_name,\r
+ bone_index,\r
+ collision_group,\r
+ no_collision_flag,\r
+ shape_type,\r
+ shape_size,\r
+ shape_position,\r
+ shape_rotation,\r
+ mass,\r
+ linear_damping,\r
+ angular_damping,\r
+ restitution,\r
+ friction,\r
+ mode\r
+ ):\r
+ self.name=name\r
+ self.english_name=english_name\r
+ self.bone_index=bone_index\r
+ self.collision_group=collision_group\r
+ self.no_collision_flag=no_collision_flag\r
+ if shape_type==0:\r
+ self.shape=SphereShape(shape_size.x)\r
+ elif shape_type==1:\r
+ self.shape=BoxShape(shape_size.x, shape_size.y, shape_size.z)\r
+ elif shape_type==2:\r
+ self.shape=CapsuleShape(shape_size.x, shape_size.y)\r
+ else:\r
+ raise pymeshio.common.ParseException(\r
+ "unknown shape_type: {0}".format(shape_type))\r
+ self.param=RigidBodyParam(mass,\r
+ linear_damping, angular_damping,\r
+ restitution, friction)\r
+ self.mode=mode\r
+\r
+\r
class Model(object):\r
"""pmx data representation\r
\r
bones:\r
morph:\r
display_slots:\r
+ rigidbodies:\r
"""\r
__slots__=[\r
'version', # pmx version\r
'bones',\r
'morphs',\r
'display_slots',\r
+ 'rigidbodies',\r
]\r
def __init__(self, version):\r
self.version=version\r
self.textures=[]\r
self.materials=[]\r
self.bones=[]\r
+ self.rigidbodies=[]\r
\r
raise pymeshio.common.ParseException(\r
"unknown display_type: {0}".format(display_type))\r
\r
+ def read_rigidbody(self):\r
+ return pymeshio.pmx.RigidBody(\r
+ name=self.read_text(), \r
+ english_name=self.read_text(),\r
+ bone_index=self.read_bone_index(),\r
+ collision_group=self.read_uint(1),\r
+ no_collision_flag=self.read_uint(2),\r
+ shape_type=self.read_uint(1),\r
+ shape_size=self.read_vector3(),\r
+ shape_position=self.read_vector3(),\r
+ shape_rotation=self.read_vector3(),\r
+ mass=self.read_float(),\r
+ linear_damping=self.read_float(),\r
+ angular_damping=self.read_float(),\r
+ restitution=self.read_float(),\r
+ friction=self.read_float(),\r
+ mode=self.read_uint(1)\r
+ )\r
+\r
\r
def load(path: str) -> pymeshio.pmx.Model:\r
# general binary loader\r
model.english_comment = loader.read_text()\r
\r
# model data\r
- vertex_count=loader.read_uint(4)\r
model.vertices=[loader.read_vertex() \r
- for _ in range(vertex_count)]\r
-\r
- index_count=loader.read_uint(4)\r
+ for _ in range(loader.read_uint(4))]\r
model.indices=[loader.read_vertex_index() \r
- for _ in range(index_count)]\r
-\r
- texture_count=loader.read_uint(4)\r
+ for _ in range(loader.read_uint(4))]\r
model.textures=[loader.read_text() \r
- for _ in range(texture_count)]\r
-\r
- material_count=loader.read_uint(4)\r
+ for _ in range(loader.read_uint(4))]\r
model.materials=[loader.read_material() \r
- for _ in range(material_count)]\r
-\r
- bone_count=loader.read_uint(4)\r
+ for _ in range(loader.read_uint(4))]\r
model.bones=[loader.read_bone() \r
- for _ in range(bone_count)]\r
-\r
- morph_count=loader.read_uint(4)\r
+ for _ in range(loader.read_uint(4))]\r
model.morphs=[loader.read_morgh() \r
- for _ in range(morph_count)]\r
-\r
- display_slot_count=loader.read_uint(4)\r
+ for _ in range(loader.read_uint(4))]\r
model.display_slots=[loader.read_display_slot() \r
- for _ in range(display_slot_count)]\r
+ for _ in range(loader.read_uint(4))]\r
+ model.rigidbodies=[loader.read_rigidbody()\r
+ for _ in range(loader.read_uint(4))]\r
\r
return model\r
\r