refactor(physics): expose hitPolyId from FindWalkableInternal

Adds a ref ushort hitPolyId parameter to FindWalkableInternal so callers
can identify which polygon was hit. The leaf branch already iterates
foreach (ushort polyId in node.Polygons); this surfaces it.

No behavior change. Existing callers (StepSphereDown, Path 4 Collide)
pass a discard local. The new BSPQuery.FindWalkableSphere wrapper
(next commit) will consume it.

Prep for indoor walkable-plane BSP port — see spec
docs/superpowers/specs/2026-05-19-indoor-walkable-plane-bsp-port-design.md
This commit is contained in:
Erik 2026-05-19 21:22:40 +02:00
parent e62d076f33
commit ff548b962c

View file

@ -652,6 +652,7 @@ public static class BSPQuery
Vector3 movement, Vector3 movement,
Vector3 up, Vector3 up,
ref ResolvedPolygon? hitPoly, ref ResolvedPolygon? hitPoly,
ref ushort hitPolyId,
ref bool changed) ref bool changed)
{ {
if (node is null) return; if (node is null) return;
@ -673,6 +674,7 @@ public static class BSPQuery
{ {
changed = true; changed = true;
hitPoly = poly; hitPoly = poly;
hitPolyId = polyId;
} }
} }
return; return;
@ -686,22 +688,22 @@ public static class BSPQuery
if (dist >= reach) if (dist >= reach)
{ {
FindWalkableInternal(node.PosNode, resolved, path, validPos, movement, up, FindWalkableInternal(node.PosNode, resolved, path, validPos, movement, up,
ref hitPoly, ref changed); ref hitPoly, ref hitPolyId, ref changed);
return; return;
} }
if (dist <= -reach) if (dist <= -reach)
{ {
FindWalkableInternal(node.NegNode, resolved, path, validPos, movement, up, FindWalkableInternal(node.NegNode, resolved, path, validPos, movement, up,
ref hitPoly, ref changed); ref hitPoly, ref hitPolyId, ref changed);
return; return;
} }
// Straddles. // Straddles.
FindWalkableInternal(node.PosNode, resolved, path, validPos, movement, up, FindWalkableInternal(node.PosNode, resolved, path, validPos, movement, up,
ref hitPoly, ref changed); ref hitPoly, ref hitPolyId, ref changed);
FindWalkableInternal(node.NegNode, resolved, path, validPos, movement, up, FindWalkableInternal(node.NegNode, resolved, path, validPos, movement, up,
ref hitPoly, ref changed); ref hitPoly, ref hitPolyId, ref changed);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
@ -1103,9 +1105,10 @@ public static class BSPQuery
var validPos = new CollisionSphere(checkPos); var validPos = new CollisionSphere(checkPos);
bool changed = false; bool changed = false;
ResolvedPolygon? polyHit = null; ResolvedPolygon? polyHit = null;
ushort _polyId = 0; // step-down doesn't need the id, but the signature requires it
FindWalkableInternal(root, resolved, path, validPos, movement, up, FindWalkableInternal(root, resolved, path, validPos, movement, up,
ref polyHit, ref changed); ref polyHit, ref _polyId, ref changed);
if (changed && polyHit is not null) if (changed && polyHit is not null)
{ {
@ -1487,10 +1490,11 @@ public static class BSPQuery
{ {
var validPos = new CollisionSphere(sphere0); var validPos = new CollisionSphere(sphere0);
ResolvedPolygon? hitPoly = null; ResolvedPolygon? hitPoly = null;
ushort _hitPolyId = 0; // Path 4 doesn't need the id
bool changed = false; bool changed = false;
FindWalkableInternal(root, resolved, path, validPos, movement, localSpaceZ, FindWalkableInternal(root, resolved, path, validPos, movement, localSpaceZ,
ref hitPoly, ref changed); ref hitPoly, ref _hitPolyId, ref changed);
if (changed && hitPoly is not null) if (changed && hitPoly is not null)
{ {