diff --git a/src/viewport-three/viewport-host.ts b/src/viewport-three/viewport-host.ts index 19c52273..6cb00037 100644 --- a/src/viewport-three/viewport-host.ts +++ b/src/viewport-three/viewport-host.ts @@ -1325,6 +1325,7 @@ export class ViewportHost { this.rebuildLightVolumes(document); this.rebuildBrushMeshes(document, this.currentSelection); if (reuseTerrainRenderObjects) { + this.refreshReusedTerrainRenderDirtyChunks(document); this.updateTerrainLodVisibility(); this.syncTerrainBrushPreview(); } else { @@ -6534,6 +6535,10 @@ export class ViewportHost { const renderObjects = this.createTerrainRenderObjects(displayedTerrain); this.terrainGroup.add(renderObjects.group); this.terrainRenderObjects.set(displayedTerrain.id, renderObjects); + this.terrainRenderRevisions.set( + displayedTerrain.id, + getTerrainRenderDirtyRevision(displayedTerrain) + ); } this.applyShadowState(); @@ -6660,6 +6665,30 @@ export class ViewportHost { } } + private refreshReusedTerrainRenderDirtyChunks(document: SceneDocument) { + for (const terrain of getTerrains(document.terrains)) { + const renderObjects = this.terrainRenderObjects.get(terrain.id); + + if (renderObjects === undefined) { + continue; + } + + const previousRevision = this.terrainRenderRevisions.get(terrain.id) ?? 0; + const dirtyState = getTerrainRenderDirtyBoundsSince( + terrain, + previousRevision + ); + + this.terrainRenderRevisions.set(terrain.id, dirtyState.revision); + + if (dirtyState.dirtyBounds === null) { + continue; + } + + this.refreshDisplayedTerrainDirtyBounds(terrain.id, dirtyState.dirtyBounds); + } + } + private createPathLineGeometry(path: ScenePath): BufferGeometry { const points = path.points.map( (point) =>