From 0b5de5b6bcfe95c068c90d7a254c8584156ceb43 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Wed, 29 Apr 2026 23:14:33 +0200 Subject: [PATCH] Refactor terrain chunk structure and improve geometry disposal logic --- src/runtime-three/runtime-host.ts | 3 ++- src/viewport-three/viewport-host.ts | 17 ++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/runtime-three/runtime-host.ts b/src/runtime-three/runtime-host.ts index 4bfd09ef..30588b2a 100644 --- a/src/runtime-three/runtime-host.ts +++ b/src/runtime-three/runtime-host.ts @@ -240,7 +240,8 @@ interface CachedMaterialTexture { } interface RuntimeTerrainRenderChunkObjects { - levels: Mesh[]; + mesh: Mesh; + levelGeometries: BufferGeometry[]; activeLevelIndex: number; worldCenter: Vector3; diagonal: number; diff --git a/src/viewport-three/viewport-host.ts b/src/viewport-three/viewport-host.ts index 76be346a..25602313 100644 --- a/src/viewport-three/viewport-host.ts +++ b/src/viewport-three/viewport-host.ts @@ -8965,9 +8965,11 @@ export class ViewportHost { const nextMaterial = this.createTerrainMaterial(displayedTerrain); for (const chunk of renderObjects.chunks) { - for (const mesh of chunk.levels) { - mesh.material = nextMaterial; - } + chunk.mesh.material = nextMaterial; + } + + for (const pickMesh of renderObjects.pickMeshes) { + pickMesh.material = nextMaterial; } renderObjects.material = nextMaterial; @@ -9602,13 +9604,18 @@ export class ViewportHost { private clearTerrains() { for (const renderObjects of this.terrainRenderObjects.values()) { this.terrainGroup.remove(renderObjects.group); + const geometries = new Set(); for (const chunk of renderObjects.chunks) { - for (const mesh of chunk.levels) { - mesh.geometry.dispose(); + for (const geometry of chunk.levelGeometries) { + geometries.add(geometry); } } + for (const geometry of geometries) { + geometry.dispose(); + } + renderObjects.material.dispose(); for (const material of renderObjects.debugMaterials) {