From b7653af075529cd944d477c3cf0ad16b8395036d Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Wed, 13 May 2026 16:53:03 +0200 Subject: [PATCH] Add edge mesh generation for spline corridor junctions --- src/runtime-three/runtime-host.ts | 6 +++- src/viewport-three/viewport-host.ts | 50 +++++++++++++++++++++++------ 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/runtime-three/runtime-host.ts b/src/runtime-three/runtime-host.ts index 4d14b573..4ea00d77 100644 --- a/src/runtime-three/runtime-host.ts +++ b/src/runtime-three/runtime-host.ts @@ -82,7 +82,11 @@ import { buildSplineRoadEdgeMeshGeometry, buildSplineRoadMeshGeometry } from "../geometry/spline-road-mesh"; -import { buildSplineCorridorJunctionMeshGeometry } from "../geometry/spline-corridor-junction-mesh"; +import { + buildSplineCorridorJunctionEdgeMeshGeometry, + buildSplineCorridorJunctionMeshGeometry, + resolveSplineCorridorJunctionEdgeSettings +} from "../geometry/spline-corridor-junction-mesh"; import { createStarterMaterialSignature, createStarterMaterialTextureSet, diff --git a/src/viewport-three/viewport-host.ts b/src/viewport-three/viewport-host.ts index ca730bed..7c4208e6 100644 --- a/src/viewport-three/viewport-host.ts +++ b/src/viewport-three/viewport-host.ts @@ -208,7 +208,11 @@ import { buildSplineRoadEdgeMeshGeometry, buildSplineRoadMeshGeometry } from "../geometry/spline-road-mesh"; -import { buildSplineCorridorJunctionMeshGeometry } from "../geometry/spline-corridor-junction-mesh"; +import { + buildSplineCorridorJunctionEdgeMeshGeometry, + buildSplineCorridorJunctionMeshGeometry, + resolveSplineCorridorJunctionEdgeSettings +} from "../geometry/spline-corridor-junction-mesh"; import { detectSplineCorridorJunctionCandidates, resolveSplineCorridorJunctionClipIntervals @@ -7762,18 +7766,44 @@ export class ViewportHost { paths, terrains }); + const meshes: Array> = []; - if (geometry === null) { - return null; + if (geometry !== null) { + const mesh = new Mesh(geometry, this.createRoadJunctionMaterial(junction)); + mesh.castShadow = false; + mesh.receiveShadow = true; + mesh.userData.splineCorridorJunctionId = junction.id; + mesh.userData.nonPickable = true; + applyRendererRenderCategoryFromMaterial(mesh); + meshes.push(mesh); } - const mesh = new Mesh(geometry, this.createRoadJunctionMaterial(junction)); - mesh.castShadow = false; - mesh.receiveShadow = true; - mesh.userData.splineCorridorJunctionId = junction.id; - mesh.userData.nonPickable = true; - applyRendererRenderCategoryFromMaterial(mesh); - return { meshes: [mesh] }; + const edge = resolveSplineCorridorJunctionEdgeSettings({ + junction, + paths + }); + const edgeGeometry = + edge === null + ? null + : buildSplineCorridorJunctionEdgeMeshGeometry({ + junction, + paths, + terrains, + edge + }); + + if (edge !== null && edgeGeometry !== null) { + const edgeMesh = new Mesh(edgeGeometry, this.createRoadEdgeMaterial(edge)); + edgeMesh.castShadow = false; + edgeMesh.receiveShadow = true; + edgeMesh.userData.splineCorridorJunctionId = junction.id; + edgeMesh.userData.roadEdgeSide = "junction"; + edgeMesh.userData.nonPickable = true; + applyRendererRenderCategoryFromMaterial(edgeMesh); + meshes.push(edgeMesh); + } + + return meshes.length === 0 ? null : { meshes }; } private rebuildRoadSurfaces(document: SceneDocument) {