OSDN Git Service

add pmxbuilder
[meshio/pymeshio.git] / examples / pmxbuilder.py
diff --git a/examples/pmxbuilder.py b/examples/pmxbuilder.py
new file mode 100644 (file)
index 0000000..76f39f4
--- /dev/null
@@ -0,0 +1,67 @@
+#!/usr/bin/env python\r
+# coding: utf-8\r
+\r
+import time\r
+import os\r
+import pymeshio.pmx.loader\r
+import opengl.material\r
+import opengl.texture\r
+import opengl.vertexarray\r
+\r
+\r
+def build(path):\r
+    # load scenee\r
+    t=time.time()\r
+    model=pymeshio.pmx.loader.load(path)\r
+    if not model:\r
+        return\r
+    print(time.time()-t, "sec")\r
+    # build\r
+    basedir=os.path.dirname(path)\r
+    indexedVertexArray=opengl.vertexarray.IndexedVertexArray()\r
+    for v in model.vertices:\r
+        # left-handed y-up to right-handed y-up                \r
+        if v.deform.__class__ is pymeshio.pmx.Bdef1:\r
+            indexedVertexArray.addVertex(\r
+                    (v.position[0], v.position[1], -v.position[2], 1), \r
+                    (v.normal[0], v.normal[1], -v.normal[2]), \r
+                    (v.uv[0], v.uv[1]), \r
+                    (1, 1, 1, 1),\r
+                    v.deform.index0, 0, 1.0)\r
+        elif v.deform.__class__ is pymeshio.pmx.Bdef2:\r
+            indexedVertexArray.addVertex(\r
+                    (v.position[0], v.position[1], -v.position[2], 1), \r
+                    (v.normal[0], v.normal[1], -v.normal[2]), \r
+                    (v.uv[0], v.uv[1]), \r
+                    (1, 1, 1, 1),\r
+                    v.deform.index0, v.deform.index1, v.deform.weight0)\r
+        else:\r
+            print("unknown deform: {0}".format(v.deform))\r
+    \r
+    # material\r
+    textureMap={}\r
+    faceIndex=0\r
+    def indices():\r
+        for i in model.indices:\r
+            yield i\r
+    indexGen=indices()\r
+    for i, m in enumerate(model.materials):\r
+        material=opengl.material.MQOMaterial()\r
+        material.vcol=True\r
+        material.rgba=(\r
+                m.diffuse_color[0], \r
+                m.diffuse_color[1], \r
+                m.diffuse_color[2], \r
+                m.diffuse_alpha)\r
+        if m.texture_index!=255:\r
+            texturepath=os.path.join(basedir, model.textures[m.texture_index])\r
+            if os.path.isfile(texturepath):\r
+                if not texturepath in textureMap:\r
+                    texture=opengl.texture.Texture(texturepath)\r
+                    textureMap[texturepath]=texture\r
+                material.texture=textureMap[texturepath]\r
+        indices=indexedVertexArray.addMaterial(material)\r
+        indices+=[next(indexGen) for n in range(m.vertex_count)]\r
+    indexedVertexArray.optimize()\r
+    return indexedVertexArray\r
+\r