from generate import renderer from obj import parse_obj_file import sys def generate_vec3(field, vs): for i, v in enumerate(vs): vec3_args = f"{v.x}f, {v.y}f, {v.z}f" yield f"{field}[{i}] = new Vec3({vec3_args});" def generate_vec2(field, vs): for i, v in enumerate(vs): vec2_args = f"{v.x}f, {v.y}f" yield f"{field}[{i}] = new Vec2({vec2_args});" def generate_face(length, i, j, face): assert len(face.ptn) == length, (face.ptn, length) for k, ptn in enumerate(face.ptn): ptn_args = f"{ptn.position}, {ptn.texture}, {ptn.normal}" yield f"objects[{i}].faces[{j}][{k}] = new FacePTN({ptn_args});" def generate_model_objects(objects): face_length = len(objects[0].faces[0].ptn) for i, o in enumerate(objects): yield f"objects[{i}] = new ModelObject();" yield f"objects[{i}].faces = new FacePTN[{len(o.faces)}][{face_length}];" for j, face in enumerate(objects[i].faces): yield from generate_face(face_length, i, j, face) def generate_model(name, obj_file): yield "package model;" yield f"public class {name} {{" yield "public static Vec3[] position;" yield "public static Vec3[] normal;" yield "public static Vec2[] texture;" yield "public static ModelObject[] objects;" yield f"private {name}() {{" yield "}" yield "static {" yield f"position = new Vec3[{len(obj_file.position)}];" yield f"normal = new Vec3[{len(obj_file.normal)}];" yield f"texture = new Vec2[{len(obj_file.texture)}];" yield f"objects = new ModelObject[{len(obj_file.objects)}];" yield from generate_vec3("position", obj_file.position) yield from generate_vec3("normal", obj_file.normal) yield from generate_vec2("texture", obj_file.texture) yield from generate_model_objects(obj_file.objects) yield "}" yield "}" if __name__ == "__main__": obj_file = parse_obj_file(sys.argv[1]) render, out = renderer(indent_length=4) render(generate_model(sys.argv[2], obj_file)) sys.stdout.write(out.getvalue())