dreamcast/md2/gen.py
2025-02-16 19:40:33 -06:00

81 lines
2.3 KiB
Python

from generate import renderer
from parse import parse_md2file
import sys
def join(l):
return ", ".join(str(i) for i in l)
def gen_header(prefix, header):
yield f"struct md2_header {prefix}_header = {{"
yield f".skinwidth = {header.skinwidth},"
yield f".skinheight = {header.skinheight},"
yield f".num_vertices = {header.num_vertices},"
yield f".num_st = {header.num_st},"
yield f".num_tris = {header.num_tris},"
yield f".num_frames = {header.num_frames},"
yield f".st = {prefix}_st,"
yield f".tris = {prefix}_triangle,"
yield f".frames = {prefix}_frame,"
yield "};"
def gen_triangles(prefix, triangles):
yield f"struct md2_triangle {prefix}_triangle[] = {{"
for t in triangles:
yield "{"
yield f".vertex = {{{join(t.vertex)}}},"
yield f".st = {{{join(t.st)}}},"
yield "},"
yield "};"
def gen_frames(prefix, frames):
yield f"struct md2_frame {prefix}_frame[] = {{"
for i, f in enumerate(frames):
yield "{"
yield f".scale = {{{join(f.scale)}}},"
yield f".translate = {{{join(f.translate)}}},"
yield f'.name = "{f.name}",'
yield f".verts = {prefix}_verts_{i}"
yield "},"
yield "};"
def gen_frame_vertices(prefix, frames):
for i, f in enumerate(frames):
yield f"struct md2_vertex {prefix}_verts_{i}[] = {{"
for v in f.verts:
yield "{"
yield f".v = {{{join(v.v)}}},"
yield f".normal_index = {v.normal_index},"
yield "},"
yield "};"
def gen_texture_coordinates(prefix, texture_coordinates):
yield f"struct md2_texture_coordinate {prefix}_st[] = {{"
for st in texture_coordinates:
yield f"{{{st.s}, {st.t}}},"
yield "};"
def generate_all(prefix, md2file):
yield from gen_triangles(prefix, md2file.triangles)
yield from gen_frame_vertices(prefix, md2file.frames)
yield from gen_frames(prefix, md2file.frames)
yield from gen_texture_coordinates(prefix, md2file.texture_coordinates)
yield from gen_header(prefix, md2file.header)
with open(sys.argv[1], 'rb') as f:
buf = f.read()
prefix = sys.argv[2]
output_filename = sys.argv[3]
mem = memoryview(buf)
md2file = parse_md2file(mem)
render, out = renderer()
render(generate_all(prefix, md2file))
with open(output_filename, 'w') as f:
f.write(out.getvalue())