OSDN Git Service

fix import_mqo.py
[meshio/pymeshio.git] / examples / opengl / vertexarraymap.py
1 #!/usr/bin/python
2 # coding: utf-8
3
4 import numpy
5 from . import vertexarray
6
7
8 '''
9 頂点配列をマテリアル毎に分別する
10 '''
11 class VertexArrayMap(object):
12     def __init__(self, materials):
13         self.materials=materials
14         self.vertexArrayMap={}
15
16     def getVertexArray(self, material_index):
17         material=self.materials[material_index]
18         if not material in self.vertexArrayMap:
19             vertexArray=vertexarray.VertexArray([])
20             self.vertexArrayMap[material]=vertexArray
21         return self.vertexArrayMap[material]
22
23     def addTriangle(self, material_index, v0, v1, v2):
24         vertexArray=self.getVertexArray(material_index)
25         vertexArray.vertices.append(v0.x)
26         vertexArray.vertices.append(v0.y)
27         vertexArray.vertices.append(v0.z)
28         vertexArray.vertices.append(v1.x)
29         vertexArray.vertices.append(v1.y)
30         vertexArray.vertices.append(v1.z)
31         vertexArray.vertices.append(v2.x)
32         vertexArray.vertices.append(v2.y)
33         vertexArray.vertices.append(v2.z)
34
35     def draw(self):
36         for m, vertexArray in self.vertexArrayMap.items():
37             m.begin()
38             vertexArray.draw()
39             m.end()
40
41     def optimize(self):
42         for v in self.vertexArrayMap.values():
43             v.vertices=numpy.array(v.vertices, 'f') 
44
45 '''
46 頂点配列をマテリアル毎に分別する(UV付き)
47 '''
48 class VertexArrayMapWithUV(object):
49     def __init__(self):
50         self.materials=[]
51         self.vertexArrayWithUVMap={}
52
53     def addMaterial(self, material):
54         self.materials.append(material)
55         self.vertexArrayWithUVMap[material]=vertexarray.VertexArrayWithUV([], [])
56
57     def getVertexArray(self, material_index):
58         material=self.materials[material_index]
59         return self.vertexArrayWithUVMap[material]
60
61     def addTriangle(self, material_index, v0, v1, v2, uv0, uv1, uv2):
62         vertexArray=self.getVertexArray(material_index)
63         vertexArray.vertices.append(v0.x)
64         vertexArray.vertices.append(v0.y)
65         vertexArray.vertices.append(v0.z)
66         vertexArray.vertices.append(v1.x)
67         vertexArray.vertices.append(v1.y)
68         vertexArray.vertices.append(v1.z)
69         vertexArray.vertices.append(v2.x)
70         vertexArray.vertices.append(v2.y)
71         vertexArray.vertices.append(v2.z)
72         vertexArray.uvarray.append(uv0.x)
73         vertexArray.uvarray.append(uv0.y)
74         vertexArray.uvarray.append(uv1.x)
75         vertexArray.uvarray.append(uv1.y)
76         vertexArray.uvarray.append(uv2.x)
77         vertexArray.uvarray.append(uv2.y)
78
79     def draw(self):
80         for m, vertexArray in self.vertexArrayWithUVMap.items():
81             m.begin()
82             vertexArray.draw()
83             m.end()
84
85     def optimize(self):
86         for v in self.vertexArrayWithUVMap.values():
87             v.vertices=numpy.array(v.vertices, 'f') 
88             v.uvarray=numpy.array(v.uvarray, 'f') 
89
90     def onInitialize(self):
91         #[m.onInitialize() for m in self.materials]
92         pass
93
94     def get_boundingbox(self):
95         if len(self.vertexArrayWithUVMap)==0:
96             return ([0, 0, 0], [0, 0, 0])
97
98         gen=iter(self.vertexArrayWithUVMap.values())
99         (min_v, max_v)=next(gen).get_boundingbox()
100         for va in gen:
101             (va_min_v, va_max_v)=va.get_boundingbox()
102             min_v[0]=min(min_v[0], va_min_v[0]) 
103             min_v[1]=min(min_v[1], va_min_v[1]) 
104             min_v[2]=min(min_v[2], va_min_v[2]) 
105             max_v[0]=max(max_v[0], va_max_v[0]) 
106             max_v[1]=max(max_v[1], va_max_v[1]) 
107             max_v[2]=max(max_v[2], va_max_v[2]) 
108         return (min_v, max_v)