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>
2.4 KiB
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 3–0x16) 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
InterpretControlsas 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/walkSpeedare read from the owner viaMech::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_turnramps topSpeed → walkSpeed by |turnDemand|); VeteranMode has no clamp.
- throttle → forward speed:
- Demand accessors
GetSpeedDemand()/GetTurnDemand()(read byMech::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.