feat(core): Phase B.3 — PhysicsEngine (top-level collision resolver)
Combines TerrainSurface + CellSurface into a single Resolve() API that handles outdoor terrain walking, indoor floor walking, outdoor<->indoor cell transitions, step-height enforcement, and ground detection. Step-height blocks upward Z deltas exceeding the limit (walls, cliffs); downhill movement is always accepted. Indoor transitions pick the cell whose floor Z is closest to the entity's current Z (handles multi-story buildings). Reports IsOnGround=false when no landblock or surface covers the entity's position (gravity applied by the caller). One API mismatch fixed vs plan: plan encoded the upper 16 landblock bits into the returned cell ID, but the tests assert the raw cell ID (0x0100, <0x0100) — so Resolve returns targetCellId directly. 6 new tests covering flat terrain, slopes, step-height rejection, indoor entry/exit, and void detection. 243 total, all green. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
19aa8ce5d0
commit
88d446d11d
3 changed files with 327 additions and 0 deletions
13
src/AcDream.Core/Physics/ResolveResult.cs
Normal file
13
src/AcDream.Core/Physics/ResolveResult.cs
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
using System.Numerics;
|
||||
|
||||
namespace AcDream.Core.Physics;
|
||||
|
||||
/// <summary>
|
||||
/// Result of <see cref="PhysicsEngine.Resolve"/>: the validated
|
||||
/// position after collision, the cell the entity ended up in,
|
||||
/// and whether they're standing on a surface.
|
||||
/// </summary>
|
||||
public readonly record struct ResolveResult(
|
||||
Vector3 Position,
|
||||
uint CellId,
|
||||
bool IsOnGround);
|
||||
Loading…
Add table
Add a link
Reference in a new issue