"""Renders 8 distinct sample races, one for each track archetype.""" import sys from pathlib import Path from raceforge.audio.mix import AudioSynthesizer from raceforge.director.base import TrackDirective from raceforge.encode.ffmpeg_pipe import encode_full_mp4 from raceforge.render.frames import CairoFrameRenderer from raceforge.schemas.spec import ArchetypeKind, AudioScale from raceforge.sim.engine import SimulationEngine from raceforge.track.builder import build_track from raceforge.track.clearance import compute_walkable_manifold from raceforge.track.grid import GridCell from raceforge.track.solver import GeodesicSolver ARCHETYPES = [ (ArchetypeKind.SERPENTINE, 201, "olive", AudioScale.C_MAJOR_PENTATONIC), (ArchetypeKind.COMB_CHAMBER, 202, "slate", AudioScale.A_MINOR_PENTATONIC), (ArchetypeKind.SPIRAL, 203, "mint", AudioScale.LYDIAN), (ArchetypeKind.NESTED_RINGS, 204, "beige", AudioScale.C_MAJOR_PENTATONIC), (ArchetypeKind.ROOM_BRAID, 205, "olive", AudioScale.A_MINOR_PENTATONIC), (ArchetypeKind.CHEVRON, 206, "slate", AudioScale.LYDIAN), (ArchetypeKind.HUB_SPOKE, 207, "mint", AudioScale.C_MAJOR_PENTATONIC), (ArchetypeKind.PIPE_NETWORK, 208, "beige", AudioScale.A_MINOR_PENTATONIC), ] out_dir = Path("out/samples") out_dir.mkdir(parents=True, exist_ok=True) for kind, seed, theme, scale in ARCHETYPES: name = kind.value mp4_path = out_dir / f"sample_{name}.mp4" wav_path = out_dir / f"sample_{name}.wav" print(f"--> Generating archetype '{name}' (seed {seed}, theme {theme})...") directive = TrackDirective( archetypes=[kind], theme=theme, base_speed=350.0, audio_scale=scale, bpm=128.0, ) spec, grid = build_track(seed, directive) gcell = grid.world_to_cell( (spec.track.goal_tile[0] + spec.track.goal_tile[2]) / 2.0, (spec.track.goal_tile[1] + spec.track.goal_tile[3]) / 2.0, ) or GridCell(1, 1) w = compute_walkable_manifold(grid, spec.physics.racer_size) solver = GeodesicSolver(grid, w, gcell) engine = SimulationEngine(spec, grid, solver, fps=60, max_duration_s=8.0) timeline = engine.run() # Synthesize audio synth = AudioSynthesizer(spec, timeline) synth.synthesize(wav_path) # Render video renderer = CairoFrameRenderer(spec, grid, timeline) encode_full_mp4(renderer.iter_raw_bgra_frames(), wav_path, mp4_path, width=1080, height=1920, fps=60) print(f"✓ Saved {mp4_path} ({mp4_path.stat().st_size / 1024 / 1024:.2f} MB)") print("All 8 archetype sample MP4s generated successfully!")