79 lines
2.7 KiB
Python
79 lines
2.7 KiB
Python
import struct
|
|
import vec3
|
|
|
|
vertex_table = [
|
|
((-1.0, 1.0, -1.0), (0.0, 1.0, 0.0), (1.0, 0.0)),
|
|
((1.0, 1.0, 1.0), (0.0, 1.0, 0.0), (0.0, 1.0)),
|
|
((1.0, 1.0, -1.0), (0.0, 1.0, 0.0), (0.0, 0.0)),
|
|
((1.0, 1.0, 1.0), (0.0, 0.0, 1.0), (1.0, 1.0)),
|
|
((-1.0, -1.0, 1.0), (0.0, 0.0, 1.0), (0.0, 0.0)),
|
|
((1.0, -1.0, 1.0), (0.0, 0.0, 1.0), (1.0, 0.0)),
|
|
((-1.0, 1.0, 1.0), (-1.0, 0.0, 0.0), (1.0, 1.0)),
|
|
((-1.0, -1.0, -1.0), (-1.0, 0.0, 0.0), (0.0, 0.0)),
|
|
((-1.0, -1.0, 1.0), (-1.0, 0.0, 0.0), (1.0, 0.0)),
|
|
((1.0, -1.0, -1.0), (0.0, -1.0, 0.0), (1.0, 0.0)),
|
|
((-1.0, -1.0, 1.0), (0.0, -1.0, 0.0), (0.0, 1.0)),
|
|
((-1.0, -1.0, -1.0), (0.0, -1.0, 0.0), (0.0, 0.0)),
|
|
((1.0, 1.0, -1.0), (1.0, 0.0, 0.0), (1.0, 1.0)),
|
|
((1.0, -1.0, 1.0), (1.0, 0.0, 0.0), (0.0, 0.0)),
|
|
((1.0, -1.0, -1.0), (1.0, 0.0, 0.0), (1.0, 0.0)),
|
|
((-1.0, 1.0, -1.0), (0.0, 0.0, -1.0), (1.0, 1.0)),
|
|
((1.0, -1.0, -1.0), (0.0, 0.0, -1.0), (0.0, 0.0)),
|
|
((-1.0, -1.0, -1.0), (0.0, 0.0, -1.0), (1.0, 0.0)),
|
|
((-1.0, 1.0, 1.0), (0.0, 1.0, 0.0), (1.0, 1.0)),
|
|
((-1.0, 1.0, 1.0), (0.0, 0.0, 1.0), (0.0, 1.0)),
|
|
((-1.0, 1.0, -1.0), (-1.0, 0.0, 0.0), (0.0, 1.0)),
|
|
((1.0, -1.0, 1.0), (0.0, -1.0, 0.0), (1.0, 1.0)),
|
|
((1.0, 1.0, 1.0), (1.0, 0.0, 0.0), (0.0, 1.0)),
|
|
((1.0, 1.0, -1.0), (0.0, 0.0, -1.0), (0.0, 1.0))
|
|
]
|
|
|
|
faces_by_normal = {
|
|
(-1.0, 0.0, 0.0): [6, 7, 8, 6, 20, 7],
|
|
(0.0, -1.0, 0.0): [9, 10, 11, 9, 21, 10],
|
|
(0.0, 0.0, -1.0): [15, 16, 17, 15, 23, 16],
|
|
(0.0, 0.0, 1.0): [3, 4, 5, 3, 19, 4],
|
|
(0.0, 1.0, 0.0): [0, 1, 2, 0, 18, 1],
|
|
(1.0, 0.0, 0.0): [12, 13, 14, 12, 22, 13]
|
|
}
|
|
|
|
normals = [
|
|
(-1.0, 0.0, 0.0),
|
|
(0.0, -1.0, 0.0),
|
|
(0.0, 0.0, -1.0),
|
|
(0.0, 0.0, 1.0),
|
|
(0.0, 1.0, 0.0),
|
|
(1.0, 0.0, 0.0),
|
|
]
|
|
|
|
def build_configuration_index_buffers(f):
|
|
offset = 0
|
|
configuration_offsets = []
|
|
for configuration in range(64):
|
|
configuration_offsets.append(offset)
|
|
for i in range(6):
|
|
if (configuration & (1 << i)) == 0:
|
|
continue
|
|
normal = normals[i]
|
|
indices = faces_by_normal[normal]
|
|
for index in indices:
|
|
f.write(struct.pack("<B", index))
|
|
offset += 1
|
|
|
|
for i, offset in enumerate(configuration_offsets):
|
|
print(str(offset).rjust(4), end=", ")
|
|
if i % 8 == 7:
|
|
print()
|
|
|
|
def build_vertex_buffer(f):
|
|
for position, normal, texture in vertex_table:
|
|
position = vec3.mul(position, 0.5)
|
|
f.write(struct.pack("<eeeeeeee", *position, *normal, *texture))
|
|
|
|
if __name__ == "__main__":
|
|
with open("configuration.idx", "wb") as f:
|
|
build_configuration_index_buffers(f)
|
|
|
|
with open("per_vertex.vtx", "wb") as f:
|
|
build_vertex_buffer(f)
|