From c010602b45d87de9e5d638518bfcb295e23f13b0 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Thu, 21 May 2026 08:08:44 +0200 Subject: [PATCH] Feat: Add anti-aliasing support to scene document --- src/document/migrate-scene-document.ts | 28 ++++++++++++++++++++++- src/document/scene-document-validation.ts | 23 +++++++++++++++++++ src/document/scene-document.ts | 3 ++- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/document/migrate-scene-document.ts b/src/document/migrate-scene-document.ts index 6121207d..14ed3c6d 100644 --- a/src/document/migrate-scene-document.ts +++ b/src/document/migrate-scene-document.ts @@ -176,6 +176,7 @@ import { import { BOX_BRUSH_SCENE_DOCUMENT_VERSION, ANIMATION_PLAYBACK_SCENE_DOCUMENT_VERSION, + ANTI_ALIASING_SCENE_DOCUMENT_VERSION, ATMOSPHERE_POLISH_SCENE_DOCUMENT_VERSION, AUTHORED_TERRAIN_COLLISION_SCENE_DOCUMENT_VERSION, AUTHORED_TERRAIN_FOUNDATION_SCENE_DOCUMENT_VERSION, @@ -378,6 +379,7 @@ import { createDefaultWorldShaderSkySettings, DEFAULT_NIGHT_IMAGE_ENVIRONMENT_INTENSITY, MAX_ADVANCED_RENDERING_LENS_FLARE_GHOST_COUNT, + isAdvancedRenderingAntiAliasingMode, isAdvancedRenderingDynamicGlobalIlluminationQuality, isAdvancedRenderingWaterReflectionMode, createDefaultAdvancedRenderingSettings, @@ -886,6 +888,12 @@ function readAdvancedRenderingSettings( throw new Error("world.advancedRendering.toneMapping must be an object."); } + if (value.antiAliasing !== undefined && !isRecord(value.antiAliasing)) { + throw new Error( + "world.advancedRendering.antiAliasing must be an object." + ); + } + if (value.depthOfField !== undefined && !isRecord(value.depthOfField)) { throw new Error("world.advancedRendering.depthOfField must be an object."); } @@ -919,6 +927,9 @@ function readAdvancedRenderingSettings( | undefined; const bloom = value.bloom as Record | undefined; const toneMapping = value.toneMapping as Record | undefined; + const antiAliasing = value.antiAliasing as + | Record + | undefined; const depthOfField = value.depthOfField as | Record | undefined; @@ -948,6 +959,12 @@ function readAdvancedRenderingSettings( defaults.toneMapping.mode, isAdvancedRenderingToneMappingMode ); + const antiAliasingMode = readOptionalAllowedValue( + antiAliasing?.mode, + "world.advancedRendering.antiAliasing.mode", + defaults.antiAliasing.mode, + isAdvancedRenderingAntiAliasingMode + ); const dynamicGlobalIlluminationQuality = readOptionalAllowedValue( dynamicGlobalIllumination?.quality, "world.advancedRendering.dynamicGlobalIllumination.quality", @@ -1069,6 +1086,14 @@ function readAdvancedRenderingSettings( defaults.toneMapping.exposure ) }, + antiAliasing: { + enabled: readOptionalBoolean( + antiAliasing?.enabled, + "world.advancedRendering.antiAliasing.enabled", + defaults.antiAliasing.enabled + ), + mode: antiAliasingMode + }, depthOfField: { enabled: readOptionalBoolean( depthOfField?.enabled, @@ -6901,7 +6926,8 @@ export function migrateSceneDocument(source: unknown): SceneDocument { source.version !== NPC_TARGETING_SCENE_DOCUMENT_VERSION && source.version !== CUSTOM_PBR_MATERIALS_SCENE_DOCUMENT_VERSION && source.version !== LENS_FLARE_SCENE_DOCUMENT_VERSION && - source.version !== FOLIAGE_WIND_SCENE_DOCUMENT_VERSION + source.version !== FOLIAGE_WIND_SCENE_DOCUMENT_VERSION && + source.version !== ANTI_ALIASING_SCENE_DOCUMENT_VERSION ) { throw new Error( `Unsupported scene document version: ${String(source.version)}.` diff --git a/src/document/scene-document-validation.ts b/src/document/scene-document-validation.ts index 0ed4fb09..a2611f91 100644 --- a/src/document/scene-document-validation.ts +++ b/src/document/scene-document-validation.ts @@ -125,6 +125,7 @@ import { type Terrain } from "./terrains"; import { + isAdvancedRenderingAntiAliasingMode, isAdvancedRenderingWaterReflectionMode, isAdvancedRenderingDynamicGlobalIlluminationQuality, isAdvancedRenderingShadowMapSize, @@ -1135,6 +1136,28 @@ function validateWorldSettings( ); } + if (!isBoolean(advancedRendering.antiAliasing.enabled)) { + diagnostics.push( + createDiagnostic( + "error", + "invalid-advanced-rendering-anti-aliasing-enabled", + "Advanced rendering anti-aliasing enabled must be a boolean.", + "world.advancedRendering.antiAliasing.enabled" + ) + ); + } + + if (!isAdvancedRenderingAntiAliasingMode(advancedRendering.antiAliasing.mode)) { + diagnostics.push( + createDiagnostic( + "error", + "invalid-advanced-rendering-anti-aliasing-mode", + "Advanced rendering anti-aliasing mode must be smaa, fxaa, msaa2x, msaa4x, or msaa8x.", + "world.advancedRendering.antiAliasing.mode" + ) + ); + } + if (!isBoolean(advancedRendering.depthOfField.enabled)) { diagnostics.push( createDiagnostic( diff --git a/src/document/scene-document.ts b/src/document/scene-document.ts index 7563b8c3..b6747c73 100644 --- a/src/document/scene-document.ts +++ b/src/document/scene-document.ts @@ -36,7 +36,8 @@ import { type FoliagePrototypeRegistry } from "../foliage/foliage"; -export const SCENE_DOCUMENT_VERSION = 112 as const; +export const SCENE_DOCUMENT_VERSION = 113 as const; +export const ANTI_ALIASING_SCENE_DOCUMENT_VERSION = 113 as const; export const FOLIAGE_WIND_SCENE_DOCUMENT_VERSION = 112 as const; export const LENS_FLARE_SCENE_DOCUMENT_VERSION = 111 as const; export const CUSTOM_PBR_MATERIALS_SCENE_DOCUMENT_VERSION = 110 as const;