Improve foliage rendering and visibility synchronization in ViewportHost

This commit is contained in:
2026-05-02 04:55:16 +02:00
parent 6e312864ac
commit efbc6359a0
3 changed files with 29 additions and 5 deletions

View File

@@ -18,7 +18,6 @@ import {
} from "./foliage-render-batches"; } from "./foliage-render-batches";
import type { import type {
FoliageLayerRegistry, FoliageLayerRegistry,
FoliagePrototype,
FoliagePrototypeRegistry FoliagePrototypeRegistry
} from "./foliage"; } from "./foliage";
import { import {
@@ -203,7 +202,7 @@ export class FoliageInstancedRenderer {
return; return;
} }
void this.rebuildBatchesAsync(requestId, batches, prototypeRegistry); void this.rebuildBatchesAsync(requestId, batches);
} }
dispose() { dispose() {
@@ -232,8 +231,7 @@ export class FoliageInstancedRenderer {
private async rebuildBatchesAsync( private async rebuildBatchesAsync(
requestId: number, requestId: number,
batches: readonly FoliageRenderBatch[], batches: readonly FoliageRenderBatch[]
_prototypeRegistry: FoliagePrototypeRegistry
) { ) {
const nextBatchGroup = new Group(); const nextBatchGroup = new Group();
nextBatchGroup.name = "foliageInstancedBatches"; nextBatchGroup.name = "foliageInstancedBatches";

View File

@@ -1706,6 +1706,7 @@ export class ViewportHost {
this.applyViewModePose(); this.applyViewModePose();
this.applyAdvancedRenderingCameraFar(this.currentAdvancedRenderingSettings); this.applyAdvancedRenderingCameraFar(this.currentAdvancedRenderingSettings);
this.syncFoliageVisibility();
this.syncTerrainBrushPreview(); this.syncTerrainBrushPreview();
if (this.currentAdvancedRenderingSettings !== null) { if (this.currentAdvancedRenderingSettings !== null) {
@@ -1720,6 +1721,7 @@ export class ViewportHost {
this.displayMode = displayMode; this.displayMode = displayMode;
this.applyWorld(); this.applyWorld();
this.syncFoliageVisibility();
if (this.currentDocument !== null) { if (this.currentDocument !== null) {
this.updateDocument(this.currentDocument); this.updateDocument(this.currentDocument);
@@ -2550,6 +2552,11 @@ export class ViewportHost {
applyAdvancedRenderingRenderableShadowFlags(renderObjects.group, false); applyAdvancedRenderingRenderableShadowFlags(renderObjects.group, false);
} }
applyAdvancedRenderingRenderableShadowFlags(
this.foliageRenderer.group,
shadowsEnabled
);
for (const renderGroup of this.modelRenderObjects.values()) { for (const renderGroup of this.modelRenderObjects.values()) {
applyAdvancedRenderingRenderableShadowFlags(renderGroup, shadowsEnabled); applyAdvancedRenderingRenderableShadowFlags(renderGroup, shadowsEnabled);
} }
@@ -6629,6 +6636,20 @@ export class ViewportHost {
this.syncTerrainBrushPreview(); this.syncTerrainBrushPreview();
} }
private syncFoliageVisibility() {
this.foliageRenderer.group.visible =
this.viewMode === "perspective" && this.displayMode !== "wireframe";
}
private rebuildFoliage(document: SceneDocument) {
this.syncFoliageVisibility();
this.foliageRenderer.sync({
terrains: document.terrains,
foliageLayers: document.foliageLayers,
foliagePrototypes: document.foliagePrototypes
});
}
private createTerrainRenderObjects(terrain: Terrain): TerrainRenderObjects { private createTerrainRenderObjects(terrain: Terrain): TerrainRenderObjects {
const detailMaterial = this.createTerrainMaterial(terrain); const detailMaterial = this.createTerrainMaterial(terrain);
const distantMaterial = this.createTerrainDistantMaterial(terrain); const distantMaterial = this.createTerrainDistantMaterial(terrain);

View File

@@ -10,7 +10,10 @@ import {
import { createBoxBrush } from "../../src/document/brushes"; import { createBoxBrush } from "../../src/document/brushes";
import { createScenePath } from "../../src/document/paths"; import { createScenePath } from "../../src/document/paths";
import { createDefaultProjectTimeSettings } from "../../src/document/project-time-settings"; import { createDefaultProjectTimeSettings } from "../../src/document/project-time-settings";
import { createTerrain } from "../../src/document/terrains"; import {
createTerrain,
createTerrainFoliageMask
} from "../../src/document/terrains";
import { import {
createEmptyProjectDocument, createEmptyProjectDocument,
createEmptyProjectScene, createEmptyProjectScene,
@@ -44,6 +47,8 @@ import { createProjectSequence } from "../../src/sequencer/project-sequences";
import { createModelInstance } from "../../src/assets/model-instances"; import { createModelInstance } from "../../src/assets/model-instances";
import { createProjectAssetStorageKey, type AudioAssetRecord } from "../../src/assets/project-assets"; import { createProjectAssetStorageKey, type AudioAssetRecord } from "../../src/assets/project-assets";
import { buildRuntimeSceneFromDocument } from "../../src/runtime-three/runtime-scene-build"; import { buildRuntimeSceneFromDocument } from "../../src/runtime-three/runtime-scene-build";
import { BUNDLED_FOLIAGE_PROTOTYPES } from "../../src/foliage/bundled-foliage-manifest";
import { createFoliageLayer } from "../../src/foliage/foliage";
import { createFixtureLoadedModelAssetFromGeometry } from "../helpers/model-collider-fixtures"; import { createFixtureLoadedModelAssetFromGeometry } from "../helpers/model-collider-fixtures";
const defaultMovementTemplate = createPlayerStartMovementTemplate(); const defaultMovementTemplate = createPlayerStartMovementTemplate();