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

58 lines
2.0 KiB
Python

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