//! The application: renderer, hardware models, and the frame loop. //! //! Reimplements the pieces of the PlayStation 2 that the game talks to, so the //! game logic in `gc-game` can be written as ordinary Rust that draws and //! sounds like the original. //! //! # Hardware being modelled //! //! * **Graphics Synthesizer (GS)** - fixed-function rasteriser. No shaders on //! the real hardware: the GS does texture mapping, alpha and blend rules, //! and z/stencil. Here that becomes wgpu plus explicit handling of the GS's //! own rules (its `round(log2(z/n) + K)` mip selection, its blend and alpha //! test behaviour, its alpha-0x80-is-1.0 convention). //! * **VU0 / VU1** - vector units running microcode uploaded from the disc. //! Skinning, lighting and transform setup live here. The microcode is //! **binary** in the game's `.vutext` section, so it is reverse engineered //! rather than parsed: this is the single hardest item in the project. //! * **DMA and GIF/VIF packets** - the game streams geometry to the GS through //! tag-split packet lists. Those packet formats are the input to rendering. //! * **SPU2 / IOP** - audio and the disc interface, in `gc-video` and //! `gc-extract` respectively. //! //! # Divergence from the first game //! //! R&C2's levels are spherical worlds, so camera, culling, fog and the sky are //! all effectively rewritten compared with Ratchet & Clank (2002). Geometry //! subsystems carry over in shape - `tfrag`, `tie`, `shrub`, `moby` are the //! same four - but their behaviour on a sphere is new work. //! //! # Reference frame //! //! The port is validated against PCSX2 by replaying recorded input and //! comparing frames. Without that loop, "looks close" and "is correct" drift //! apart, and this game's difficulty and movement make that drift very //! noticeable. pub mod level; pub mod ps2; pub mod tfrag_light;