From ad9790e7504192df87ab2fe30faf6b4e69cb5be0 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Sun, 12 Apr 2026 01:03:50 +0200 Subject: [PATCH] Add support for whitebox bevel in scene document --- src/document/migrate-scene-document.ts | 26 +++++++++++++++++ src/document/scene-document-validation.ts | 35 +++++++++++++++++++++++ src/document/scene-document.ts | 3 +- 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/document/migrate-scene-document.ts b/src/document/migrate-scene-document.ts index aef73ac4..f89b7670 100644 --- a/src/document/migrate-scene-document.ts +++ b/src/document/migrate-scene-document.ts @@ -105,6 +105,7 @@ import { TRIGGER_ACTION_TARGET_FOUNDATION_SCENE_DOCUMENT_VERSION, RUNNER_LOADING_SCREEN_SCENE_DOCUMENT_VERSION, WATER_SURFACE_DISPLACEMENT_SCENE_DOCUMENT_VERSION, + WHITEBOX_BEVEL_SCENE_DOCUMENT_VERSION, WHITEBOX_BOX_VOLUME_SCENE_DOCUMENT_VERSION, WHITEBOX_FLOAT_TRANSFORM_SCENE_DOCUMENT_VERSION, WHITEBOX_GEOMETRY_SCENE_DOCUMENT_VERSION, @@ -510,6 +511,10 @@ function readAdvancedRenderingSettings( throw new Error("world.advancedRendering.depthOfField must be an object."); } + if (value.whiteboxBevel !== undefined && !isRecord(value.whiteboxBevel)) { + throw new Error("world.advancedRendering.whiteboxBevel must be an object."); + } + const shadows = value.shadows as Record | undefined; const ambientOcclusion = value.ambientOcclusion as | Record @@ -519,6 +524,9 @@ function readAdvancedRenderingSettings( const depthOfField = value.depthOfField as | Record | undefined; + const whiteboxBevel = value.whiteboxBevel as + | Record + | undefined; const shadowsMapSize = readOptionalAllowedValue( shadows?.mapSize, @@ -651,6 +659,23 @@ function readAdvancedRenderingSettings( defaults.depthOfField.bokehScale ) }, + whiteboxBevel: { + enabled: readOptionalBoolean( + whiteboxBevel?.enabled, + "world.advancedRendering.whiteboxBevel.enabled", + defaults.whiteboxBevel.enabled + ), + edgeWidth: readOptionalNonNegativeFiniteNumber( + whiteboxBevel?.edgeWidth, + "world.advancedRendering.whiteboxBevel.edgeWidth", + defaults.whiteboxBevel.edgeWidth + ), + normalStrength: readOptionalNonNegativeFiniteNumber( + whiteboxBevel?.normalStrength, + "world.advancedRendering.whiteboxBevel.normalStrength", + defaults.whiteboxBevel.normalStrength + ) + }, fogPath, waterPath, waterReflectionMode @@ -2841,6 +2866,7 @@ export function migrateSceneDocument(source: unknown): SceneDocument { source.version !== RUNNER_LOADING_SCREEN_SCENE_DOCUMENT_VERSION && source.version !== MULTI_SCENE_FOUNDATION_SCENE_DOCUMENT_VERSION && source.version !== WATER_SURFACE_DISPLACEMENT_SCENE_DOCUMENT_VERSION && + source.version !== WHITEBOX_BEVEL_SCENE_DOCUMENT_VERSION && source.version !== WHITEBOX_BOX_VOLUME_SCENE_DOCUMENT_VERSION && source.version !== WHITEBOX_FLOAT_TRANSFORM_SCENE_DOCUMENT_VERSION && source.version !== WHITEBOX_GEOMETRY_SCENE_DOCUMENT_VERSION diff --git a/src/document/scene-document-validation.ts b/src/document/scene-document-validation.ts index 0685d1b0..3fee8c9c 100644 --- a/src/document/scene-document-validation.ts +++ b/src/document/scene-document-validation.ts @@ -498,6 +498,41 @@ function validateWorldSettings( ); } + if (!isBoolean(advancedRendering.whiteboxBevel.enabled)) { + diagnostics.push( + createDiagnostic( + "error", + "invalid-advanced-rendering-whitebox-bevel-enabled", + "Advanced rendering whitebox bevel enabled must be a boolean.", + "world.advancedRendering.whiteboxBevel.enabled" + ) + ); + } + + if (!isNonNegativeFiniteNumber(advancedRendering.whiteboxBevel.edgeWidth)) { + diagnostics.push( + createDiagnostic( + "error", + "invalid-advanced-rendering-whitebox-bevel-edge-width", + "Advanced rendering whitebox bevel edge width must be a non-negative finite number.", + "world.advancedRendering.whiteboxBevel.edgeWidth" + ) + ); + } + + if ( + !isNonNegativeFiniteNumber(advancedRendering.whiteboxBevel.normalStrength) + ) { + diagnostics.push( + createDiagnostic( + "error", + "invalid-advanced-rendering-whitebox-bevel-normal-strength", + "Advanced rendering whitebox bevel normal strength must be a non-negative finite number.", + "world.advancedRendering.whiteboxBevel.normalStrength" + ) + ); + } + if (!isBoxVolumeRenderPath(advancedRendering.fogPath)) { diagnostics.push( createDiagnostic( diff --git a/src/document/scene-document.ts b/src/document/scene-document.ts index a33b2fdb..46732051 100644 --- a/src/document/scene-document.ts +++ b/src/document/scene-document.ts @@ -15,7 +15,8 @@ import { type WorldSettings } from "./world-settings"; -export const SCENE_DOCUMENT_VERSION = 32 as const; +export const SCENE_DOCUMENT_VERSION = 33 as const; +export const WHITEBOX_BEVEL_SCENE_DOCUMENT_VERSION = 32 as const; export const PLAYER_START_LOCOMOTION_CORE_SCENE_DOCUMENT_VERSION = 32 as const; export const PLAYER_START_MOVEMENT_TEMPLATE_SCENE_DOCUMENT_VERSION = 31 as const;