From b601634dce79ff14e54551a45a25e67f6f2f67cd Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Mon, 18 May 2026 15:39:53 +0200 Subject: [PATCH] Refactor terrain raycasting: Extract object collection logic into a dedicated helper function and update ViewportHost to use terrain-specific IDs. --- src/viewport-three/viewport-host.ts | 55 +++++++++++++---------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/src/viewport-three/viewport-host.ts b/src/viewport-three/viewport-host.ts index 462d013f..4d01179b 100644 --- a/src/viewport-three/viewport-host.ts +++ b/src/viewport-three/viewport-host.ts @@ -409,6 +409,22 @@ interface TerrainRenderObjects { pickMeshes: Mesh[]; } +export function collectTerrainBrushRaycastObjectsForTerrain( + terrainRenderObjects: ReadonlyMap< + string, + { + pickMeshes: readonly Object3D[]; + } + >, + targetTerrainId: string +): Object3D[] { + const renderObjects = terrainRenderObjects.get(targetTerrainId); + + return renderObjects === undefined + ? [] + : Array.from(renderObjects.pickMeshes); +} + interface TerrainRenderChunkObjects { mesh: Mesh; debugMesh: Mesh; @@ -11957,34 +11973,11 @@ export class ViewportHost { return null; } - private getTerrainBrushRaycastObjects(): Object3D[] { - const raycastObjects: Object3D[] = []; - - for (const renderObjects of this.brushRenderObjects.values()) { - raycastObjects.push(renderObjects.mesh); - } - - if (this.currentDocument !== null) { - for (const [entityId, renderObjects] of this.entityRenderObjects) { - const entity = this.currentDocument.entities[entityId]; - - if (entity?.kind !== "triggerVolume") { - continue; - } - - raycastObjects.push(renderObjects.group); - } - } - - for (const renderObjects of this.terrainRenderObjects.values()) { - raycastObjects.push(...renderObjects.pickMeshes); - } - - for (const renderGroup of this.modelRenderObjects.values()) { - raycastObjects.push(renderGroup); - } - - return raycastObjects; + private getTerrainBrushRaycastObjects(terrainId: string): Object3D[] { + return collectTerrainBrushRaycastObjectsForTerrain( + this.terrainRenderObjects, + terrainId + ); } private getTerrainBrushHitAtClientPosition( @@ -11999,7 +11992,9 @@ export class ViewportHost { return null; } - const raycastObjects = this.getTerrainBrushRaycastObjects(); + const targetTerrainId = this.currentTerrainBrushState.terrainId; + const raycastObjects = + this.getTerrainBrushRaycastObjects(targetTerrainId); if (raycastObjects.length === 0) { return null; @@ -12014,7 +12009,7 @@ export class ViewportHost { const terrainId = this.extractTerrainIdFromObject(hit.object); - if (terrainId !== this.currentTerrainBrushState.terrainId) { + if (terrainId !== targetTerrainId) { return null; }