From c1b6d984cb1d9f55ea25ab625b30f297be4b8d43 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Fri, 3 Apr 2026 00:20:18 +0200 Subject: [PATCH] Rename and refactor viewport preview types and functions --- .../viewport-transient-state.ts | 102 +++++++++--------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/src/viewport-three/viewport-transient-state.ts b/src/viewport-three/viewport-transient-state.ts index 5f89a76e..6a8c418b 100644 --- a/src/viewport-three/viewport-transient-state.ts +++ b/src/viewport-three/viewport-transient-state.ts @@ -3,13 +3,10 @@ import type { ToolMode } from "../core/tool-mode"; import type { EntityKind } from "../entities/entity-instances"; import type { ViewportPanelId } from "./viewport-layout"; -export interface BoxCreateViewportToolPreview { - kind: "box-create"; - sourcePanelId: ViewportPanelId; - center: Vec3 | null; -} - -export type ViewportPlacementPreviewTarget = +export type CreationTarget = + | { + kind: "box-brush"; + } | { kind: "entity"; entityKind: EntityKind; @@ -20,14 +17,14 @@ export type ViewportPlacementPreviewTarget = assetId: string; }; -export interface PlacementViewportToolPreview { - kind: "placement"; +export interface CreationViewportToolPreview { + kind: "create"; sourcePanelId: ViewportPanelId; - target: ViewportPlacementPreviewTarget; + target: CreationTarget; center: Vec3 | null; } -export type ViewportToolPreview = BoxCreateViewportToolPreview | PlacementViewportToolPreview | { kind: "none" }; +export type ViewportToolPreview = CreationViewportToolPreview | { kind: "none" }; export interface ViewportTransientState { toolPreview: ViewportToolPreview; @@ -46,9 +43,9 @@ export function cloneViewportToolPreview(toolPreview: ViewportToolPreview): View return toolPreview; } - if (toolPreview.kind === "placement") { + if (toolPreview.kind === "create") { return { - kind: "placement", + kind: "create", sourcePanelId: toolPreview.sourcePanelId, target: toolPreview.target.kind === "entity" @@ -57,17 +54,36 @@ export function cloneViewportToolPreview(toolPreview: ViewportToolPreview): View entityKind: toolPreview.target.entityKind, audioAssetId: toolPreview.target.audioAssetId } - : { - kind: "model-instance", - assetId: toolPreview.target.assetId - }, + : toolPreview.target.kind === "model-instance" + ? { + kind: "model-instance", + assetId: toolPreview.target.assetId + } + : { + kind: "box-brush" + }, center: toolPreview.center === null ? null : { ...toolPreview.center } }; } return { - kind: "box-create", + kind: "create", sourcePanelId: toolPreview.sourcePanelId, + target: + toolPreview.target.kind === "entity" + ? { + kind: "entity", + entityKind: toolPreview.target.entityKind, + audioAssetId: toolPreview.target.audioAssetId + } + : toolPreview.target.kind === "model-instance" + ? { + kind: "model-instance", + assetId: toolPreview.target.assetId + } + : { + kind: "box-brush" + }, center: toolPreview.center === null ? null : { ...toolPreview.center } }; } @@ -81,36 +97,28 @@ export function areViewportToolPreviewsEqual(left: ViewportToolPreview, right: V return true; } - if (left.kind === "placement" && right.kind === "placement") { - if (left.sourcePanelId !== right.sourcePanelId) { - return false; - } - - if (left.target.kind !== right.target.kind) { - return false; - } - - if (left.target.kind === "entity" && right.target.kind === "entity") { - if (left.target.entityKind !== right.target.entityKind || left.target.audioAssetId !== right.target.audioAssetId) { - return false; - } - } - - if (left.target.kind === "model-instance" && right.target.kind === "model-instance" && left.target.assetId !== right.target.assetId) { - return false; - } - - if (left.center === null || right.center === null) { - return left.center === right.center; - } - - return left.center.x === right.center.x && left.center.y === right.center.y && left.center.z === right.center.z; + if (left.kind !== "create" || right.kind !== "create") { + return false; } if (left.sourcePanelId !== right.sourcePanelId) { return false; } + if (left.target.kind !== right.target.kind) { + return false; + } + + if (left.target.kind === "entity" && right.target.kind === "entity") { + if (left.target.entityKind !== right.target.entityKind || left.target.audioAssetId !== right.target.audioAssetId) { + return false; + } + } + + if (left.target.kind === "model-instance" && right.target.kind === "model-instance" && left.target.assetId !== right.target.assetId) { + return false; + } + if (left.center === null || right.center === null) { return left.center === right.center; } @@ -123,13 +131,5 @@ export function isViewportToolPreviewCompatible(toolMode: ToolMode, toolPreview: return true; } - if (toolMode === "box-create") { - return toolPreview.kind === "box-create"; - } - - if (toolMode === "place") { - return toolPreview.kind === "placement"; - } - - return false; + return toolMode === "create" && toolPreview.kind === "create"; }