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) {