From 991f98c7c5470d4ad802a72dc98bb0e2511bc8ef Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Sat, 11 Apr 2026 14:25:42 +0200 Subject: [PATCH] Add validation for project scene editor preferences --- src/document/scene-document-validation.ts | 119 ++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/src/document/scene-document-validation.ts b/src/document/scene-document-validation.ts index 6788367c..aa867cae 100644 --- a/src/document/scene-document-validation.ts +++ b/src/document/scene-document-validation.ts @@ -7,6 +7,7 @@ import { } from "../assets/project-assets"; import type { ModelInstance } from "../assets/model-instances"; import { isModelInstanceCollisionMode } from "../assets/model-instances"; +import { WHITEBOX_SELECTION_MODES } from "../core/whitebox-selection-mode"; import { isPlayerStartColliderMode, isPlayerStartGamepadCameraLookBinding, @@ -2100,6 +2101,123 @@ function validateProjectSceneLoadingScreen( } } +function validateProjectSceneEditorPreferences( + scene: ProjectDocument["scenes"][string], + scenePath: string, + diagnostics: SceneDiagnostic[] +) { + const preferences = scene.editorPreferences; + + if (!WHITEBOX_SELECTION_MODES.includes(preferences.whiteboxSelectionMode)) { + diagnostics.push( + createDiagnostic( + "error", + "invalid-scene-editor-selection-mode", + "Scene editor selection mode must be one of object, face, edge, or vertex.", + `${scenePath}.editorPreferences.whiteboxSelectionMode` + ) + ); + } + + if ( + preferences.viewportLayoutMode !== "single" && + preferences.viewportLayoutMode !== "quad" + ) { + diagnostics.push( + createDiagnostic( + "error", + "invalid-scene-editor-layout-mode", + "Scene editor viewport layout must be single or quad.", + `${scenePath}.editorPreferences.viewportLayoutMode` + ) + ); + } + + if ( + preferences.activeViewportPanelId !== "topLeft" && + preferences.activeViewportPanelId !== "topRight" && + preferences.activeViewportPanelId !== "bottomLeft" && + preferences.activeViewportPanelId !== "bottomRight" + ) { + diagnostics.push( + createDiagnostic( + "error", + "invalid-scene-editor-active-panel", + "Scene editor active viewport panel must reference a supported panel id.", + `${scenePath}.editorPreferences.activeViewportPanelId` + ) + ); + } + + if (!isPositiveFiniteNumber(preferences.whiteboxSnapStep)) { + diagnostics.push( + createDiagnostic( + "error", + "invalid-scene-editor-snap-step", + "Scene editor snap step must be greater than zero.", + `${scenePath}.editorPreferences.whiteboxSnapStep` + ) + ); + } + + if (!isFiniteNumber(preferences.viewportQuadSplit.x)) { + diagnostics.push( + createDiagnostic( + "error", + "invalid-scene-editor-quad-split-x", + "Scene editor quad split X must be finite.", + `${scenePath}.editorPreferences.viewportQuadSplit.x` + ) + ); + } + + if (!isFiniteNumber(preferences.viewportQuadSplit.y)) { + diagnostics.push( + createDiagnostic( + "error", + "invalid-scene-editor-quad-split-y", + "Scene editor quad split Y must be finite.", + `${scenePath}.editorPreferences.viewportQuadSplit.y` + ) + ); + } + + for (const [panelId, panelPreferences] of Object.entries( + preferences.viewportPanels + )) { + if ( + panelPreferences.viewMode !== "perspective" && + panelPreferences.viewMode !== "top" && + panelPreferences.viewMode !== "front" && + panelPreferences.viewMode !== "side" + ) { + diagnostics.push( + createDiagnostic( + "error", + "invalid-scene-editor-panel-view-mode", + "Scene editor panel view mode must be perspective, top, front, or side.", + `${scenePath}.editorPreferences.viewportPanels.${panelId}.viewMode` + ) + ); + } + + if ( + panelPreferences.displayMode !== "normal" && + panelPreferences.displayMode !== "authoring" && + panelPreferences.displayMode !== "wireframe" + ) { + diagnostics.push( + createDiagnostic( + "error", + "invalid-scene-editor-panel-display-mode", + "Scene editor panel display mode must be normal, authoring, or wireframe.", + `${scenePath}.editorPreferences.viewportPanels.${panelId}.displayMode` + ) + ); + } + } +} + export function formatSceneDiagnostic(diagnostic: SceneDiagnostic): string { return diagnostic.path === undefined ? diagnostic.message @@ -2579,6 +2697,7 @@ export function validateProjectDocument( } validateProjectSceneLoadingScreen(scene, scenePath, diagnostics); + validateProjectSceneEditorPreferences(scene, scenePath, diagnostics); const sceneDocument = createSceneDocumentFromProject(document, sceneKey);