From 55a512f85b9f35cc6bb6437bfa26bb2385b0bf7f Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Wed, 13 May 2026 16:22:15 +0200 Subject: [PATCH] Add tests for authored terrain collision alignment and resizing in RapierCollisionWorld --- tests/domain/rapier-collision-world.test.ts | 81 +++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/tests/domain/rapier-collision-world.test.ts b/tests/domain/rapier-collision-world.test.ts index 01e20e6c..e11ed4db 100644 --- a/tests/domain/rapier-collision-world.test.ts +++ b/tests/domain/rapier-collision-world.test.ts @@ -1126,6 +1126,87 @@ describe("RapierCollisionWorld", () => { } }); + it("keeps rectangular authored terrain collision aligned along the Z axis", async () => { + const terrain = createTerrain({ + id: "terrain-authored-rectangular-z-collision", + position: { + x: 10, + y: 0, + z: 20 + }, + sampleCountX: 5, + sampleCountZ: 3, + cellSize: 2, + heights: [ + 0, + 0, + 0, + 0, + 0, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4 + ] + }); + const runtimeScene = buildRuntimeSceneFromDocument({ + ...createEmptySceneDocument({ + name: "Authored Rectangular Terrain Z Collision Scene" + }), + terrains: { + [terrain.id]: terrain + } + }); + const collisionWorld = await RapierCollisionWorld.create( + runtimeScene.colliders, + runtimeScene.playerCollider + ); + + try { + const southLanding = collisionWorld.resolveFirstPersonMotion( + { + x: 14, + y: 8, + z: 21 + }, + { + x: 0, + y: -10, + z: 0 + }, + runtimeScene.playerCollider + ); + const northLanding = collisionWorld.resolveFirstPersonMotion( + { + x: 14, + y: 8, + z: 23 + }, + { + x: 0, + y: -10, + z: 0 + }, + runtimeScene.playerCollider + ); + + expect(southLanding.grounded).toBe(true); + expect(southLanding.feetPosition.y).toBeGreaterThan(0.08); + expect(southLanding.feetPosition.y).toBeLessThan(0.12); + expect(northLanding.grounded).toBe(true); + expect(northLanding.feetPosition.y).toBeGreaterThan(0.28); + expect(northLanding.feetPosition.y).toBeLessThan(0.32); + } finally { + collisionWorld.dispose(); + } + }); + it("keeps authored terrain collision aligned after west and south grid resize", async () => { const terrain = resizeTerrainGrid( createTerrain({