model_generator2/generate_cpp.py
2025-01-30 03:07:20 -06:00

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())