-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMesh.py
More file actions
100 lines (97 loc) · 2.12 KB
/
Mesh.py
File metadata and controls
100 lines (97 loc) · 2.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
from OpenGL.GL import *
class Vertex(object):
def __init__(self):
self._x = 0.0
self._y = 0.0
self._z = 0.0
self._nx = 0.0
self._ny = 0.0
self._nz = 0.0
self._s = 0.0
self._t = 0.0
self._hasCoords = False
self._hasNormals = False
self._hasST = False
def setX(self, x):
self._hasCoords = True
self._x = x
def setY(self, y):
self._hasCoords = True
self._y = y
def setZ(self, z):
self._hasCoords = True
self._z = z
def coords(self):
return (self._x, self._y, self._z)
def setNX(self, nx):
self._hasNormal = True
self._nx = nx
def setNY(self, ny):
self._hasNormal = True
self._ny = ny
def setNZ(self, nz):
self._hasNormal = True
self._nz = nz
def normal(self):
return (self._nx, self._ny, self._nz)
def setS(self, s):
self._hasST = True
self._s = s
def setT(self, t):
self._hasST = True
self._t = t
def stcoords(self):
return (self._s, self._t)
def hasCoords(self):
return self._hasCoords
def hasNormal(self):
return self._hasNormal
def hasST(self):
return self._hasST
class Face(object):
def __init__(self):
self._vertices = []
def set(self, l):
self._vertices = l
def vertices(self):
return self._vertices
class Mesh(object):
def __init__(self):
self.vertices = []
self.faces = []
def addVertex(self, v):
self.vertices.append(v)
def getVertex(self, vi):
return self.vertices[vi]
def addFace(self, f):
self.faces.append(f)
def draw(self):
mode = None
for face in self.faces:
numvertices = len(face.vertices())
if numvertices == 3 and mode != GL_TRIANGLES:
if mode:
glEnd()
glBegin(GL_TRIANGLES)
mode = GL_TRIANGLES
elif numvertices == 4 and mode != GL_QUADS:
if mode:
glEnd()
glBegin(GL_QUADS)
mode = GL_QUADS
elif numvertices > 4:
if mode:
glEnd()
glBegin(GL_POLYGON)
mode = GL_POLYGON
elif numvertices < 3:
raise RuntimeError('Face has <3 vertices')
for vertex in [self.getVertex(i) for i in face.vertices()]:
if vertex.hasNormal():
glNormal3f(*(vertex.normal()))
glVertex3f(*(vertex.coords()))
if mode == GL_POLYGON:
glEnd()
mode = None
if mode:
glEnd()