From f4714e8c2559371f6a80457ca50e3ee26f457c76 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Tue, 7 Apr 2026 06:29:31 +0200 Subject: [PATCH] Add foamContactLimit to BoxBrushWaterSettings and waterReflectionMode to AdvancedRenderingSettings --- src/document/brushes.ts | 13 ++++++++++--- src/document/world-settings.ts | 17 ++++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/document/brushes.ts b/src/document/brushes.ts index d6796d36..82ad6864 100644 --- a/src/document/brushes.ts +++ b/src/document/brushes.ts @@ -87,6 +87,7 @@ export interface BoxBrushWaterSettings { colorHex: string; surfaceOpacity: number; waveStrength: number; + foamContactLimit: number; } export interface BoxBrushFogSettings { @@ -150,10 +151,14 @@ export const DEFAULT_BOX_BRUSH_ROTATION_DEGREES: Vec3 = { z: 0 }; +export const DEFAULT_BOX_BRUSH_WATER_FOAM_CONTACT_LIMIT = 6; +export const MAX_BOX_BRUSH_WATER_FOAM_CONTACT_LIMIT = 24; + const DEFAULT_BOX_BRUSH_WATER_SETTINGS: BoxBrushWaterSettings = { colorHex: "#4da6d9", surfaceOpacity: 0.55, - waveStrength: 0.35 + waveStrength: 0.35, + foamContactLimit: DEFAULT_BOX_BRUSH_WATER_FOAM_CONTACT_LIMIT }; const DEFAULT_BOX_BRUSH_FOG_SETTINGS: BoxBrushFogSettings = { @@ -424,7 +429,8 @@ export function createDefaultBoxBrushWaterSettings(): BoxBrushWaterSettings { return { colorHex: DEFAULT_BOX_BRUSH_WATER_SETTINGS.colorHex, surfaceOpacity: DEFAULT_BOX_BRUSH_WATER_SETTINGS.surfaceOpacity, - waveStrength: DEFAULT_BOX_BRUSH_WATER_SETTINGS.waveStrength + waveStrength: DEFAULT_BOX_BRUSH_WATER_SETTINGS.waveStrength, + foamContactLimit: DEFAULT_BOX_BRUSH_WATER_SETTINGS.foamContactLimit }; } @@ -454,7 +460,8 @@ export function cloneBoxBrushVolumeSettings(volume: BoxBrushVolumeSettings): Box water: { colorHex: volume.water.colorHex, surfaceOpacity: volume.water.surfaceOpacity, - waveStrength: volume.water.waveStrength + waveStrength: volume.water.waveStrength, + foamContactLimit: volume.water.foamContactLimit } }; case "fog": diff --git a/src/document/world-settings.ts b/src/document/world-settings.ts index fa6ee40f..07b35522 100644 --- a/src/document/world-settings.ts +++ b/src/document/world-settings.ts @@ -6,11 +6,13 @@ export const ADVANCED_RENDERING_SHADOW_MAP_SIZES = [512, 1024, 2048, 4096] as co export const ADVANCED_RENDERING_SHADOW_TYPES = ["basic", "pcf", "pcfSoft"] as const; export const ADVANCED_RENDERING_TONE_MAPPING_MODES = ["none", "linear", "reinhard", "cineon", "acesFilmic"] as const; export const BOX_VOLUME_RENDER_PATHS = ["performance", "quality"] as const; +export const ADVANCED_RENDERING_WATER_REFLECTION_MODES = ["none", "world", "all"] as const; export type AdvancedRenderingShadowMapSize = (typeof ADVANCED_RENDERING_SHADOW_MAP_SIZES)[number]; export type AdvancedRenderingShadowType = (typeof ADVANCED_RENDERING_SHADOW_TYPES)[number]; export type AdvancedRenderingToneMappingMode = (typeof ADVANCED_RENDERING_TONE_MAPPING_MODES)[number]; export type BoxVolumeRenderPath = (typeof BOX_VOLUME_RENDER_PATHS)[number]; +export type AdvancedRenderingWaterReflectionMode = (typeof ADVANCED_RENDERING_WATER_REFLECTION_MODES)[number]; export interface WorldSolidBackgroundSettings { mode: "solid"; @@ -87,6 +89,7 @@ export interface AdvancedRenderingSettings { depthOfField: AdvancedRenderingDepthOfFieldSettings; fogPath: BoxVolumeRenderPath; waterPath: BoxVolumeRenderPath; + waterReflectionMode: AdvancedRenderingWaterReflectionMode; } export interface WorldSettings { @@ -114,6 +117,7 @@ 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; const DEFAULT_BOX_VOLUME_RENDER_PATH: BoxVolumeRenderPath = "performance"; +const DEFAULT_ADVANCED_RENDERING_WATER_REFLECTION_MODE: AdvancedRenderingWaterReflectionMode = "none"; export function isAdvancedRenderingShadowMapSize(value: unknown): value is AdvancedRenderingShadowMapSize { return ADVANCED_RENDERING_SHADOW_MAP_SIZES.includes(value as AdvancedRenderingShadowMapSize); @@ -131,6 +135,10 @@ export function isBoxVolumeRenderPath(value: unknown): value is BoxVolumeRenderP return BOX_VOLUME_RENDER_PATHS.includes(value as BoxVolumeRenderPath); } +export function isAdvancedRenderingWaterReflectionMode(value: unknown): value is AdvancedRenderingWaterReflectionMode { + return ADVANCED_RENDERING_WATER_REFLECTION_MODES.includes(value as AdvancedRenderingWaterReflectionMode); +} + export function createDefaultAdvancedRenderingSettings(): AdvancedRenderingSettings { return { enabled: false, @@ -163,7 +171,8 @@ export function createDefaultAdvancedRenderingSettings(): AdvancedRenderingSetti bokehScale: DEFAULT_ADVANCED_RENDERING_DEPTH_OF_FIELD_BOKEH_SCALE }, fogPath: DEFAULT_BOX_VOLUME_RENDER_PATH, - waterPath: DEFAULT_BOX_VOLUME_RENDER_PATH + waterPath: DEFAULT_BOX_VOLUME_RENDER_PATH, + waterReflectionMode: DEFAULT_ADVANCED_RENDERING_WATER_REFLECTION_MODE }; } @@ -254,7 +263,8 @@ export function cloneAdvancedRenderingSettings(settings: AdvancedRenderingSettin ...settings.depthOfField }, fogPath: settings.fogPath, - waterPath: settings.waterPath + waterPath: settings.waterPath, + waterReflectionMode: settings.waterReflectionMode }; } @@ -310,7 +320,8 @@ export function areAdvancedRenderingSettingsEqual(left: AdvancedRenderingSetting left.depthOfField.focalLength === right.depthOfField.focalLength && left.depthOfField.bokehScale === right.depthOfField.bokehScale && left.fogPath === right.fogPath && - left.waterPath === right.waterPath + left.waterPath === right.waterPath && + left.waterReflectionMode === right.waterReflectionMode ); }