Files
TeslaRel410/restoration/source410/BT/MECHMPPR.NOTES.md
T
CydandClaude Fable 5 ebf0d8c23f BT410 Phase 5.3.2: DRIVABLE mech -- authentic control interpretation + locomotion
The mech now drives from the authentic control chain (faithful route). Verified
headlessly: full throttle -> walks straight at top speed (30 u/s) along heading;
throttle+turn -> walks a circle (radius = speed/turnRate); neutral -> holds pose;
zero Fail.

MechControlsMapper::InterpretControls (mechmppr.cpp @004afd10) -- installed as the
mapper's per-frame Performance (roster slot 0, ticks before the mech):
- speedDemand = topSpeed*throttle*fwdScale (reverse inverts); soft stick (square)
  / pedal (cube) response; Basic=stick turn, Std/Vet=pedal turn; speed clamped
  while turning hard. Reads owner stride via Mech accessors.
- BT_FORCE_THROTTLE/BT_FORCE_TURN dev hooks for headless verification.

Mech::Simulate drive -- consumes the mapper demands:
- accelerate currentBodySpeed toward speedDemand (maxBodyAcceleration);
- authTurnRate = lerp(walkingTurnRate, runningTurnRate) by ground speed + over-run
  falloff (mech4.cpp master-perf @0x4aa3d3);
- integrate heading via Quaternion::Add(prevPose, (0,turn*rate*dt,0));
- facing = world -Z basis (GetFromAxis(Z_Axis)); worldLinearVelocity = facing*spd;
- integrate position (increment-1 core).

MECH.HPP: 9 named locomotion members out of reservedState (now [211]) --
walking/runningTurnRate, reverse/walkStrideLength, reverseSpeedMax,
forwardThrottleScale, maxBodyAcceleration, body/currentBodySpeed. BRING-UP
DEFAULTS (authentic values come from the model resource + LoadLocomotionClips --
next refinement).

Deferred: gait-clip-exact advance + leg anim (needs animation subsystem/renderer),
model-resource sourcing, terrain drop, torso/free-look aim, telemetry filters.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 14:46:30 -05:00

46 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MECHMPPR.CPP / .HPP — reconstruction notes
`MechControlsMapper` (: Subsystem) is the mech's control-input subsystem,
installed at roster slot 0 via `Mech::SetMappingSubsystem`. It publishes the
control-input attributes (StickPosition..PilotArray, IDs 30x16) that the
streamed control mappings bind to, and — as of Phase 5.3 — interprets those raw
inputs into the locomotion/aim demands the mech drive consumes.
## Reconstructed
- The attribute table + AttributeIndex + shared-data statics (earlier wave).
- The ctor: primes the published inputs to neutral and (Phase 5.3) installs
`InterpretControls` as the per-frame Performance.
- `InterpretControls(Scalar)` — the per-frame control interpretation
(mechmppr.cpp @004afd10, authentic demand math):
- throttle → forward speed: `speedDemand = topSpeed · throttle · fwdScale`
(reverse thrust inverts and drops the forward scale). `topSpeed`/`walkSpeed`
are read from the owner via `Mech::GetReverseStrideLength()/GetWalkStrideLength()`.
- soft response: square the stick yaw (sign preserved), cube the pedals.
- Basic mode: stick yaw = `turnDemand`; Standard/Veteran: pedals = `turnDemand`.
- speed clamp while turning hard (`max_turn` ramps topSpeed → walkSpeed by
|turnDemand|); VeteranMode has no clamp.
- Demand accessors `GetSpeedDemand()/GetTurnDemand()` (read by `Mech::Simulate`).
- `GetMech()` = `(Mech *)GetEntity()`.
The mapper ticks in the engine's `Entity::PerformAndWatch` roster walk (slot 0),
which runs BEFORE the mech's own Performance (`Simulation::PerformAndWatch` at
the tail), so the demands are same-frame — no input latency.
## DEV hook (headless verification)
`BT_FORCE_THROTTLE` / `BT_FORCE_TURN` override the pushed raw inputs (the RIO/
keyboard aren't present in the headless smoke test), so the demand math + mech
drive are exercisable without hardware. `BT_MECH_LOG` prints a 1 Hz `[mppr]`
demand trace. Verified: `throttle=1.0` → speedDemand=30; `throttle=0.3,turn=1.0`
→ the mech walks a circle; neutral → 0. See MECH.NOTES.md (Phase 5.3 inc 2).
## Deferred (the aiming wave)
The torso/free-look half of the authentic InterpretControls is not yet
reconstructed: the torso analog axes (`Torso::SetAnalogElevationAxis/
SetAnalogTwistAxis`), HUD free-aim slew (`HUD::SetFreeAimSlew`), the recenter
command, and the look/eyepoint commit (`BTCommitLookState`). These are the
aiming/camera surface, separate from locomotion; they come with the
Torso/HUD/eyepoint wave.