From b5101a1119a2c78a9c287f498c62c19edbfa9870 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Sat, 2 May 2026 04:18:07 +0200 Subject: [PATCH] Implement foliage mask preview logic for terrain materials --- src/viewport-three/viewport-host.ts | 32 +++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/viewport-three/viewport-host.ts b/src/viewport-three/viewport-host.ts index 110f8e6a..26b6c19d 100644 --- a/src/viewport-three/viewport-host.ts +++ b/src/viewport-three/viewport-host.ts @@ -6493,6 +6493,26 @@ export class ViewportHost { return this.currentDocument.materials[materialId] ?? null; } + private getTerrainFoliageMaskPreviewLayerId(terrainId: string): string | null { + if ( + this.currentTerrainBrushState === null || + this.currentTerrainBrushState.terrainId !== terrainId || + (this.currentTerrainBrushState.tool !== "foliagePaint" && + this.currentTerrainBrushState.tool !== "foliageErase") + ) { + return null; + } + + return this.currentTerrainBrushState.foliageLayerId; + } + + private getTerrainFoliageMaskPreviewColor(terrainId: string): number { + return this.currentTerrainBrushState?.terrainId === terrainId && + this.currentTerrainBrushState.tool === "foliageErase" + ? TERRAIN_BRUSH_PREVIEW_FOLIAGE_ERASE_COLOR + : TERRAIN_BRUSH_PREVIEW_FOLIAGE_PAINT_COLOR; + } + private createTerrainMaterial(terrain: Terrain): Material { const selected = isTerrainSelected(this.currentSelection, terrain.id); const hovered = isTerrainSelected(this.hoveredSelection, terrain.id); @@ -6521,6 +6541,12 @@ export class ViewportHost { return createTerrainLayerBlendMaterial({ layerTextures, + foliageMaskPreviewColorHex: + this.getTerrainFoliageMaskPreviewColor(terrain.id), + foliageMaskPreviewOpacity: + this.getTerrainFoliageMaskPreviewLayerId(terrain.id) === null + ? 0 + : 0.62, emissiveHex: active ? TERRAIN_ACTIVE_EMISSIVE : selected @@ -6542,6 +6568,12 @@ export class ViewportHost { return createTerrainLayerColorBlendMaterial({ layerColors, + foliageMaskPreviewColorHex: + this.getTerrainFoliageMaskPreviewColor(terrain.id), + foliageMaskPreviewOpacity: + this.getTerrainFoliageMaskPreviewLayerId(terrain.id) === null + ? 0 + : 0.62, emissiveHex: active ? TERRAIN_ACTIVE_EMISSIVE : selected