fix(physics): document adjustedCenter discard + restore wall-poly test

Code review feedback on Task 3 commit 91b29d1:

- TryFindIndoorWalkablePlane: comment explaining why FindWalkableSphere's
  adjustedCenter out param is intentionally discarded (ValidateWalkable
  recomputes contact geometry from plane + foot position, consistent
  with the outdoor terrain path).
- IndoorWalkablePlaneTests: new TryFindIndoorWalkablePlane_WallPolyInBsp_ReturnsFalse
  restores integration-level coverage that the renamed NoBsp_ReturnsFalse
  lost. Verifies WalkableAllowance gate rejects a wall polygon in the
  cell BSP. Steep-poly rejection is also covered at the BSPQuery layer
  by FindWalkableSphere_SteepPoly_RejectedByWalkableAllowance.

No behavior change. Build clean; all related tests pass; same 8
pre-existing failures.

Spec: docs/superpowers/specs/2026-05-19-indoor-walkable-plane-bsp-port-design.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-05-19 21:58:53 +02:00
parent 91b29d1a89
commit 7c516edd7b
2 changed files with 57 additions and 0 deletions

View file

@ -167,6 +167,57 @@ public class IndoorWalkablePlaneTests
Assert.False(found);
}
[Fact]
public void TryFindIndoorWalkablePlane_WallPolyInBsp_ReturnsFalse()
{
// A polygon with a horizontal normal (Z = 0) is a wall, not a floor.
// walkable_hits_sphere rejects it: dp = dot(UnitZ, (0,1,0)) = 0 <= FloorZ.
// Regression coverage for the previous NoWalkablePolys_ReturnsFalse intent
// (the renamed NoBsp_ReturnsFalse only covers the null-BSP early-return).
Vector3[] wallVerts =
{
new Vector3(0f, 0f, 0f),
new Vector3(1f, 0f, 0f),
new Vector3(1f, 0f, 1f),
new Vector3(0f, 0f, 1f),
};
var resolved = new Dictionary<ushort, ResolvedPolygon>
{
[0] = new ResolvedPolygon
{
Vertices = wallVerts,
Plane = new Plane(new Vector3(0f, 1f, 0f), 0f), // wall facing +Y
NumPoints = 4,
SidesType = CullMode.None,
},
};
var center = new Vector3(0.5f, 0f, 0.5f);
var bsp = BuildLeafBsp(new ushort[] { 0 }, center, 2f);
var cell = new CellPhysics
{
BSP = bsp,
WorldTransform = Matrix4x4.Identity,
InverseWorldTransform = Matrix4x4.Identity,
Resolved = resolved,
};
var transition = new Transition();
transition.SpherePath.WalkInterp = 1.0f;
// Foot sphere positioned to overlap the wall's plane (|Y - 0| = 0 < radius 0.48).
bool found = transition.TryFindIndoorWalkablePlane(
cell,
localFootCenter: new Vector3(0.5f, 0f, 0.5f),
sphereRadius: 0.48f,
out _,
out _,
out _);
Assert.False(found);
}
[Fact]
public void TryFindIndoorWalkablePlane_EmptyResolved_ReturnsFalse()
{