62 lines
2.1 KiB
Python
62 lines
2.1 KiB
Python
from generate import renderer
|
|
from obj import parse_obj_file
|
|
import sys
|
|
|
|
def generate_vec3(vs):
|
|
for v in vs:
|
|
yield f"{{{v.x}f, {v.y}f, {v.z}f}},"
|
|
|
|
def generate_vec2(vs):
|
|
for v in vs:
|
|
yield f"{{{v.x}f, {v.y}f}},"
|
|
|
|
def generate_vec(name, type, func, vs):
|
|
yield f"vertex_{type} {name}_{type}[] = {{"
|
|
yield from func(vs)
|
|
yield "};"
|
|
|
|
def filter_n(l, n):
|
|
for a in l:
|
|
if len(a.ptn) == n:
|
|
yield a
|
|
|
|
def generate_ptn(ptn):
|
|
for p in ptn:
|
|
yield f"{{{p.position}, {p.texture}, {p.normal}}},"
|
|
|
|
def generate_faces(group_name, model_name, faces, type, n):
|
|
yield f"union {type} {group_name}_{model_name}_triangles = {{"
|
|
for face in filter_n(faces, n):
|
|
yield "{ .v = {"
|
|
yield from generate_ptn(face.ptn)
|
|
yield "}},"
|
|
yield "};"
|
|
|
|
def generate_object(group_name, object):
|
|
yield f"struct object {group_name}_{object.name} = {{"
|
|
yield f".triangle = &{group_name}_{object.name}_triangle[0],"
|
|
yield f".quadrilateral = &{group_name}_{object.name}_quadrilateral[0],"
|
|
triangle_count = sum(1 for _ in filter_n(object.faces, 3))
|
|
quadrilateral_count = sum(1 for _ in filter_n(object.faces, 4))
|
|
yield f".triangle_count = {triangle_count},"
|
|
yield f".quadrilateral_count = {quadrilateral_count},"
|
|
yield ".material = 0,"
|
|
yield "};"
|
|
|
|
def generate_obj_file(group_name, obj_file):
|
|
yield from generate_vec(group_name, "position", generate_vec3, obj_file.position)
|
|
yield from generate_vec(group_name, "texture", generate_vec2, obj_file.texture)
|
|
yield from generate_vec(group_name, "normal", generate_vec3, obj_file.normal)
|
|
|
|
for object in obj_file.objects:
|
|
assert all(len(face.ptn) in {3, 4} for face in object.faces), object.name
|
|
yield from generate_faces(group_name, object.name, object.faces, "triangle", 3)
|
|
yield from generate_faces(group_name, object.name, object.faces, "quadrilateral", 4)
|
|
yield from generate_object(group_name, object)
|
|
|
|
if __name__ == "__main__":
|
|
obj_file = parse_obj_file(sys.argv[1])
|
|
render, out = renderer(indent_length=4)
|
|
render(generate_obj_file(sys.argv[2], obj_file))
|
|
sys.stdout.write(out.getvalue())
|