58 lines
2.0 KiB
Python
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())
|