From 3f64a3f67012ef2997f933cb2b117107de3b0ef0 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Wed, 13 May 2026 04:29:50 +0200 Subject: [PATCH] Add support for attaching spline corridor colliders --- src/runtime-three/rapier-collision-world.ts | 32 ++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/runtime-three/rapier-collision-world.ts b/src/runtime-three/rapier-collision-world.ts index cf00601b..23b8f57a 100644 --- a/src/runtime-three/rapier-collision-world.ts +++ b/src/runtime-three/rapier-collision-world.ts @@ -19,9 +19,10 @@ import { getFirstPersonPlayerShapeSignature } from "./player-collision"; import type { RuntimeBrushTriMeshCollider, RuntimeNpcCollider, + RuntimeSceneCollider, RuntimeTerrainHeightfieldCollider, - RuntimeSceneCollider } from "./runtime-scene-build"; +import type { SplineCorridorBoxCollider } from "../spline-corridor/spline-corridor-colliders"; const CHARACTER_CONTROLLER_OFFSET = 0.01; const CHARACTER_CONTROLLER_SNAP_TO_GROUND_DISTANCE = 0.2; @@ -146,6 +147,30 @@ function attachSimpleModelCollider(world: RAPIER.World, collider: GeneratedModel ); } +function attachSplineCorridorBoxCollider( + world: RAPIER.World, + collider: SplineCorridorBoxCollider +) { + const body = world.createRigidBody( + RAPIER.RigidBodyDesc.fixed() + .setTranslation( + collider.position.x, + collider.position.y, + collider.position.z + ) + .setRotation(createRapierQuaternion(collider.rotationDegrees)) + ); + + world.createCollider( + RAPIER.ColliderDesc.cuboid( + collider.size.x * 0.5, + collider.size.y * 0.5, + collider.size.z * 0.5 + ).setTranslation(collider.center.x, collider.center.y, collider.center.z), + body + ); +} + function attachStaticModelCollider(world: RAPIER.World, collider: GeneratedModelTriMeshCollider) { const body = createFixedBodyForModelCollider(world, collider); world.createCollider(RAPIER.ColliderDesc.trimesh(scaleVertices(collider.vertices, collider.transform.scale), collider.indices), body); @@ -444,6 +469,11 @@ export class RapierCollisionWorld { continue; } + if (collider.source === "splineCorridor") { + attachSplineCorridorBoxCollider(world, collider); + continue; + } + attachModelCollider(world, collider); }