26 lines
973 B
Python
26 lines
973 B
Python
from collections import defaultdict
|
|
import obj
|
|
|
|
def append_triangles(state, vertex_buffer, index_buffer, index_lookup):
|
|
for triangle in state.triangle:
|
|
for p_ix, t_ix, n_ix in triangle:
|
|
key = (p_ix, n_ix, t_ix)
|
|
if key not in index_lookup:
|
|
position = state.position[p_ix]
|
|
normal = state.normal[n_ix]
|
|
texture = state.texture[t_ix]
|
|
index = len(vertex_buffer)
|
|
index_lookup[key] = index
|
|
vertex_buffer.append((position, normal, texture))
|
|
index_buffer.append(index_lookup[key])
|
|
|
|
def build_faces_by_normal(vertex_buffer, index_buffer):
|
|
by_normal = defaultdict(list)
|
|
for i in range(len(index_buffer) // 3):
|
|
tri = [index_buffer[i * 3 + n] for n in range(3)]
|
|
s = set(vertex_buffer[j][1] for j in tri)
|
|
assert len(s) == 1, s
|
|
normal, = iter(s)
|
|
by_normal[normal].extend(tri)
|
|
return by_normal
|