fix(physics): skip mesh-AABB-fallback cylinder for landblock stabs
ISSUES #83 Phase A1. Landblock stabs (entity.Id 0xC0XXYY00+n per LandblockLoader.cs:55) were being registered with TWO collision shadows: the correct per-part BSP at `entity.Id*256 + partIdx`, AND a redundant mesh-AABB-fallback cylinder at `entity.Id`. The fallback clamped to 1.5m radius, centered at the building's mesh origin, producing user-reported "thin air" collisions inside cottages and within 2m of building exteriors. The fallback was originally designed for canopy-only-BSP procedural scenery (0x80XXYY00+n) — trees whose BSP covers the canopy but not the trunk. Landblock stabs have full BSP coverage and don't need it. Probe evidence (launch-thinair capture): - 0xC0A9B479 cylinder fallback (Holtburg cottage): 104 hits in a short capture session, all inside the cottage main room (cell=0xA9B4013F), ~2m from the building's mesh origin. - 0xA9B47900 BSP (the actual cottage walls): 52 legitimate hits. Fix: one new bool _isLandblockStab + one clause in the existing mesh-AABB-fallback gate. Spec: docs/superpowers/specs/2026-05-21-cylinder-fallback-dedup-design.md. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
bb1e919ef2
commit
5f2b545979
3 changed files with 363 additions and 0 deletions
|
|
@ -5827,6 +5827,17 @@ public sealed class GameWindow : IDisposable
|
|||
|| ((entity.Id < 0x40000000u) // stab
|
||||
&& (_srcPrefix == 0x01000000u || _srcPrefix == 0x02000000u));
|
||||
bool _isScenery = _isOutdoorMesh;
|
||||
// ISSUES #83 / Phase A1 (2026-05-21): landblock stabs
|
||||
// (LandBlockInfo.Objects + Buildings) use entity.Id with the
|
||||
// 0xC0XXYY00+n layout per LandblockLoader.cs:55. Their BSP
|
||||
// collision covers the whole structure; the mesh-AABB-fallback
|
||||
// path below is for canopy-only-BSP procedural scenery
|
||||
// (0x80XXYY00+n) and produces a redundant 1.5m-clamped
|
||||
// invisible disc at the stab's mesh origin — the user-reported
|
||||
// "thin air" collision inside cottages. Gate the fallback to
|
||||
// exclude stabs. Spec:
|
||||
// docs/superpowers/specs/2026-05-21-cylinder-fallback-dedup-design.md.
|
||||
bool _isLandblockStab = (entity.Id & 0xFF000000u) == 0xC0000000u;
|
||||
if (_isScenery) scTried++;
|
||||
// Register EACH physics-enabled part so multi-part Setups
|
||||
// (buildings, trees) have all their collision geometry registered.
|
||||
|
|
@ -6048,6 +6059,7 @@ public sealed class GameWindow : IDisposable
|
|||
// L-fix3: skip entirely when the Setup is phantom — retail
|
||||
// decorative meshes have no collision data on purpose.
|
||||
if (!isPhantomSetup
|
||||
&& !_isLandblockStab
|
||||
&& (_isOutdoorMesh || (entityBsp == 0 && entityCyl == 0))
|
||||
&& entity.MeshRefs.Count > 0)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue