From c310bb05c82e666c502edf46a3716ad7a65af46c Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Thu, 2 Apr 2026 23:01:06 +0200 Subject: [PATCH] Add viewport transient state management --- .../viewport-transient-state.ts | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/viewport-three/viewport-transient-state.ts diff --git a/src/viewport-three/viewport-transient-state.ts b/src/viewport-three/viewport-transient-state.ts new file mode 100644 index 00000000..6f5cabde --- /dev/null +++ b/src/viewport-three/viewport-transient-state.ts @@ -0,0 +1,54 @@ +import type { Vec3 } from "../core/vector"; +import type { ViewportPanelId } from "./viewport-layout"; + +export interface BoxCreateViewportToolPreview { + kind: "box-create"; + sourcePanelId: ViewportPanelId; + center: Vec3 | null; +} + +export type ViewportToolPreview = BoxCreateViewportToolPreview | { kind: "none" }; + +export interface ViewportTransientState { + toolPreview: ViewportToolPreview; +} + +export function createDefaultViewportTransientState(): ViewportTransientState { + return { + toolPreview: { + kind: "none" + } + }; +} + +export function cloneViewportToolPreview(toolPreview: ViewportToolPreview): ViewportToolPreview { + if (toolPreview.kind === "none") { + return toolPreview; + } + + return { + kind: "box-create", + sourcePanelId: toolPreview.sourcePanelId, + center: toolPreview.center === null ? null : { ...toolPreview.center } + }; +} + +export function areViewportToolPreviewsEqual(left: ViewportToolPreview, right: ViewportToolPreview): boolean { + if (left.kind !== right.kind) { + return false; + } + + if (left.kind === "none" || right.kind === "none") { + return true; + } + + if (left.sourcePanelId !== right.sourcePanelId) { + 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; +}