diff --git a/src/document/migrate-scene-document.ts b/src/document/migrate-scene-document.ts index 4c0b3471..6ed565ca 100644 --- a/src/document/migrate-scene-document.ts +++ b/src/document/migrate-scene-document.ts @@ -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 ) { diff --git a/src/document/scene-document-validation.ts b/src/document/scene-document-validation.ts index 3879e82f..8155a31e 100644 --- a/src/document/scene-document-validation.ts +++ b/src/document/scene-document-validation.ts @@ -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( diff --git a/src/document/scene-document.ts b/src/document/scene-document.ts index 0216ceea..14f4f553 100644 --- a/src/document/scene-document.ts +++ b/src/document/scene-document.ts @@ -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; diff --git a/src/document/world-settings.ts b/src/document/world-settings.ts index c0d9182c..c9b03447 100644 --- a/src/document/world-settings.ts +++ b/src/document/world-settings.ts @@ -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 &&