OSDN Git Service

remove blender25
[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.reader\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     t=time.time()\r
14     model=pymeshio.pmx.reader.read_from_file(path)\r
15     if not model:\r
16         return\r
17     print(time.time()-t, "sec")\r
18     # build\r
19     basedir=os.path.dirname(path)\r
20     indexedVertexArray=opengl.vertexarray.IndexedVertexArray()\r
21     for v in model.vertices:\r
22         # left-handed y-up to right-handed y-up                \r
23         if v.deform.__class__ is pymeshio.pmx.Bdef1:\r
24             indexedVertexArray.addVertex(\r
25                     (v.position[0], v.position[1], -v.position[2], 1), \r
26                     (v.normal[0], v.normal[1], -v.normal[2]), \r
27                     (v.uv[0], v.uv[1]), \r
28                     (1, 1, 1, 1),\r
29                     v.deform.index0, 0, 1.0)\r
30         elif v.deform.__class__ is pymeshio.pmx.Bdef2:\r
31             indexedVertexArray.addVertex(\r
32                     (v.position[0], v.position[1], -v.position[2], 1), \r
33                     (v.normal[0], v.normal[1], -v.normal[2]), \r
34                     (v.uv[0], v.uv[1]), \r
35                     (1, 1, 1, 1),\r
36                     v.deform.index0, v.deform.index1, v.deform.weight0)\r
37         else:\r
38             print("unknown deform: {0}".format(v.deform))\r
39     \r
40     # material\r
41     textureMap={}\r
42     faceIndex=0\r
43     def indices():\r
44         for i in model.indices:\r
45             yield i\r
46     indexGen=indices()\r
47     for i, m in enumerate(model.materials):\r
48         material=opengl.material.MQOMaterial()\r
49         material.vcol=True\r
50         material.rgba=(\r
51                 m.diffuse_color[0], \r
52                 m.diffuse_color[1], \r
53                 m.diffuse_color[2], \r
54                 m.alpha)\r
55         if m.texture_index!=255:\r
56             texturepath=os.path.join(basedir, model.textures[m.texture_index])\r
57             if os.path.isfile(texturepath):\r
58                 if not texturepath in textureMap:\r
59                     texture=opengl.texture.Texture(texturepath)\r
60                     textureMap[texturepath]=texture\r
61                 material.texture=textureMap[texturepath]\r
62         indices=indexedVertexArray.addMaterial(material)\r
63         indices+=[next(indexGen) for n in range(m.vertex_count)]\r
64     indexedVertexArray.optimize()\r
65     return indexedVertexArray\r
66 \r