diff --git a/src/AcDream.Core/Physics/BSPQuery.cs b/src/AcDream.Core/Physics/BSPQuery.cs index cb32399..a6fb497 100644 --- a/src/AcDream.Core/Physics/BSPQuery.cs +++ b/src/AcDream.Core/Physics/BSPQuery.cs @@ -335,6 +335,12 @@ public static class BSPQuery CollisionSphere validPos, Vector3 movement) { + // A6.P1: snapshot inputs for the [push-back] probe (cheap copy of + // Vector3 + 2 floats). Only the LogPushBackAdjust call below pays + // the Console.WriteLine cost, and only when the probe is on. + var inputCenter = validPos.Center; + float walkInterpBefore = path.WalkInterp; + float dpPos = Vector3.Dot(validPos.Center, poly.Plane.Normal) + poly.Plane.D; float dpMove = Vector3.Dot(movement, poly.Plane.Normal); float dist; @@ -342,7 +348,17 @@ public static class BSPQuery if (dpMove <= PhysicsGlobals.EPSILON) { if (dpMove >= -PhysicsGlobals.EPSILON) + { + if (PhysicsDiagnostics.ProbePushBackEnabled) + { + PhysicsDiagnostics.LogPushBackAdjust( + inputCenter, validPos.Center, poly.Plane, validPos.Radius, + walkInterpBefore, path.WalkInterp, + dpPos, dpMove, 0f, + applied: false); + } return false; + } dist = dpPos - validPos.Radius; } else @@ -354,10 +370,30 @@ public static class BSPQuery float interp = (1f - iDist) * path.WalkInterp; if (interp >= path.WalkInterp || interp < -0.5f) + { + if (PhysicsDiagnostics.ProbePushBackEnabled) + { + PhysicsDiagnostics.LogPushBackAdjust( + inputCenter, validPos.Center, poly.Plane, validPos.Radius, + walkInterpBefore, path.WalkInterp, + dpPos, dpMove, iDist, + applied: false); + } return false; + } validPos.Center -= movement * iDist; path.WalkInterp = interp; + + if (PhysicsDiagnostics.ProbePushBackEnabled) + { + PhysicsDiagnostics.LogPushBackAdjust( + inputCenter, validPos.Center, poly.Plane, validPos.Radius, + walkInterpBefore, path.WalkInterp, + dpPos, dpMove, iDist, + applied: true); + } + return true; }