From 753f66e2e682a75b83cd47493e2b14d608090bc1 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Thu, 21 May 2026 08:08:13 +0200 Subject: [PATCH] Feature: Implement anti-aliasing support in advanced rendering settings --- src/document/world-settings.ts | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/document/world-settings.ts b/src/document/world-settings.ts index afd930e5..655fe1c8 100644 --- a/src/document/world-settings.ts +++ b/src/document/world-settings.ts @@ -26,6 +26,13 @@ export const ADVANCED_RENDERING_TONE_MAPPING_MODES = [ "cineon", "acesFilmic" ] as const; +export const ADVANCED_RENDERING_ANTI_ALIASING_MODES = [ + "smaa", + "fxaa", + "msaa2x", + "msaa4x", + "msaa8x" +] as const; export const BOX_VOLUME_RENDER_PATHS = ["performance", "quality"] as const; export const ADVANCED_RENDERING_WATER_REFLECTION_MODES = [ "none", @@ -52,6 +59,8 @@ export type AdvancedRenderingShadowType = (typeof ADVANCED_RENDERING_SHADOW_TYPES)[number]; export type AdvancedRenderingToneMappingMode = (typeof ADVANCED_RENDERING_TONE_MAPPING_MODES)[number]; +export type AdvancedRenderingAntiAliasingMode = + (typeof ADVANCED_RENDERING_ANTI_ALIASING_MODES)[number]; export type BoxVolumeRenderPath = (typeof BOX_VOLUME_RENDER_PATHS)[number]; export type AdvancedRenderingWaterReflectionMode = (typeof ADVANCED_RENDERING_WATER_REFLECTION_MODES)[number]; @@ -165,6 +174,11 @@ export interface AdvancedRenderingToneMappingSettings { exposure: number; } +export interface AdvancedRenderingAntiAliasingSettings { + enabled: boolean; + mode: AdvancedRenderingAntiAliasingMode; +} + export interface AdvancedRenderingDepthOfFieldSettings { enabled: boolean; focusDistance: number; @@ -226,6 +240,7 @@ export interface AdvancedRenderingSettings { dynamicGlobalIllumination: AdvancedRenderingDynamicGlobalIlluminationSettings; bloom: AdvancedRenderingBloomSettings; toneMapping: AdvancedRenderingToneMappingSettings; + antiAliasing: AdvancedRenderingAntiAliasingSettings; depthOfField: AdvancedRenderingDepthOfFieldSettings; whiteboxBevel: AdvancedRenderingWhiteboxBevelSettings; distanceFog: AdvancedRenderingDistanceFogSettings; @@ -317,6 +332,9 @@ const DEFAULT_ADVANCED_RENDERING_BLOOM_RADIUS = 0.35; const DEFAULT_ADVANCED_RENDERING_TONE_MAPPING_MODE: AdvancedRenderingToneMappingMode = "acesFilmic"; const DEFAULT_ADVANCED_RENDERING_TONE_MAPPING_EXPOSURE = 1; +const DEFAULT_ADVANCED_RENDERING_ANTI_ALIASING_ENABLED = true; +const DEFAULT_ADVANCED_RENDERING_ANTI_ALIASING_MODE: AdvancedRenderingAntiAliasingMode = + "smaa"; const DEFAULT_ADVANCED_RENDERING_DEPTH_OF_FIELD_FOCUS_DISTANCE = 10; const DEFAULT_ADVANCED_RENDERING_DEPTH_OF_FIELD_FOCAL_LENGTH = 0.03; const DEFAULT_ADVANCED_RENDERING_DEPTH_OF_FIELD_BOKEH_SCALE = 1.5; @@ -538,6 +556,14 @@ export function isAdvancedRenderingToneMappingMode( ); } +export function isAdvancedRenderingAntiAliasingMode( + value: unknown +): value is AdvancedRenderingAntiAliasingMode { + return ADVANCED_RENDERING_ANTI_ALIASING_MODES.includes( + value as AdvancedRenderingAntiAliasingMode + ); +} + export function isBoxVolumeRenderPath( value: unknown ): value is BoxVolumeRenderPath { @@ -694,6 +720,10 @@ export function createDefaultAdvancedRenderingSettings(): AdvancedRenderingSetti mode: DEFAULT_ADVANCED_RENDERING_TONE_MAPPING_MODE, exposure: DEFAULT_ADVANCED_RENDERING_TONE_MAPPING_EXPOSURE }, + antiAliasing: { + enabled: DEFAULT_ADVANCED_RENDERING_ANTI_ALIASING_ENABLED, + mode: DEFAULT_ADVANCED_RENDERING_ANTI_ALIASING_MODE + }, depthOfField: { enabled: false, focusDistance: DEFAULT_ADVANCED_RENDERING_DEPTH_OF_FIELD_FOCUS_DISTANCE, @@ -1050,6 +1080,9 @@ export function cloneAdvancedRenderingSettings( toneMapping: { ...settings.toneMapping }, + antiAliasing: { + ...settings.antiAliasing + }, depthOfField: { ...settings.depthOfField }, @@ -1246,6 +1279,8 @@ export function areAdvancedRenderingSettingsEqual( left.bloom.radius === right.bloom.radius && left.toneMapping.mode === right.toneMapping.mode && left.toneMapping.exposure === right.toneMapping.exposure && + left.antiAliasing.enabled === right.antiAliasing.enabled && + left.antiAliasing.mode === right.antiAliasing.mode && left.depthOfField.enabled === right.depthOfField.enabled && left.depthOfField.focusDistance === right.depthOfField.focusDistance && left.depthOfField.focalLength === right.depthOfField.focalLength &&