MP: PROMOTE coupled peer motion to DEFAULT -- user + metrics confirm (task #50)

User confirms 'way better'; single-player un-regressed (master walks correctly,
the bodyTargetSpeed change only affects the invisible mj=0 body channel).
Flip the authentic-coupled path ON by default:
 - peer position: gait-coupled linear (was velocity dead-reckon); BT_DR_POS=1 reverts
 - master send-mirror: gait projection of projectedOrigin; BT_NO_MASTER_GAITMIRROR reverts
The two-source split (position from velocity + animation from commanded speed)
that mismatched during speed changes is retired.  Residual: occasional ~2.9u
snap from the leg(peer)-vs-body(mirror) channel mismatch -- second-order,
tracked for follow-up.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
arcattack
2026-07-14 21:29:48 -05:00
co-authored by Claude Opus 4.8
parent c52a1ad79a
commit b0137427a6
+3 -3
View File
@@ -1952,7 +1952,7 @@ void
// coupled root-motion experiment (BT_ROOT_POS=1) needs the MASTER-side
// gait mirror to stop the authority tug-of-war (measured ratio 1.86) --
// the completion path is mapped in the session notes.
static const int s_drPos = getenv("BT_ROOT_POS") ? 0 : 1;
static const int s_drPos = getenv("BT_DR_POS") ? 1 : 0; // default 0 = authentic gait-coupled linear (BT_DR_POS=1 restores velocity)
Point3D replPrevPos = localOrigin.linearPosition;
Quaternion replPrevHeading = localOrigin.angularPosition;
DeadReckon(dt); // engine reckoner: LINEAR position/velocity
@@ -3176,7 +3176,7 @@ void
// The master's VISIBLE motion uses the LEG channel reading live demand
// independently, so this does not change what the local player sees.
// (Default OFF: live overwrite preserved.)
static const int s_gaitMirror = getenv("BT_MASTER_GAITMIRROR") ? 1 : 0;
static const int s_gaitMirror = getenv("BT_NO_MASTER_GAITMIRROR") ? 0 : 1; // default ON (authentic coupled)
if (s_gaitMirror)
{
/* leave bodyTargetSpeed at the last-sent value */
@@ -3744,7 +3744,7 @@ void
// velocity. Re-seeded to localOrigin on each send by the record writers'
// projectedOrigin re-base, so this is incremental-from-last-send, exactly the
// peer's IntegrateMotion. (Default OFF: constant-velocity deadReckoner.)
static const int s_gaitMirrorSend = getenv("BT_MASTER_GAITMIRROR") ? 1 : 0;
static const int s_gaitMirrorSend = getenv("BT_NO_MASTER_GAITMIRROR") ? 0 : 1; // default ON
if (s_gaitMirrorSend)
{
Vector3D mAng;