Implement advanced atmospheric rendering settings (sky blend, horizon strength, height falloff)

This commit is contained in:
2026-04-28 04:51:41 +02:00
parent e91a724b41
commit 404fd59751
4 changed files with 67 additions and 2 deletions

View File

@@ -165,6 +165,7 @@ import {
import {
BOX_BRUSH_SCENE_DOCUMENT_VERSION,
ANIMATION_PLAYBACK_SCENE_DOCUMENT_VERSION,
ATMOSPHERE_POLISH_SCENE_DOCUMENT_VERSION,
AUTHORED_TERRAIN_COLLISION_SCENE_DOCUMENT_VERSION,
AUTHORED_TERRAIN_FOUNDATION_SCENE_DOCUMENT_VERSION,
AUTHORED_TERRAIN_PAINT_SCENE_DOCUMENT_VERSION,
@@ -1019,6 +1020,21 @@ function readAdvancedRenderingSettings(
distanceFog?.renderDistance,
"world.advancedRendering.distanceFog.renderDistance",
defaults.distanceFog.renderDistance
),
skyBlend: readOptionalNonNegativeFiniteNumber(
distanceFog?.skyBlend,
"world.advancedRendering.distanceFog.skyBlend",
defaults.distanceFog.skyBlend
),
horizonStrength: readOptionalNonNegativeFiniteNumber(
distanceFog?.horizonStrength,
"world.advancedRendering.distanceFog.horizonStrength",
defaults.distanceFog.horizonStrength
),
heightFalloff: readOptionalNonNegativeFiniteNumber(
distanceFog?.heightFalloff,
"world.advancedRendering.distanceFog.heightFalloff",
defaults.distanceFog.heightFalloff
)
},
godRays: {
@@ -5679,6 +5695,7 @@ export function migrateSceneDocument(source: unknown): SceneDocument {
source.version !== DYNAMIC_GLOBAL_ILLUMINATION_SCENE_DOCUMENT_VERSION &&
source.version !== DISTANCE_FOG_SCENE_DOCUMENT_VERSION &&
source.version !== GOD_RAYS_SCENE_DOCUMENT_VERSION &&
source.version !== ATMOSPHERE_POLISH_SCENE_DOCUMENT_VERSION &&
source.version !== SCENE_DOCUMENT_VERSION &&
source.version !== FOLLOW_ACTOR_PATH_SMOOTH_SCENE_DOCUMENT_VERSION
) {

View File

@@ -1239,6 +1239,41 @@ function validateWorldSettings(
);
}
if (!isFiniteNumberInRange(advancedRendering.distanceFog.skyBlend, 0, 1)) {
diagnostics.push(
createDiagnostic(
"error",
"invalid-advanced-rendering-distance-fog-sky-blend",
"Advanced rendering distance fog sky blend must be a finite number between 0 and 1.",
"world.advancedRendering.distanceFog.skyBlend"
)
);
}
if (
!isFiniteNumberInRange(advancedRendering.distanceFog.horizonStrength, 0, 1)
) {
diagnostics.push(
createDiagnostic(
"error",
"invalid-advanced-rendering-distance-fog-horizon-strength",
"Advanced rendering distance fog horizon strength must be a finite number between 0 and 1.",
"world.advancedRendering.distanceFog.horizonStrength"
)
);
}
if (!isNonNegativeFiniteNumber(advancedRendering.distanceFog.heightFalloff)) {
diagnostics.push(
createDiagnostic(
"error",
"invalid-advanced-rendering-distance-fog-height-falloff",
"Advanced rendering distance fog height falloff must be a non-negative finite number.",
"world.advancedRendering.distanceFog.heightFalloff"
)
);
}
if (!isBoolean(advancedRendering.godRays.enabled)) {
diagnostics.push(
createDiagnostic(

View File

@@ -29,7 +29,8 @@ import {
} from "../sequencer/project-sequences";
import type { Terrain } from "./terrains";
export const SCENE_DOCUMENT_VERSION = 87 as const;
export const SCENE_DOCUMENT_VERSION = 88 as const;
export const ATMOSPHERE_POLISH_SCENE_DOCUMENT_VERSION = 88 as const;
export const GOD_RAYS_SCENE_DOCUMENT_VERSION = 87 as const;
export const DISTANCE_FOG_SCENE_DOCUMENT_VERSION = 86 as const;
export const DYNAMIC_GLOBAL_ILLUMINATION_SCENE_DOCUMENT_VERSION = 85 as const;

View File

@@ -174,6 +174,9 @@ export interface AdvancedRenderingDistanceFogSettings {
farDistance: number;
strength: number;
renderDistance: number;
skyBlend: number;
horizonStrength: number;
heightFalloff: number;
}
export interface AdvancedRenderingGodRaysSettings {
@@ -291,6 +294,9 @@ const DEFAULT_ADVANCED_RENDERING_DISTANCE_FOG_NEAR_DISTANCE = 70;
const DEFAULT_ADVANCED_RENDERING_DISTANCE_FOG_FAR_DISTANCE = 180;
const DEFAULT_ADVANCED_RENDERING_DISTANCE_FOG_STRENGTH = 0.85;
const DEFAULT_ADVANCED_RENDERING_DISTANCE_FOG_RENDER_DISTANCE = 220;
const DEFAULT_ADVANCED_RENDERING_DISTANCE_FOG_SKY_BLEND = 0.35;
const DEFAULT_ADVANCED_RENDERING_DISTANCE_FOG_HORIZON_STRENGTH = 0.55;
const DEFAULT_ADVANCED_RENDERING_DISTANCE_FOG_HEIGHT_FALLOFF = 0.012;
const DEFAULT_ADVANCED_RENDERING_GOD_RAYS_INTENSITY = 0.35;
const DEFAULT_ADVANCED_RENDERING_GOD_RAYS_DECAY = 0.92;
const DEFAULT_ADVANCED_RENDERING_GOD_RAYS_EXPOSURE = 0.28;
@@ -556,7 +562,10 @@ export function createDefaultAdvancedRenderingSettings(): AdvancedRenderingSetti
nearDistance: DEFAULT_ADVANCED_RENDERING_DISTANCE_FOG_NEAR_DISTANCE,
farDistance: DEFAULT_ADVANCED_RENDERING_DISTANCE_FOG_FAR_DISTANCE,
strength: DEFAULT_ADVANCED_RENDERING_DISTANCE_FOG_STRENGTH,
renderDistance: DEFAULT_ADVANCED_RENDERING_DISTANCE_FOG_RENDER_DISTANCE
renderDistance: DEFAULT_ADVANCED_RENDERING_DISTANCE_FOG_RENDER_DISTANCE,
skyBlend: DEFAULT_ADVANCED_RENDERING_DISTANCE_FOG_SKY_BLEND,
horizonStrength: DEFAULT_ADVANCED_RENDERING_DISTANCE_FOG_HORIZON_STRENGTH,
heightFalloff: DEFAULT_ADVANCED_RENDERING_DISTANCE_FOG_HEIGHT_FALLOFF
},
godRays: {
enabled: false,
@@ -1087,6 +1096,9 @@ export function areAdvancedRenderingSettingsEqual(
left.distanceFog.farDistance === right.distanceFog.farDistance &&
left.distanceFog.strength === right.distanceFog.strength &&
left.distanceFog.renderDistance === right.distanceFog.renderDistance &&
left.distanceFog.skyBlend === right.distanceFog.skyBlend &&
left.distanceFog.horizonStrength === right.distanceFog.horizonStrength &&
left.distanceFog.heightFalloff === right.distanceFog.heightFalloff &&
left.godRays.enabled === right.godRays.enabled &&
left.godRays.intensity === right.godRays.intensity &&
left.godRays.decay === right.godRays.decay &&