Add support for brush geometry in transform targets and previews

This commit is contained in:
2026-04-05 02:54:12 +02:00
parent 98bbc49d41
commit c5f4f99598

View File

@@ -3,9 +3,12 @@ import type { EditorSelection } from "./selection";
import type { WhiteboxSelectionMode } from "./whitebox-selection-mode";
import type { Vec3 } from "./vector";
import {
BOX_VERTEX_IDS,
BOX_EDGE_LABELS,
BOX_FACE_LABELS,
BOX_VERTEX_LABELS,
cloneBoxBrushGeometry,
type BoxBrushGeometry,
type BoxEdgeId,
type BoxFaceId,
type BoxVertexId
@@ -46,6 +49,7 @@ export interface BrushTransformTarget {
initialCenter: Vec3;
initialRotationDegrees: Vec3;
initialSize: Vec3;
initialGeometry: BoxBrushGeometry;
}
export interface BrushFaceTransformTarget {
@@ -55,6 +59,7 @@ export interface BrushFaceTransformTarget {
initialCenter: Vec3;
initialRotationDegrees: Vec3;
initialSize: Vec3;
initialGeometry: BoxBrushGeometry;
}
export interface BrushEdgeTransformTarget {
@@ -64,6 +69,7 @@ export interface BrushEdgeTransformTarget {
initialCenter: Vec3;
initialRotationDegrees: Vec3;
initialSize: Vec3;
initialGeometry: BoxBrushGeometry;
}
export interface BrushVertexTransformTarget {
@@ -73,6 +79,7 @@ export interface BrushVertexTransformTarget {
initialCenter: Vec3;
initialRotationDegrees: Vec3;
initialSize: Vec3;
initialGeometry: BoxBrushGeometry;
}
export interface ModelInstanceTransformTarget {
@@ -105,6 +112,15 @@ export interface BrushTransformPreview {
center: Vec3;
rotationDegrees: Vec3;
size: Vec3;
geometry: BoxBrushGeometry;
}
function areBrushGeometriesEqual(left: BoxBrushGeometry, right: BoxBrushGeometry): boolean {
return BOX_VERTEX_IDS.every((vertexId) => {
const leftVertex = left.vertices[vertexId];
const rightVertex = right.vertices[vertexId];
return areVec3Equal(leftVertex, rightVertex);
});
}
export interface ModelInstanceTransformPreview {
@@ -200,7 +216,8 @@ export function cloneTransformTarget(target: TransformTarget): TransformTarget {
brushId: target.brushId,
initialCenter: cloneVec3(target.initialCenter),
initialRotationDegrees: cloneVec3(target.initialRotationDegrees),
initialSize: cloneVec3(target.initialSize)
initialSize: cloneVec3(target.initialSize),
initialGeometry: cloneBoxBrushGeometry(target.initialGeometry)
};
case "brushFace":
return {
@@ -209,7 +226,8 @@ export function cloneTransformTarget(target: TransformTarget): TransformTarget {
faceId: target.faceId,
initialCenter: cloneVec3(target.initialCenter),
initialRotationDegrees: cloneVec3(target.initialRotationDegrees),
initialSize: cloneVec3(target.initialSize)
initialSize: cloneVec3(target.initialSize),
initialGeometry: cloneBoxBrushGeometry(target.initialGeometry)
};
case "brushEdge":
return {
@@ -218,7 +236,8 @@ export function cloneTransformTarget(target: TransformTarget): TransformTarget {
edgeId: target.edgeId,
initialCenter: cloneVec3(target.initialCenter),
initialRotationDegrees: cloneVec3(target.initialRotationDegrees),
initialSize: cloneVec3(target.initialSize)
initialSize: cloneVec3(target.initialSize),
initialGeometry: cloneBoxBrushGeometry(target.initialGeometry)
};
case "brushVertex":
return {
@@ -227,7 +246,8 @@ export function cloneTransformTarget(target: TransformTarget): TransformTarget {
vertexId: target.vertexId,
initialCenter: cloneVec3(target.initialCenter),
initialRotationDegrees: cloneVec3(target.initialRotationDegrees),
initialSize: cloneVec3(target.initialSize)
initialSize: cloneVec3(target.initialSize),
initialGeometry: cloneBoxBrushGeometry(target.initialGeometry)
};
case "modelInstance":
return {
@@ -256,7 +276,8 @@ export function cloneTransformPreview(preview: TransformPreview): TransformPrevi
kind: "brush",
center: cloneVec3(preview.center),
rotationDegrees: cloneVec3(preview.rotationDegrees),
size: cloneVec3(preview.size)
size: cloneVec3(preview.size),
geometry: cloneBoxBrushGeometry(preview.geometry)
};
case "modelInstance":
return {
@@ -323,7 +344,8 @@ function areTransformTargetsEqual(left: TransformTarget, right: TransformTarget)
left.brushId === right.brushId &&
areVec3Equal(left.initialCenter, right.initialCenter) &&
areVec3Equal(left.initialRotationDegrees, right.initialRotationDegrees) &&
areVec3Equal(left.initialSize, right.initialSize)
areVec3Equal(left.initialSize, right.initialSize) &&
areBrushGeometriesEqual(left.initialGeometry, right.initialGeometry)
);
case "brushFace":
return (
@@ -332,7 +354,8 @@ function areTransformTargetsEqual(left: TransformTarget, right: TransformTarget)
left.faceId === right.faceId &&
areVec3Equal(left.initialCenter, right.initialCenter) &&
areVec3Equal(left.initialRotationDegrees, right.initialRotationDegrees) &&
areVec3Equal(left.initialSize, right.initialSize)
areVec3Equal(left.initialSize, right.initialSize) &&
areBrushGeometriesEqual(left.initialGeometry, right.initialGeometry)
);
case "brushEdge":
return (
@@ -341,7 +364,8 @@ function areTransformTargetsEqual(left: TransformTarget, right: TransformTarget)
left.edgeId === right.edgeId &&
areVec3Equal(left.initialCenter, right.initialCenter) &&
areVec3Equal(left.initialRotationDegrees, right.initialRotationDegrees) &&
areVec3Equal(left.initialSize, right.initialSize)
areVec3Equal(left.initialSize, right.initialSize) &&
areBrushGeometriesEqual(left.initialGeometry, right.initialGeometry)
);
case "brushVertex":
return (
@@ -350,7 +374,8 @@ function areTransformTargetsEqual(left: TransformTarget, right: TransformTarget)
left.vertexId === right.vertexId &&
areVec3Equal(left.initialCenter, right.initialCenter) &&
areVec3Equal(left.initialRotationDegrees, right.initialRotationDegrees) &&
areVec3Equal(left.initialSize, right.initialSize)
areVec3Equal(left.initialSize, right.initialSize) &&
areBrushGeometriesEqual(left.initialGeometry, right.initialGeometry)
);
case "modelInstance":
return (
@@ -383,7 +408,8 @@ function areTransformPreviewsEqual(left: TransformPreview, right: TransformPrevi
right.kind === "brush" &&
areVec3Equal(left.center, right.center) &&
areVec3Equal(left.rotationDegrees, right.rotationDegrees) &&
areVec3Equal(left.size, right.size)
areVec3Equal(left.size, right.size) &&
areBrushGeometriesEqual(left.geometry, right.geometry)
);
case "modelInstance":
return (
@@ -426,7 +452,8 @@ export function createTransformPreviewFromTarget(target: TransformTarget): Trans
kind: "brush",
center: cloneVec3(target.initialCenter),
rotationDegrees: cloneVec3(target.initialRotationDegrees),
size: cloneVec3(target.initialSize)
size: cloneVec3(target.initialSize),
geometry: cloneBoxBrushGeometry(target.initialGeometry)
};
case "modelInstance":
return {
@@ -454,7 +481,8 @@ export function doesTransformSessionChangeTarget(session: ActiveTransformSession
session.preview.kind === "brush" &&
(!areVec3Equal(session.preview.center, session.target.initialCenter) ||
!areVec3Equal(session.preview.rotationDegrees, session.target.initialRotationDegrees) ||
!areVec3Equal(session.preview.size, session.target.initialSize))
!areVec3Equal(session.preview.size, session.target.initialSize) ||
!areBrushGeometriesEqual(session.preview.geometry, session.target.initialGeometry))
);
case "modelInstance":
return (
@@ -619,7 +647,8 @@ function createBrushTransformTarget(document: SceneDocument, brushId: string): T
brushId: brush.id,
initialCenter: cloneVec3(brush.center),
initialRotationDegrees: cloneVec3(brush.rotationDegrees),
initialSize: cloneVec3(brush.size)
initialSize: cloneVec3(brush.size),
initialGeometry: cloneBoxBrushGeometry(brush.geometry)
},
message: null
};
@@ -639,7 +668,8 @@ function createBrushFaceTransformTarget(document: SceneDocument, brushId: string
faceId,
initialCenter: cloneVec3(brushResolution.target.initialCenter),
initialRotationDegrees: cloneVec3(brushResolution.target.initialRotationDegrees),
initialSize: cloneVec3(brushResolution.target.initialSize)
initialSize: cloneVec3(brushResolution.target.initialSize),
initialGeometry: cloneBoxBrushGeometry(brushResolution.target.initialGeometry)
},
message: null
};
@@ -659,7 +689,8 @@ function createBrushEdgeTransformTarget(document: SceneDocument, brushId: string
edgeId,
initialCenter: cloneVec3(brushResolution.target.initialCenter),
initialRotationDegrees: cloneVec3(brushResolution.target.initialRotationDegrees),
initialSize: cloneVec3(brushResolution.target.initialSize)
initialSize: cloneVec3(brushResolution.target.initialSize),
initialGeometry: cloneBoxBrushGeometry(brushResolution.target.initialGeometry)
},
message: null
};
@@ -679,7 +710,8 @@ function createBrushVertexTransformTarget(document: SceneDocument, brushId: stri
vertexId,
initialCenter: cloneVec3(brushResolution.target.initialCenter),
initialRotationDegrees: cloneVec3(brushResolution.target.initialRotationDegrees),
initialSize: cloneVec3(brushResolution.target.initialSize)
initialSize: cloneVec3(brushResolution.target.initialSize),
initialGeometry: cloneBoxBrushGeometry(brushResolution.target.initialGeometry)
},
message: null
};