auto-git:

[change] src/viewport-three/viewport-host.ts
This commit is contained in:
2026-05-01 17:43:08 +02:00
parent 00ca856c52
commit 4a22b5d3e8

View File

@@ -1250,6 +1250,30 @@ export class ViewportHost {
this.currentSimulationMembershipSignatures = nextMembershipSignatures; this.currentSimulationMembershipSignatures = nextMembershipSignatures;
} }
private canReuseTerrainRenderObjectsForDocument(
previousDocument: SceneDocument | null,
nextDocument: SceneDocument
): boolean {
if (
previousDocument === null ||
previousDocument.materials !== nextDocument.materials
) {
return false;
}
const previousTerrainIds = Object.keys(previousDocument.terrains);
const nextTerrainIds = Object.keys(nextDocument.terrains);
if (previousTerrainIds.length !== nextTerrainIds.length) {
return false;
}
return nextTerrainIds.every(
(terrainId) =>
previousDocument.terrains[terrainId] === nextDocument.terrains[terrainId]
);
}
updateSelection(selection: EditorSelection, activeSelectionId: string | null) { updateSelection(selection: EditorSelection, activeSelectionId: string | null) {
const previousSelection = this.currentSelection; const previousSelection = this.currentSelection;
const selectionChanged = !areEditorSelectionsEqual( const selectionChanged = !areEditorSelectionsEqual(
@@ -1280,6 +1304,12 @@ export class ViewportHost {
} }
updateDocument(document: SceneDocument) { updateDocument(document: SceneDocument) {
const reuseTerrainRenderObjects =
this.canReuseTerrainRenderObjectsForDocument(
this.currentDocument,
document
);
this.activeTerrainBrushStroke = null; this.activeTerrainBrushStroke = null;
this.currentDocument = document; this.currentDocument = document;
this.viewportSceneBounds = resolveViewportDocumentBounds(document); this.viewportSceneBounds = resolveViewportDocumentBounds(document);
@@ -1289,11 +1319,16 @@ export class ViewportHost {
this.rebuildLocalLights(document); this.rebuildLocalLights(document);
this.rebuildLightVolumes(document); this.rebuildLightVolumes(document);
this.rebuildBrushMeshes(document, this.currentSelection); this.rebuildBrushMeshes(document, this.currentSelection);
this.rebuildTerrains( if (reuseTerrainRenderObjects) {
document, this.updateTerrainLodVisibility();
this.currentSelection, this.syncTerrainBrushPreview();
this.currentActiveSelectionId } else {
); this.rebuildTerrains(
document,
this.currentSelection,
this.currentActiveSelectionId
);
}
this.rebuildPaths(document, this.currentSelection); this.rebuildPaths(document, this.currentSelection);
this.rebuildEntityMarkers(document, this.currentSelection); this.rebuildEntityMarkers(document, this.currentSelection);
this.rebuildModelInstances(document, this.currentSelection); this.rebuildModelInstances(document, this.currentSelection);