OSDN Git Service

implement pmdbuilder
[meshio/pymeshio.git] / examples / opengl / vertexarray.py
1 #!/usr/bin/python\r
2 # coding: utf-8\r
3 \r
4 from OpenGL.GL import *\r
5 \r
6 '''\r
7 頂点配列\r
8 \r
9 ====\r
10 属性\r
11 ====\r
12 * 位置\r
13 '''\r
14 class VertexArray(object):\r
15     def __init__(self, vertices):\r
16         self.vertices=vertices\r
17 \r
18     def __str__(self):\r
19         return "<VertexArray %d>" % len(self.vertices)\r
20 \r
21     def draw(self):\r
22         # 位置属性\r
23         glEnableClientState(GL_VERTEX_ARRAY)\r
24         glVertexPointer(3, GL_FLOAT, 0, self.vertices)\r
25         # 描画\r
26         glDrawArrays(GL_TRIANGLES, 0, len(self.vertices))\r
27         # 後始末\r
28         glDisableClientState(GL_VERTEX_ARRAY)\r
29 \r
30 \r
31 \r
32 '''\r
33 頂点配列\r
34 \r
35 ====\r
36 属性\r
37 ====\r
38 * 位置\r
39 * UV\r
40 '''\r
41 class VertexArrayWithUV(object):\r
42     def __init__(self, vertices, uvarray):\r
43         self.vertices=vertices\r
44         self.uvarray=uvarray\r
45 \r
46     def __str__(self):\r
47         return "<VertexArrayWithUV %d>" % len(self.vertices)\r
48 \r
49     def draw(self):\r
50         # 位置属性\r
51         glEnableClientState(GL_VERTEX_ARRAY)\r
52         glVertexPointer(3, GL_FLOAT, 0, self.vertices)\r
53         # UV属性\r
54         glEnableClientState(GL_TEXTURE_COORD_ARRAY)\r
55         glTexCoordPointer(2, GL_FLOAT, 0, self.uvarray)\r
56         # 描画\r
57         triangle_count=int(len(self.vertices)/3)\r
58         glDrawArrays(GL_TRIANGLES, 0, triangle_count)\r
59         # 後始末\r
60         glDisableClientState(GL_TEXTURE_COORD_ARRAY)\r
61         glDisableClientState(GL_VERTEX_ARRAY)\r
62 \r
63 \r
64 '''\r
65 インデックス参照頂点配列\r
66 \r
67 ====\r
68 属性\r
69 ====\r
70 * 位置\r
71 * UV\r
72 '''\r
73 class IndexedVertexArray(object):\r
74     def __init__(self):\r
75         # vertices\r
76         self.vertices=[]\r
77         self.normal=[]\r
78         self.colors=[]\r
79         self.uvlist=[]\r
80         self.b0=[]\r
81         self.b1=[]\r
82         self.w0=[]\r
83         # indices\r
84         self.materials=[]\r
85         self.indicesMap={}\r
86 \r
87     def addVertex(self, pos, normal, color, uv, b0, b1, w0):\r
88         self.vertices+=pos\r
89         self.normal+=normal\r
90         self.colors+=color\r
91         self.uvlist+=uv\r
92         self.b0.append(b0)\r
93         self.b1.append(b1)\r
94         self.w0.append(w0)\r
95 \r
96     def addMaterial(self, material):\r
97         self.materials.append(material)\r
98         indices=[]\r
99         self.indicesMap[material]=indices\r
100         return indices\r
101 \r
102     def draw(self):\r
103         # 位置属性\r
104         glEnableClientState(GL_VERTEX_ARRAY)\r
105         glVertexPointer(4, GL_FLOAT, 0, self.vertices)\r
106         # マテリアル毎の描画\r
107         for m in self.materials:\r
108             # 順序維持\r
109             indices=self.indicesMap[m]\r
110             # indexによる描画\r
111             glDrawElements(GL_TRIANGLES, len(indices), GL_UNSIGNED_INT, indices)\r
112         # 後始末\r
113         glDisableClientState(GL_VERTEX_ARRAY)\r
114 \r
115     def optimize(self):\r
116         pass\r
117         #for v in self.vertexArrayMap.values():\r
118         #    v.vertices=numpy.array(v.vertices, 'f') \r
119 \r