Skip to content

v1.3

Choose a tag to compare

@tullulah tullulah released this 03 Oct 07:44
· 9 commits to main since this release

New

Physics

  • Rigid bodies with gravity and collisions (vpyphys): spheres, boxes and checked convex hulls; bodies turn, tip, tumble and roll; friction, restitution, sleeping, speculative contacts so fast bodies do not tunnel; box against box tests all fifteen separating axes.
  • Joints: ball joints and hinges between bodies or to the world, with the joint's stretch reported.
  • Ray casts against bodies (vpyp_raycast) and against any mesh, dented or morphed (vpy3d_ray_mesh).
  • Blasts that throw nearby bodies, spinning.
  • Ropes and chains (vpyrope) and soft bodies (vpysoft): cloth and flags, blobs that keep their area, any mesh as a jelly.

Impact and effects

  • Sparks, bursts and shattering (vpyfx): every edge of a broken object becomes a spinning stick; expanding rings and trails; a stroke budget at the lowest priority.
  • Dents that stay where an object was hit, and shot marks (rings or cracks) kept in the object's own space.
  • Camera shake and hit-stop (vpycam), and easing curves (vpyease).

Sound

  • Impact sounds (vpyimpact) synthesised on the PSG from the hit itself: volume from the impulse, voice from the material.
  • Positional sound: quieter with distance from a listener; on a cartridge with a DAC (the UVMC2's jack), stereo panning, several hits at once, and continuous sources with a Doppler shift.

Animation

  • Skeletal animation (vpybone): rigid bones, keyframed clips with looping and blending, limbs placed by two-bone IK (vpyik).
  • Morphing between two poses of a mesh.

3D rendering

  • Hidden-line terrain from a height map (floating horizon).
  • Fog, projected shadows, screen size and level of detail.
  • Text in the world: the vector font on any plane, or as billboards that always face the camera.
  • Stereo: one view per eye with a convergence plane — the picture half of 3D Imager support.

Gameplay

  • An entity layer (vpyent): transform, mesh, body, marks and material in one table; the scene drawn near to far through the occluder and stepped in the right order in one call each.
  • Steering and pathfinding (vpyai): seek, flee, arrive, separation, and A* on a grid.
  • Deterministic replays (vpyreplay): record the input, play it back frame for frame.

Calibration and display

  • The screen's shape per console in the calibration screen: aspect, and the visible window; vpy3d uses them.
  • Frames redrawn while no new one arrives (UVM2_REPLAY_LAST): a slow game keeps its picture instead of flickering.

Diagnostics and tools

  • A diagnostics HUD on any .um2: hold buttons 1 and 4 for two seconds to see fps, bus cycles, dropped commands, clamped ramps and stack use on the screen.
  • Stack measurement: both cores' stacks are painted and their peaks reported in uvm2_stats, with a sticky overflow flag.
  • The command list to the SD card (uvm2_dump_list), and readers for it from the card, from RAM over SWD, or from RTT.
  • A beam simulator that replays a command list and flags what cannot be right, including a dark beam left running free.
  • SWD tools: read or write any variable by name on a running console, and read the command list straight from RAM.
  • Documentation: setting up a Raspberry Pi Pico as the SWD probe from scratch; live A/B comparisons over SWD; the 4 KB stack limit of a game's core and how to measure it.

Fixes

  • A diagonal line across the screen with the brightness turned up. The padding at the end of each frame left the beam's integrators running with the zero clamp released, and the dark beam swept a corner-to-corner diagonal. Fix: the padding keeps the zero clamp on.
  • A bright dot that followed the joystick. The digital stick read probed the comparator with the DAC at ±64 and left the beam parked off-centre between frames. Fix: the axes are read with the BIOS's analog method only, centred on the stick's own rest position; games still get -127 / 0 / +127 by default.
  • Hang on the UVMC2 as soon as two boxes touched. The box collision path used ~4.7 KB of stack, more than the 4 KB a game's core has, and overwrote the drawing core's stack. Fix: the large temporary lists are static; the same path now uses ~1.7 KB.
  • Off-centre impulses spun bodies too fast, by a factor of their mass.
  • Ray casts with short direction vectors reported distances about 6% too long.
  • The calibration syscall clashed with raster text: it now has its own number (30) on both cartridges.
  • Hit-stop held one frame less than asked for in the physics demo.
  • The floating-point unit is switched on before anything in a game runs.
  • A firmware build missing a required hook now fails to link instead of running silently without it.
  • Every host tool builds again, from one script.

Demos

  • physics_demo — crates, balls, a hinged door and convex pieces in a pit: drop them, shoot them; crates dent, take shot marks and shatter on the third hit; impacts throw sparks and sound, in stereo on the UVMC2's jack.
  • soft_demo — a flag flying in a wind you steer, a jelly blob you drop and punch, and a jelly cube.
  • bone_demo — a 13-bone figure walking and running up and down steps, feet placed by IK, walk and run blended with the stick.
  • scene_demo — a scene built only from entities under an orbiting camera, with a turning 3D sign, words painted on the floor and labels that always face the camera.