Update migrate-scene-document.ts with new box brush volume settings

This commit is contained in:
2026-04-06 08:18:27 +02:00
parent 4abb93203c
commit 9e4a17a4a8

View File

@@ -40,13 +40,18 @@ import {
} from "../interactions/interaction-links";
import {
BOX_VERTEX_IDS,
BOX_BRUSH_VOLUME_MODES,
createBoxBrush,
createDefaultBoxBrushGeometry,
createDefaultBoxBrushFogSettings,
createDefaultBoxBrushWaterSettings,
createDefaultFaceUvState,
DEFAULT_BOX_BRUSH_ROTATION_DEGREES,
isBoxBrushVolumeMode,
isBoxFaceId,
isFaceUvRotationQuarterTurns,
normalizeBrushName,
type BoxBrushVolumeSettings,
type BoxBrushFaces,
type BrushFace,
type FaceUvState
@@ -67,6 +72,7 @@ import {
SPATIAL_AUDIO_SCENE_DOCUMENT_VERSION,
SCENE_DOCUMENT_VERSION,
TRIGGER_ACTION_TARGET_FOUNDATION_SCENE_DOCUMENT_VERSION,
WHITEBOX_BOX_VOLUME_SCENE_DOCUMENT_VERSION,
WHITEBOX_FLOAT_TRANSFORM_SCENE_DOCUMENT_VERSION,
WHITEBOX_GEOMETRY_SCENE_DOCUMENT_VERSION,
WORLD_ENVIRONMENT_SCENE_DOCUMENT_VERSION,
@@ -74,6 +80,7 @@ import {
} from "./scene-document";
import {
createDefaultAdvancedRenderingSettings,
isBoxVolumeRenderPath,
isAdvancedRenderingShadowMapSize,
isAdvancedRenderingShadowType,
isAdvancedRenderingToneMappingMode,
@@ -262,6 +269,8 @@ function readAdvancedRenderingSettings(value: unknown): AdvancedRenderingSetting
defaults.toneMapping.mode,
isAdvancedRenderingToneMappingMode
);
const fogPath = readOptionalAllowedValue(value.fogPath, "world.advancedRendering.fogPath", defaults.fogPath, isBoxVolumeRenderPath);
const waterPath = readOptionalAllowedValue(value.waterPath, "world.advancedRendering.waterPath", defaults.waterPath, isBoxVolumeRenderPath);
return {
enabled: readOptionalBoolean(value.enabled, "world.advancedRendering.enabled", defaults.enabled),
@@ -332,6 +341,68 @@ function readAdvancedRenderingSettings(value: unknown): AdvancedRenderingSetting
"world.advancedRendering.depthOfField.bokehScale",
defaults.depthOfField.bokehScale
)
},
fogPath,
waterPath
};
}
function readBoxBrushVolumeSettings(value: unknown, label: string): BoxBrushVolumeSettings {
if (value === undefined) {
return {
mode: "none"
};
}
if (!isRecord(value)) {
throw new Error(`${label} must be an object.`);
}
const mode = readOptionalAllowedValue(value.mode, `${label}.mode`, "none", isBoxBrushVolumeMode);
if (mode === "none") {
return {
mode: "none"
};
}
if (mode === "water") {
const defaults = createDefaultBoxBrushWaterSettings();
if (value.water !== undefined && !isRecord(value.water)) {
throw new Error(`${label}.water must be an object.`);
}
const water = (value.water ?? {}) as Record<string, unknown>;
return {
mode: "water",
water: {
colorHex: water.colorHex === undefined ? defaults.colorHex : expectHexColor(water.colorHex, `${label}.water.colorHex`),
surfaceOpacity: readOptionalNonNegativeFiniteNumber(
water.surfaceOpacity,
`${label}.water.surfaceOpacity`,
defaults.surfaceOpacity
),
waveStrength: readOptionalNonNegativeFiniteNumber(water.waveStrength, `${label}.water.waveStrength`, defaults.waveStrength)
}
};
}
const defaults = createDefaultBoxBrushFogSettings();
if (value.fog !== undefined && !isRecord(value.fog)) {
throw new Error(`${label}.fog must be an object.`);
}
const fog = (value.fog ?? {}) as Record<string, unknown>;
return {
mode: "fog",
fog: {
colorHex: fog.colorHex === undefined ? defaults.colorHex : expectHexColor(fog.colorHex, `${label}.fog.colorHex`),
density: readOptionalNonNegativeFiniteNumber(fog.density, `${label}.fog.density`, defaults.density),
padding: readOptionalNonNegativeFiniteNumber(fog.padding, `${label}.fog.padding`, defaults.padding)
}
};
}
@@ -850,6 +921,7 @@ function readBrushes(
size,
geometry: readBoxBrushGeometry(brushValue.geometry, `brushes.${brushId}.geometry`, size),
faces: readBoxBrushFaces(brushValue.faces, `brushes.${brushId}.faces`, materials, allowMissingUvState),
volume: readBoxBrushVolumeSettings(brushValue.volume, `brushes.${brushId}.volume`),
layerId: expectOptionalString(brushValue.layerId, `brushes.${brushId}.layerId`),
groupId: expectOptionalString(brushValue.groupId, `brushes.${brushId}.groupId`)
});
@@ -1630,6 +1702,7 @@ export function migrateSceneDocument(source: unknown): SceneDocument {
}
if (
source.version !== WHITEBOX_BOX_VOLUME_SCENE_DOCUMENT_VERSION &&
source.version !== WHITEBOX_FLOAT_TRANSFORM_SCENE_DOCUMENT_VERSION &&
source.version !== WHITEBOX_GEOMETRY_SCENE_DOCUMENT_VERSION
) {