--- /dev/null
+#!/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