OSDN Git Service

fix version
[meshio/pymeshio.git] / examples / pmxbuilder.py
1 #!/usr/bin/env python\r
2 # coding: utf-8\r
3 \r
4 import time\r
5 import os\r
6 import pymeshio.pmx.loader\r
7 import opengl.material\r
8 import opengl.texture\r
9 import opengl.vertexarray\r
10 \r
11 \r
12 def build(path):\r
13     # load scenee\r
14     t=time.time()\r
15     model=pymeshio.pmx.loader.load(path)\r
16     if not model:\r
17         return\r
18     print(time.time()-t, "sec")\r
19     # build\r
20     basedir=os.path.dirname(path)\r
21     indexedVertexArray=opengl.vertexarray.IndexedVertexArray()\r
22     for v in model.vertices:\r
23         # left-handed y-up to right-handed y-up                \r
24         if v.deform.__class__ is pymeshio.pmx.Bdef1:\r
25             indexedVertexArray.addVertex(\r
26                     (v.position[0], v.position[1], -v.position[2], 1), \r
27                     (v.normal[0], v.normal[1], -v.normal[2]), \r
28                     (v.uv[0], v.uv[1]), \r
29                     (1, 1, 1, 1),\r
30                     v.deform.index0, 0, 1.0)\r
31         elif v.deform.__class__ is pymeshio.pmx.Bdef2:\r
32             indexedVertexArray.addVertex(\r
33                     (v.position[0], v.position[1], -v.position[2], 1), \r
34                     (v.normal[0], v.normal[1], -v.normal[2]), \r
35                     (v.uv[0], v.uv[1]), \r
36                     (1, 1, 1, 1),\r
37                     v.deform.index0, v.deform.index1, v.deform.weight0)\r
38         else:\r
39             print("unknown deform: {0}".format(v.deform))\r
40     \r
41     # material\r
42     textureMap={}\r
43     faceIndex=0\r
44     def indices():\r
45         for i in model.indices:\r
46             yield i\r
47     indexGen=indices()\r
48     for i, m in enumerate(model.materials):\r
49         material=opengl.material.MQOMaterial()\r
50         material.vcol=True\r
51         material.rgba=(\r
52                 m.diffuse_color[0], \r
53                 m.diffuse_color[1], \r
54                 m.diffuse_color[2], \r
55                 m.diffuse_alpha)\r
56         if m.texture_index!=255:\r
57             texturepath=os.path.join(basedir, model.textures[m.texture_index])\r
58             if os.path.isfile(texturepath):\r
59                 if not texturepath in textureMap:\r
60                     texture=opengl.texture.Texture(texturepath)\r
61                     textureMap[texturepath]=texture\r
62                 material.texture=textureMap[texturepath]\r
63         indices=indexedVertexArray.addMaterial(material)\r
64         indices+=[next(indexGen) for n in range(m.vertex_count)]\r
65     indexedVertexArray.optimize()\r
66     return indexedVertexArray\r
67 \r