Render-clock tracking timestamps (menu toggle), physics step cap 6, docs for step 2.7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
22159aa902
commit
ca60df3d75
9 files changed
+111
-11
No files matched your search
+25
-1
@@ -15,6 +15,9 @@ public partial class PlayerRig : Node
|
||||
public const float MoveAcceleration = 8f; // m/s²
|
||||
public const float StickDeadzone = 0.2f;
|
||||
public static bool SmoothTurn = false;
|
||||
// Tracking timed by the render clock (bible v2: uniform motion, constant ~2-tick lag) vs by
|
||||
// arrival (less lag, 18 Hz speed beat). Menu toggle so both can be compared in the headset.
|
||||
public static bool SteadyTracking = true;
|
||||
public const float SnapTurnDegrees = 30f;
|
||||
public const float SmoothTurnSpeed = 2.5f; // rad/s
|
||||
public const float SnapTurnThreshold = 0.7f;
|
||||
@@ -144,7 +147,8 @@ public partial class PlayerRig : Node
|
||||
_driver.RebuildRequested |= _rebuild;
|
||||
_rebuild = false;
|
||||
Transform3D o = _origin.GlobalTransform;
|
||||
_driver.Tick(profile, ref o, _camera.Transform, _left.Transform, _right.Transform, _moveVelocity, dt);
|
||||
_driver.Tick(profile, ref o, _camera.Transform, _left.Transform, _right.Transform, _moveVelocity, dt,
|
||||
SteadyTracking ? TrackingAge() : null);
|
||||
_origin.GlobalTransform = o;
|
||||
_lastOrigin = _origin.GlobalTransform;
|
||||
_haveLastOrigin = true;
|
||||
@@ -153,6 +157,24 @@ public partial class PlayerRig : Node
|
||||
_interpolateOrigin = true;
|
||||
}
|
||||
|
||||
// The tracking poses read in this tick were delivered with the last frame, predicted for its render
|
||||
// time. In physics ticks: render time of that frame ≈ (physics frames + fraction) at its _process,
|
||||
// plus one frame delta for the frame these ticks belong to (bible v2 recipe).
|
||||
private double TrackingAge()
|
||||
{
|
||||
float rate = Engine.PhysicsTicksPerSecond;
|
||||
ulong frame = Engine.GetProcessFrames();
|
||||
if (frame != _sampleFrame)
|
||||
{
|
||||
_sampleFrame = frame;
|
||||
_sampleTicks = _renderTicks + _renderDelta * rate;
|
||||
}
|
||||
return (Engine.GetPhysicsFrames() - _sampleTicks) / rate;
|
||||
}
|
||||
|
||||
private double _renderTicks, _renderDelta, _sampleTicks;
|
||||
private ulong _sampleFrame = ulong.MaxValue;
|
||||
|
||||
// The origin on screen is interpolated; physics must run on the real one. Anyone else who moved
|
||||
// the origin since (teleport marker, menu) is respected as the new real one.
|
||||
private void RestorePhysicsOrigin()
|
||||
@@ -168,6 +190,8 @@ public partial class PlayerRig : Node
|
||||
|
||||
public override void _Process(double delta)
|
||||
{
|
||||
_renderTicks = Engine.GetPhysicsFrames() + Engine.GetPhysicsInterpolationFraction();
|
||||
_renderDelta = delta;
|
||||
if (_interpolateOrigin && !Spectator)
|
||||
{
|
||||
Transform3D current = _origin.GlobalTransform;
|
||||
|
||||
Reference in new issue
Block a user