1
class MeshData(object):
2
def __init__(self, **kwargs):
3
self.name = kwargs.get("name")
5
(b'v_pos', 3, 'float'),
6
(b'v_normal', 3, 'float'),
7
(b'v_tc0', 2, 'float')]
11
def calculate_normals(self):
12
for i in range(len(self.indices) / (3)):
14
v1i = self.indices[fi]
15
v2i = self.indices[fi + 1]
16
v3i = self.indices[fi + 2]
19
p1 = [vs[v1i + c] for c in range(3)]
20
p2 = [vs[v2i + c] for c in range(3)]
21
p3 = [vs[v3i + c] for c in range(3)]
23
u, v = [0, 0, 0], [0, 0, 0]
29
n[0] = u[1] * v[2] - u[2] * v[1]
30
n[1] = u[2] * v[0] - u[0] * v[2]
31
n[2] = u[0] * v[1] - u[1] * v[0]
34
self.vertices[v1i + 3 + k] = n[k]
35
self.vertices[v2i + 3 + k] = n[k]
36
self.vertices[v3i + 3 + k] = n[k]
40
def finish_object(self):
41
if self._current_object is None:
51
#get normal components
54
n = self.normals[norms[i] - 1]
56
#get texture coordinate components
59
t = self.texcoords[tcs[i] - 1]
61
#get vertex components
62
v = self.vertices[verts[i] - 1]
64
data = [v[0], v[1], v[2], n[0], n[1], n[2], t[0], t[1]]
65
mesh.vertices.extend(data)
67
tri = [idx, idx + 1, idx + 2]
68
mesh.indices.extend(tri)
71
self.objects[self._current_object] = mesh
72
#mesh.calculate_normals()
75
def __init__(self, filename, swapyz=False):
76
"""Loads a Wavefront OBJ file. """
83
self._current_object = None
86
for line in open(filename, "r"):
87
if line.startswith('#'):
89
if line.startswith('s'):
96
self._current_object = values[1]
97
#elif values[0] == 'mtllib':
98
# self.mtl = MTL(values[1])
99
#elif values[0] in ('usemtl', 'usemat'):
100
# material = values[1]
102
v = list(map(float, values[1:4]))
105
self.vertices.append(v)
106
elif values[0] == 'vn':
107
v = list(map(float, values[1:4]))
110
self.normals.append(v)
111
elif values[0] == 'vt':
112
self.texcoords.append(map(float, values[1:3]))
113
elif values[0] == 'f':
119
face.append(int(w[0]))
120
if len(w) >= 2 and len(w[1]) > 0:
121
texcoords.append(int(w[1]))
124
if len(w) >= 3 and len(w[2]) > 0:
125
norms.append(int(w[2]))
128
self.faces.append((face, norms, texcoords, material))
136
for line in open(filename, "r"):
137
if line.startswith('#'):
139
values = line.split()
142
if values[0] == 'newmtl':
143
mtl = contents[values[1]] = {}
145
raise ValueError("mtl file doesn't start with newmtl stmt")
146
mtl[values[0]] = values[1:]