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_TYPES,
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,
changeWorldBackgroundMode,
cloneWorldSettings,
@@ -211,6 +216,7 @@ import {
type AdvancedRenderingShadowMapSize,
type AdvancedRenderingShadowType,
type AdvancedRenderingToneMappingMode,
type FoliageQualityShadowMode,
type WorldShaderSkySettings,
type WorldSettings
} from "../document/world-settings";
@@ -1150,6 +1156,10 @@ function readUnitIntervalNumberDraft(source: string, label: string): number {
return value;
}
function clampNumber(value: number, min: number, max: number): number {
return Math.min(max, Math.max(min, value));
}
function assertAdvancedRenderingDistanceFogRange(
distanceFog: AdvancedRenderingDistanceFogSettings
) {

View File

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

View File

@@ -5030,8 +5030,10 @@ export class RuntimeHost {
this.foliageRenderer.sync({
terrains: runtimeScene.foliage.terrains,
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[]) {
@@ -5363,6 +5365,7 @@ export class RuntimeHost {
}
this.updateTerrainLodVisibility();
this.foliageRenderer.updateView(this.camera);
this.updateUnderwaterSceneFog();
this.syncCelestialShadowState();

View File

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