Files
TeslaRel410/restoration
CydandClaude Fable 5 d8aea8d871 BT410 5.3.91: the gait transition machine -- two channels, one table, and a reverse cycle that has been misread twice
mech2.cpp exists. Six of its twelve functions are reconstructed: the two
Set*Animation binders, the two *Transition tails, and both *ClipFinished jump
tables (@0x4a69aa leg / @0x4a6e0a body). Compile-verified, BT 51/51, links
clean.

TWO CHANNELS, DELIBERATELY NEAR-DUPLICATE.  A mech runs two clip channels over
the same states and the same clips; only the speed they consult differs:

  LEG  reads the LIVE mapper GetSpeedDemand() -- responds to the stick at once
  BODY reads bodyTargetSpeed, a snapshot -- which is what lets a dead-reckoned
       or networked mech walk with no controls mapper of its own

So LegClipFinished and BodyClipFinished are twins rather than one shared
routine, exactly as the binary has them.  Kept that way on purpose: where the
two jump tables agree, a divergence in this file is a bug, and that mutual
check is worth more than the duplication costs.

EVERY CLIP IS ONE STRIDE, which is why every state is handed -- a walk is
Right, Left, Right, and each entry to and exit from a cycle has its own handed
pair so the mech always leaves on the correct foot.  The 29-state enum is
VERBATIM from the 0x3c-stride name table at .data:0050cfe8, the table the
"Unsupported mech animation" assert indexes, so the names and their order are
the original's rather than inferred from behaviour.

THE COMMIT TEST.  Both exits that leave a walk cycle test the demand AND the
current cycle speed slewed by one carryover:

    if (demand < standSpeed && (cycle - rate*carryover) < standSpeed) -> stop
    if (demand > walkStride && (cycle + rate*carryover) > walkStride) -> run

Requiring both is what stops a momentary flick of the stick yanking the mech
out of a stride it has already committed to.  Drop either conjunct and you get
a mech that stutters between gaits on noisy input.

TWO THINGS THAT READ WRONG AND ARE NOT:

  gimpStrideLength is authored NEGATIVE.  The cycle time from it comes out
  negative and is folded positive before being spent (@0x4a6c6e / @0x4a6d3d).
  That fold is not defensive coding -- remove it and the limp plays backwards.

  States 16-19 on the body channel are the REVERSE gait, not a limp, despite
  sharing the gimp caps.  BT411 records misreading these as "gimp, fall back to
  standing" TWICE; that makes the body loop stand -> reverse-entry forever, a
  slow reverse with a wrong-footed exit.  Read here by structural symmetry with
  the leg table, where every previously-decoded body case mirrors its leg twin.

DEFERRED, and named in the sidecar: the four Advance* per-frame entry points
and the two Gimp*ClipFinished limp machines -- with them the gimp-level branch
at the top of both *ClipFinished, so a limping mech currently runs the normal
machine.  That branch needs a TU-safe read of the graphic alarm level (BT411
routes it through a mechdmg bridge to dodge an AlarmIndicator ODR split), worth
reproducing carefully rather than reaching for the alarm directly.

NOTHING CALLS ANY OF THIS YET.  The Advance* functions are the entry points and
they are the deferred half, so no gait state is ever selected and a run behaves
exactly as before.  Same caveat as 5.3.90: a blocker removed, not a behaviour
delivered.

HEADER: MECH.HPP gains the enum, six declarations, and the channel state --
legStateAlarm/bodyStateAlarm (read via GetLevel; the binary's +0x3b0/+0x728 are
mirrors of the alarm level, so no separate int is kept), legCycleSpeed,
bodyCycleSpeed, forwardCycleRate, gimpCycleRate, standSpeed, gimpSpeedMax,
gimpStrideLength, globalTimeScale, animationClips[0x1d].  41 ints carved from
reservedState, 191 -> 150.  walkStrideLength/reverseStrideLength/
reverseSpeedMax/bodyTargetSpeed already existed from the Phase 5.3 locomotion
work and are reused.

STILL UNSOURCED: animationClips[] is declared but nothing fills it.  The clip
handles come from the mech's model resource and must be resolved before the
Advance* increment, or SetLegAnimation hands SelectSequence a garbage ID.  It
fails soft (SelectSequence tolerates a missing resource with an inert
controller) but it is a hard prerequisite for the gait doing anything.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 01:14:02 -05:00
..

Scene Restorations

Modern re-renderings of the Division dVS scenes recovered from the Glaze developer drive (see HISTORY.md) and this repo's CONTENT tree. The originals ran on Division Ltd.'s pixel-pipeline hardware in 19941997; these tools parse the original data files and re-render them in WebGL, in the browser.

Viewers (open in any browser, fully self-contained)

  • vwe-archive.html — the Scene Archive: 26 curated scenes across all projects — Star Trek (Enterprise-D, Klingon flyby), Hull Pressure (sea demos, fish schools, sunken temple), BattleTech (polar map with mech lineup, Ravine and desert maps, stadium), Red Planet (Blade arena, the Mars canal milestone demo), and the Canyon/Maya-temple Division demos. Fly camera: drag to look, WASD to fly, R resets.
  • trek-scn.html — the original standalone Star Trek restoration (TREK.SCN and KLNGVID.SCN).

Toolkit

  • divformats.py — parsers for every Division format found on the drive: text VGF/VMF (DIV-VIZ2 geometry/materials, both the 1995 VERSION 2:07 and 1996 02:05 dialects, with header SCALE support), binary BGF/BMF (DIV-BIZ2) — the binary block-stream layout was recovered from Division's own reader source (DPL3/BIZREAD.C, 1994), including all 14 vertex layouts, pmesh/tristrip/polygon connectivity, LOD blocks (newer writers nest patches inside LODs; the largest LOD is taken), and embedded materials/textures/ramps — plus TGA and raw SVT textures, SPL splines, and SCN scene scripts.
  • audit.py — scans every .SCN on the drive and reports what fraction of its geometry survives, and in which format.
  • extract_all.py — extracts every scene with ≥60 % of its geometry recoverable (108 of 241 on the drive; the rest reference lost models) into allscenes.json, resolving models/materials/textures across the drive and this repo's CONTENT dirs.
  • gallery_build.py — curates scenes from allscenes.json into the self-contained vwe-archive.html (via gallery_template.html).
  • convert.py / viewer_template.html — the original single-scene Star Trek pipeline.

Rebuild

python extract_all.py     # requires the sda4/ drive dump beside this repo
python gallery_build.py

Fidelity notes

Faithful: vertices, triangles, material colors and shading ramps, textures, fog and light parameters, spline motion, camera start positions. Approximated: Division's rasterizer behavior, point sizes, timing (originals ran at 30 Hz). Not simulated: event-driven SPECIALFX particles. A few dev scenes had camera start positions inside geometry; those get overridden or auto-framed cameras (see START_OVERRIDE in gallery_build.py). Scenes missing one or more models from the drive say so in their header.