From 6c782b453f60278500869e3df52f010c1790d726 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Wed, 13 May 2026 13:20:20 +0200 Subject: [PATCH] Apply path clip intervals to spline corridor collider generation --- .../spline-corridor-colliders.ts | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/spline-corridor/spline-corridor-colliders.ts b/src/spline-corridor/spline-corridor-colliders.ts index a489ab1c..3a225d69 100644 --- a/src/spline-corridor/spline-corridor-colliders.ts +++ b/src/spline-corridor/spline-corridor-colliders.ts @@ -12,6 +12,10 @@ import { } from "../document/terrains"; import { deriveSplineRepeaterInstances } from "./spline-repeaters"; +import { + isDistanceInSplineCorridorClipIntervals, + type SplineCorridorPathClipIntervalMap +} from "./spline-corridor-clips"; export interface SplineCorridorColliderPathPointLike { id?: string; @@ -220,6 +224,7 @@ function createBoxCollider(options: { function buildRepeaterColliders(options: { path: SplineCorridorColliderPathLike; terrains: readonly Terrain[]; + clipIntervalsByPath?: SplineCorridorPathClipIntervalMap; }): SplineCorridorBoxCollider[] { const collisionRepeaterIds = new Set( options.path.repeaters @@ -233,7 +238,8 @@ function buildRepeaterColliders(options: { return deriveSplineRepeaterInstances({ path: options.path, - terrains: options.terrains + terrains: options.terrains, + clipIntervals: options.clipIntervalsByPath?.get(options.path.id) }) .filter((instance) => collisionRepeaterIds.has(instance.repeaterId)) .map((instance, index) => { @@ -263,6 +269,7 @@ function buildRepeaterColliders(options: { function buildRoadEdgeColliders(options: { path: SplineCorridorColliderPathLike; terrains: readonly Terrain[]; + clipIntervalsByPath?: SplineCorridorPathClipIntervalMap; }): SplineCorridorBoxCollider[] { const { path, terrains } = options; @@ -290,6 +297,7 @@ function buildRoadEdgeColliders(options: { const colliders: SplineCorridorBoxCollider[] = []; const roadHalfWidth = path.road.width * 0.5; + const clipIntervals = options.clipIntervalsByPath?.get(path.id); for (const side of ["left", "right"] as const) { const edge = path.road.edges[side]; @@ -307,6 +315,13 @@ function buildRoadEdgeColliders(options: { return; } + const midpointDistance = + segment.distanceStart + (segment.distanceEnd - segment.distanceStart) * 0.5; + + if (isDistanceInSplineCorridorClipIntervals(midpointDistance, clipIntervals)) { + return; + } + const tangent = normalizeHorizontal(segment.tangent); if (tangent === null) { @@ -368,11 +383,20 @@ function buildRoadEdgeColliders(options: { export function deriveSplineCorridorBoxColliders(options: { paths: readonly SplineCorridorColliderPathLike[]; terrains?: readonly Terrain[]; + clipIntervalsByPath?: SplineCorridorPathClipIntervalMap; }): SplineCorridorBoxCollider[] { const terrains = options.terrains ?? []; return options.paths.flatMap((path) => [ - ...buildRoadEdgeColliders({ path, terrains }), - ...buildRepeaterColliders({ path, terrains }) + ...buildRoadEdgeColliders({ + path, + terrains, + clipIntervalsByPath: options.clipIntervalsByPath + }), + ...buildRepeaterColliders({ + path, + terrains, + clipIntervalsByPath: options.clipIntervalsByPath + }) ]); }