dreamcast/md5/md5anim_gen.py
2025-05-13 00:52:03 -05:00

95 lines
3.0 KiB
Python

from generate import renderer
import sys
import md5anim
from md5mesh_gen import vec2, vec3, vec4, unit_quaternion_w
def _render_md5_anim_hierarchy(h):
yield f'.name = "{h.name}",'
yield f".parent_index = {h.parent_index},"
yield f".flags = {h.flags},"
yield f".start_index = {h.start_index},"
def render_md5_anim_hierarchy(prefix, hierarchy):
yield f"struct md5_anim_hierarchy {prefix}_hierarchy[] = {{"
for h in hierarchy:
yield "{"
yield from _render_md5_anim_hierarchy(h)
yield "},"
yield "};"
def _render_md5_anim_bounds(b):
min = vec3(b.min_x, b.min_y, b.min_z)
max = vec3(b.max_x, b.max_y, b.max_z)
yield f".min = {min},"
yield f".max = {max},"
def render_md5_anim_bounds(prefix, bounds):
yield f"struct md5_anim_bounds {prefix}_bounds[] = {{"
for b in bounds:
yield "{"
yield from _render_md5_anim_bounds(b)
yield "},"
yield "};"
def _render_md5_anim_base_frame(bf):
pos = vec3(bf.pos_x, bf.pos_x, bf.pos_x)
w = unit_quaternion_w(bf.orient_x, bf.orient_y, bf.orient_z)
orient = vec4(bf.orient_x, bf.orient_y, bf.orient_z, w)
yield f".pos = {pos},"
yield f".orient = {orient},"
def render_md5_anim_base_frame(prefix, base_frame):
yield f"struct md5_anim_base_frame {prefix}_base_frame[] = {{"
for bf in base_frame:
yield "{"
yield from _render_md5_anim_base_frame(bf)
yield "},"
yield "};"
def render_md5_anim_frames(prefix, frame):
for i, anim_frame in enumerate(frame):
yield f"float {prefix}_{i}_frame[] = {{"
for f in anim_frame.value:
yield f"{f:.6f},"
yield "};"
def render_md5_anim_frame(prefix, frame):
yield from render_md5_anim_frames(prefix, frame)
yield f"float * {prefix}_frame[] = {{"
for i, anim_frame in enumerate(frame):
yield f"{prefix}_{i}_frame,"
yield "};"
def render_md5_anim(prefix, a):
yield f".num_frames = {a.num_frames},"
yield f".num_joints = {a.num_joints},"
yield f".frame_rate = {a.frame_rate},"
yield f".num_animated_components = {a.num_animated_components},"
yield f".hierarchy = {prefix}_hierarchy,"
yield f".bounds = {prefix}_bounds,"
yield f".base_frame = {prefix}_base_frame,"
yield f".frame = {prefix}_frame,"
def render_anim(prefix, a):
yield from render_md5_anim_hierarchy(prefix, a.hierarchy)
yield from render_md5_anim_bounds(prefix, a.bounds)
yield from render_md5_anim_base_frame(prefix, a.base_frame)
yield from render_md5_anim_frame(prefix, a.frame)
yield f"md5_anim {prefix}_anim {{"
yield from render_md5_anim(prefix, a)
yield "};"
def render_all(prefix, a):
yield from render_anim(prefix, a)
if __name__ == "__main__":
with open(sys.argv[1], 'r') as f:
buf = f.read()
l = [i.strip() for i in buf.split('\n') if i.strip()]
a = md5anim.parse_file(l)
render, out = renderer()
render(render_all(sys.argv[2], a))
sys.stdout.write(out.getvalue())