Rename and refactor viewport preview types and functions

This commit is contained in:
2026-04-03 00:20:18 +02:00
parent 185cfe1aaa
commit c1b6d984cb

View File

@@ -3,13 +3,10 @@ import type { ToolMode } from "../core/tool-mode";
import type { EntityKind } from "../entities/entity-instances"; import type { EntityKind } from "../entities/entity-instances";
import type { ViewportPanelId } from "./viewport-layout"; import type { ViewportPanelId } from "./viewport-layout";
export interface BoxCreateViewportToolPreview { export type CreationTarget =
kind: "box-create"; | {
sourcePanelId: ViewportPanelId; kind: "box-brush";
center: Vec3 | null; }
}
export type ViewportPlacementPreviewTarget =
| { | {
kind: "entity"; kind: "entity";
entityKind: EntityKind; entityKind: EntityKind;
@@ -20,14 +17,14 @@ export type ViewportPlacementPreviewTarget =
assetId: string; assetId: string;
}; };
export interface PlacementViewportToolPreview { export interface CreationViewportToolPreview {
kind: "placement"; kind: "create";
sourcePanelId: ViewportPanelId; sourcePanelId: ViewportPanelId;
target: ViewportPlacementPreviewTarget; target: CreationTarget;
center: Vec3 | null; center: Vec3 | null;
} }
export type ViewportToolPreview = BoxCreateViewportToolPreview | PlacementViewportToolPreview | { kind: "none" }; export type ViewportToolPreview = CreationViewportToolPreview | { kind: "none" };
export interface ViewportTransientState { export interface ViewportTransientState {
toolPreview: ViewportToolPreview; toolPreview: ViewportToolPreview;
@@ -46,9 +43,9 @@ export function cloneViewportToolPreview(toolPreview: ViewportToolPreview): View
return toolPreview; return toolPreview;
} }
if (toolPreview.kind === "placement") { if (toolPreview.kind === "create") {
return { return {
kind: "placement", kind: "create",
sourcePanelId: toolPreview.sourcePanelId, sourcePanelId: toolPreview.sourcePanelId,
target: target:
toolPreview.target.kind === "entity" toolPreview.target.kind === "entity"
@@ -57,17 +54,36 @@ export function cloneViewportToolPreview(toolPreview: ViewportToolPreview): View
entityKind: toolPreview.target.entityKind, entityKind: toolPreview.target.entityKind,
audioAssetId: toolPreview.target.audioAssetId audioAssetId: toolPreview.target.audioAssetId
} }
: { : toolPreview.target.kind === "model-instance"
kind: "model-instance", ? {
assetId: toolPreview.target.assetId kind: "model-instance",
}, assetId: toolPreview.target.assetId
}
: {
kind: "box-brush"
},
center: toolPreview.center === null ? null : { ...toolPreview.center } center: toolPreview.center === null ? null : { ...toolPreview.center }
}; };
} }
return { return {
kind: "box-create", kind: "create",
sourcePanelId: toolPreview.sourcePanelId, 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 } center: toolPreview.center === null ? null : { ...toolPreview.center }
}; };
} }
@@ -81,36 +97,28 @@ export function areViewportToolPreviewsEqual(left: ViewportToolPreview, right: V
return true; return true;
} }
if (left.kind === "placement" && right.kind === "placement") { if (left.kind !== "create" || right.kind !== "create") {
if (left.sourcePanelId !== right.sourcePanelId) { return false;
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.sourcePanelId !== right.sourcePanelId) { if (left.sourcePanelId !== right.sourcePanelId) {
return false; 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) { if (left.center === null || right.center === null) {
return left.center === right.center; return left.center === right.center;
} }
@@ -123,13 +131,5 @@ export function isViewportToolPreviewCompatible(toolMode: ToolMode, toolPreview:
return true; return true;
} }
if (toolMode === "box-create") { return toolMode === "create" && toolPreview.kind === "create";
return toolPreview.kind === "box-create";
}
if (toolMode === "place") {
return toolPreview.kind === "placement";
}
return false;
} }