From 9d3317066be820dff59b676f79bc51328569e1bc Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Sat, 11 Apr 2026 11:20:53 +0200 Subject: [PATCH] Add unit test for RapierCollisionWorld --- tests/unit/rapier-collision-world.test.ts | 66 +++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 tests/unit/rapier-collision-world.test.ts diff --git a/tests/unit/rapier-collision-world.test.ts b/tests/unit/rapier-collision-world.test.ts new file mode 100644 index 00000000..dee517d9 --- /dev/null +++ b/tests/unit/rapier-collision-world.test.ts @@ -0,0 +1,66 @@ +import { describe, expect, it } from "vitest"; + +import { createBoxBrush } from "../../src/document/brushes"; +import { createEmptySceneDocument } from "../../src/document/scene-document"; +import { createPlayerStartEntity } from "../../src/entities/entity-instances"; +import { RapierCollisionWorld } from "../../src/runtime-three/rapier-collision-world"; +import { buildRuntimeSceneFromDocument } from "../../src/runtime-three/runtime-scene-build"; + +describe("RapierCollisionWorld", () => { + it("clamps a third-person camera boom before it clips through world geometry", async () => { + const wall = createBoxBrush({ + id: "brush-third-person-camera-wall", + center: { + x: 0, + y: 1.5, + z: -2.25 + }, + size: { + x: 6, + y: 3, + z: 0.5 + } + }); + const playerStart = createPlayerStartEntity({ + id: "entity-player-start-third-person", + navigationMode: "thirdPerson" + }); + const runtimeScene = buildRuntimeSceneFromDocument({ + ...createEmptySceneDocument({ name: "Third Person Camera Collision" }), + brushes: { + [wall.id]: wall + }, + entities: { + [playerStart.id]: playerStart + } + }); + const collisionWorld = await RapierCollisionWorld.create( + runtimeScene.colliders, + runtimeScene.playerCollider + ); + + try { + const desiredCameraPosition = { + x: 0, + y: 1.5, + z: -4 + }; + const resolvedCameraPosition = + collisionWorld.resolveThirdPersonCameraCollision( + { + x: 0, + y: 1.5, + z: 0 + }, + desiredCameraPosition, + 0.2 + ); + + expect(resolvedCameraPosition.z).toBeGreaterThan(desiredCameraPosition.z); + expect(resolvedCameraPosition.z).toBeGreaterThan(-2.05); + expect(resolvedCameraPosition.z).toBeLessThan(-1.6); + } finally { + collisionWorld.dispose(); + } + }); +});