Enhance foliage rendering with quality controls and update view synchronization across hosts

This commit is contained in:
2026-05-02 10:52:00 +02:00
parent 590d255221
commit 60e6153570
4 changed files with 19 additions and 2 deletions

View File

@@ -194,6 +194,11 @@ import {
ADVANCED_RENDERING_SHADOW_MAP_SIZES, ADVANCED_RENDERING_SHADOW_MAP_SIZES,
ADVANCED_RENDERING_SHADOW_TYPES, ADVANCED_RENDERING_SHADOW_TYPES,
ADVANCED_RENDERING_TONE_MAPPING_MODES, ADVANCED_RENDERING_TONE_MAPPING_MODES,
FOLIAGE_QUALITY_SHADOW_MODES,
MAX_FOLIAGE_QUALITY_DENSITY_MULTIPLIER,
MAX_FOLIAGE_QUALITY_MAX_DISTANCE_MULTIPLIER,
MIN_FOLIAGE_QUALITY_DENSITY_MULTIPLIER,
MIN_FOLIAGE_QUALITY_MAX_DISTANCE_MULTIPLIER,
areWorldSettingsEqual, areWorldSettingsEqual,
changeWorldBackgroundMode, changeWorldBackgroundMode,
cloneWorldSettings, cloneWorldSettings,
@@ -211,6 +216,7 @@ import {
type AdvancedRenderingShadowMapSize, type AdvancedRenderingShadowMapSize,
type AdvancedRenderingShadowType, type AdvancedRenderingShadowType,
type AdvancedRenderingToneMappingMode, type AdvancedRenderingToneMappingMode,
type FoliageQualityShadowMode,
type WorldShaderSkySettings, type WorldShaderSkySettings,
type WorldSettings type WorldSettings
} from "../document/world-settings"; } from "../document/world-settings";
@@ -1150,6 +1156,10 @@ function readUnitIntervalNumberDraft(source: string, label: string): number {
return value; return value;
} }
function clampNumber(value: number, min: number, max: number): number {
return Math.min(max, Math.max(min, value));
}
function assertAdvancedRenderingDistanceFogRange( function assertAdvancedRenderingDistanceFogRange(
distanceFog: AdvancedRenderingDistanceFogSettings distanceFog: AdvancedRenderingDistanceFogSettings
) { ) {

View File

@@ -142,6 +142,7 @@ function scaleFoliageLayerRegistryDensities(
function createRenderViewFromCamera(camera: Camera): FoliageRenderView { function createRenderViewFromCamera(camera: Camera): FoliageRenderView {
camera.updateMatrixWorld(); camera.updateMatrixWorld();
camera.matrixWorldInverse.copy(camera.matrixWorld).invert();
const cameraPosition = new Vector3(); const cameraPosition = new Vector3();
camera.getWorldPosition(cameraPosition); camera.getWorldPosition(cameraPosition);
const projectionViewMatrix = new Matrix4().multiplyMatrices( const projectionViewMatrix = new Matrix4().multiplyMatrices(

View File

@@ -5030,8 +5030,10 @@ export class RuntimeHost {
this.foliageRenderer.sync({ this.foliageRenderer.sync({
terrains: runtimeScene.foliage.terrains, terrains: runtimeScene.foliage.terrains,
foliageLayers: runtimeScene.foliage.layers, foliageLayers: runtimeScene.foliage.layers,
foliagePrototypes: runtimeScene.foliage.prototypes foliagePrototypes: runtimeScene.foliage.prototypes,
quality: runtimeScene.world.advancedRendering.foliage
}); });
this.foliageRenderer.updateView(this.camera);
} }
private disposeUniqueMaterials(materials: Material[]) { private disposeUniqueMaterials(materials: Material[]) {
@@ -5363,6 +5365,7 @@ export class RuntimeHost {
} }
this.updateTerrainLodVisibility(); this.updateTerrainLodVisibility();
this.foliageRenderer.updateView(this.camera);
this.updateUnderwaterSceneFog(); this.updateUnderwaterSceneFog();
this.syncCelestialShadowState(); this.syncCelestialShadowState();

View File

@@ -6657,8 +6657,10 @@ export class ViewportHost {
this.foliageRenderer.sync({ this.foliageRenderer.sync({
terrains: document.terrains, terrains: document.terrains,
foliageLayers: document.foliageLayers, foliageLayers: document.foliageLayers,
foliagePrototypes: document.foliagePrototypes foliagePrototypes: document.foliagePrototypes,
quality: document.world.advancedRendering.foliage
}); });
this.foliageRenderer.updateView(this.getActiveCamera());
} }
private createTerrainRenderObjects(terrain: Terrain): TerrainRenderObjects { private createTerrainRenderObjects(terrain: Terrain): TerrainRenderObjects {
@@ -11569,6 +11571,7 @@ export class ViewportHost {
this.updateGridPositioning(); this.updateGridPositioning();
this.updateTransformGizmoPose(); this.updateTransformGizmoPose();
this.updateTerrainLodVisibility(); this.updateTerrainLodVisibility();
this.foliageRenderer.updateView(this.getActiveCamera());
this.volumeTime += dt; this.volumeTime += dt;
for (const uniform of this.volumeAnimatedUniforms) { for (const uniform of this.volumeAnimatedUniforms) {