OSDN Git Service

implemnet RigidBody
authorousttrue <ousttrue@gmail.com>
Fri, 30 Sep 2011 15:30:16 +0000 (00:30 +0900)
committerousttrue <ousttrue@gmail.com>
Fri, 30 Sep 2011 15:30:16 +0000 (00:30 +0900)
pymeshio/pmx/__init__.py
pymeshio/pmx/loader.py
test/pmx_test.py

index 54ce4f1..f267af1 100644 (file)
@@ -281,6 +281,116 @@ class DisplaySlot(object):
         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
@@ -296,6 +406,7 @@ class Model(object):
         bones:\r
         morph:\r
         display_slots:\r
+        rigidbodies:\r
     """\r
     __slots__=[\r
             'version', # pmx version\r
@@ -310,6 +421,7 @@ class Model(object):
             'bones',\r
             'morphs',\r
             'display_slots',\r
+            'rigidbodies',\r
             ]\r
     def __init__(self, version):\r
         self.version=version\r
@@ -322,4 +434,5 @@ class Model(object):
         self.textures=[]\r
         self.materials=[]\r
         self.bones=[]\r
+        self.rigidbodies=[]\r
 \r
index 742f329..b0a9549 100644 (file)
@@ -231,6 +231,25 @@ class Loader(pymeshio.common.BinaryLoader):
                 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
@@ -282,33 +301,22 @@ def load(path: str) -> pymeshio.pmx.Model:
     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
index 8fd04cf..c0402de 100644 (file)
@@ -33,3 +33,4 @@ def test_read():
     assert len(model.bones)==140\r
     assert len(model.morphs)==30\r
     assert len(model.display_slots)==9\r
+    assert len(model.rigidbodies)==45\r