From 1c60dafbf8f9f4f5ed8336ad327d4508db1f6d2d Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Sat, 4 Apr 2026 08:33:21 +0200 Subject: [PATCH] Update terrain geometry and test cases for RapierCollisionWorld --- tests/domain/rapier-collision-world.test.ts | 46 +++++++++++++++------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/tests/domain/rapier-collision-world.test.ts b/tests/domain/rapier-collision-world.test.ts index 77b7e19b..7e603129 100644 --- a/tests/domain/rapier-collision-world.test.ts +++ b/tests/domain/rapier-collision-world.test.ts @@ -100,11 +100,16 @@ describe("RapierCollisionWorld", () => { }); it("initializes and resolves first-person motion against terrain heightfield colliders", async () => { - const terrainGeometry = new PlaneGeometry(6, 6, 2, 2); + const terrainGeometry = new PlaneGeometry(8, 8, 4, 4); terrainGeometry.rotateX(-Math.PI / 2); const positionAttribute = terrainGeometry.getAttribute("position"); - positionAttribute.setY(4, 0.5); + for (let index = 0; index < positionAttribute.count; index += 1) { + const x = positionAttribute.getX(index); + const z = positionAttribute.getZ(index); + positionAttribute.setY(index, 2 + x * 0.25 + z * 0.75); + } + positionAttribute.needsUpdate = true; terrainGeometry.computeVertexNormals(); @@ -141,26 +146,42 @@ describe("RapierCollisionWorld", () => { const collisionWorld = await RapierCollisionWorld.create(runtimeScene.colliders, FIRST_PERSON_PLAYER_SHAPE); try { - const landing = collisionWorld.resolveFirstPersonMotion( + const highLanding = collisionWorld.resolveFirstPersonMotion( { - x: 0, - y: 2, - z: 0 + x: -2, + y: 6, + z: 2 }, { x: 0, - y: -3, + y: -8, + z: 0 + }, + FIRST_PERSON_PLAYER_SHAPE + ); + const lowLanding = collisionWorld.resolveFirstPersonMotion( + { + x: 2, + y: 6, + z: -2 + }, + { + x: 0, + y: -8, z: 0 }, FIRST_PERSON_PLAYER_SHAPE ); - expect(landing.grounded).toBe(true); - expect(landing.feetPosition.y).toBeGreaterThan(0.45); - expect(landing.feetPosition.y).toBeLessThan(0.55); + expect(highLanding.grounded).toBe(true); + expect(highLanding.feetPosition.y).toBeGreaterThan(2.9); + expect(highLanding.feetPosition.y).toBeLessThan(3.1); + expect(lowLanding.grounded).toBe(true); + expect(lowLanding.feetPosition.y).toBeGreaterThan(0.9); + expect(lowLanding.feetPosition.y).toBeLessThan(1.1); const traversed = collisionWorld.resolveFirstPersonMotion( - landing.feetPosition, + highLanding.feetPosition, { x: 1, y: 0, @@ -169,7 +190,8 @@ describe("RapierCollisionWorld", () => { FIRST_PERSON_PLAYER_SHAPE ); - expect(traversed.feetPosition.x).toBeGreaterThan(0.5); + expect(traversed.feetPosition.x).toBeGreaterThan(-1.5); + expect(traversed.feetPosition.y).toBeLessThan(highLanding.feetPosition.y); expect(traversed.collidedAxes.x).toBe(false); } finally { collisionWorld.dispose();