OSDN Git Service

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

index f267af1..90caeb2 100644 (file)
@@ -331,6 +331,7 @@ class RigidBodyParam(object):
         self.restitution=restitution\r
         self.friction=friction\r
 \r
+\r
 class RigidBody(object):\r
     """pmx rigidbody\r
 \r
@@ -391,6 +392,67 @@ class RigidBody(object):
         self.mode=mode\r
 \r
 \r
+class Joint(object):\r
+    """pmx joint\r
+\r
+    Attributes:\r
+        name: \r
+        english_name: \r
+        joint_type:\r
+        rigidbody_index_a:\r
+        rigidbody_index_b:\r
+        position: Vector3\r
+        rotation: Vector3\r
+        translation_limit_min: Vector3\r
+        translation_limit_max: Vector3\r
+        rotation_limit_min: Vector3\r
+        rotation_limit_max: Vector3\r
+        spring_constant_translation: Vector3\r
+        spring_constant_rotation: Vector3\r
+    """\r
+    __slots__=[\r
+            'name',\r
+            'english_name',\r
+            'joint_type',\r
+            'rigidbody_index_a',\r
+            'rigidbody_index_b',\r
+            'position',\r
+            'rotation',\r
+            'translation_limit_min',\r
+            'translation_limit_max',\r
+            'rotation_limit_min',\r
+            'rotation_limit_max',\r
+            'spring_constant_translation',\r
+            'spring_constant_rotation',\r
+            ]\r
+    def __init__(self, name, english_name,\r
+            joint_type,\r
+            rigidbody_index_a,\r
+            rigidbody_index_b,\r
+            position,\r
+            rotation,\r
+            translation_limit_min,\r
+            translation_limit_max,\r
+            rotation_limit_min,\r
+            rotation_limit_max,\r
+            spring_constant_translation,\r
+            spring_constant_rotation\r
+            ):\r
+        self.name=name\r
+        self.english_name=english_name\r
+        self.joint_type=joint_type\r
+        self.rigidbody_index_a=rigidbody_index_a\r
+        self.rigidbody_index_b=rigidbody_index_b\r
+        self.position=position\r
+        self.rotation=rotation\r
+        self.translation_limit_min=translation_limit_min\r
+        self.translation_limit_max=translation_limit_max\r
+        self.rotation_limit_min=rotation_limit_min\r
+        self.rotation_limit_max=rotation_limit_max\r
+        self.spring_constant_translation=spring_constant_translation\r
+        self.spring_constant_rotation=spring_constant_rotation\r
+\r
+\r
 class Model(object):\r
     """pmx data representation\r
 \r
@@ -407,6 +469,7 @@ class Model(object):
         morph:\r
         display_slots:\r
         rigidbodies:\r
+        joints:\r
     """\r
     __slots__=[\r
             'version', # pmx version\r
@@ -422,6 +485,7 @@ class Model(object):
             'morphs',\r
             'display_slots',\r
             'rigidbodies',\r
+            'joints',\r
             ]\r
     def __init__(self, version):\r
         self.version=version\r
@@ -435,4 +499,5 @@ class Model(object):
         self.materials=[]\r
         self.bones=[]\r
         self.rigidbodies=[]\r
+        self.joints=[]\r
 \r
index b0a9549..033665a 100644 (file)
@@ -250,6 +250,22 @@ class Loader(pymeshio.common.BinaryLoader):
                 mode=self.read_uint(1)\r
                 )\r
 \r
+    def read_joint(self):\r
+        return pymeshio.pmx.Joint(\r
+                name=self.read_text(),\r
+                english_name=self.read_text(),\r
+                joint_type=self.read_uint(1),\r
+                rigidbody_index_a=self.read_rigidbody_index(),\r
+                rigidbody_index_b=self.read_rigidbody_index(),\r
+                position=self.read_vector3(),\r
+                rotation=self.read_vector3(),\r
+                translation_limit_min=self.read_vector3(),\r
+                translation_limit_max=self.read_vector3(),\r
+                rotation_limit_min=self.read_vector3(),\r
+                rotation_limit_max=self.read_vector3(),\r
+                spring_constant_translation=self.read_vector3(),\r
+                spring_constant_rotation=self.read_vector3())\r
+\r
 \r
 def load(path: str) -> pymeshio.pmx.Model:\r
     # general binary loader\r
@@ -317,6 +333,8 @@ def load(path: str) -> pymeshio.pmx.Model:
             for _ in range(loader.read_uint(4))]\r
     model.rigidbodies=[loader.read_rigidbody()\r
             for _ in range(loader.read_uint(4))]\r
+    model.joints=[loader.read_joint()\r
+            for _ in range(loader.read_uint(4))]\r
 \r
     return model\r
 \r
index c0402de..cf2fcdf 100644 (file)
@@ -28,9 +28,10 @@ def test_read():
 \r
     assert len(model.vertices)==12354\r
     assert len(model.indices)==22961 * 3\r
-    # texture\r
+    print("{0} textures".format(len(model.textures)))\r
     assert len(model.materials)==17\r
     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
+    assert len(model.joints)==27\r