Update box brush commands to include geometry tracking and scaling
This commit is contained in:
@@ -4,6 +4,7 @@ import { cloneSelectionForCommand, getBoxBrushOrThrow, replaceBrush, setSingleBr
|
||||
export function createResizeBoxBrushCommand(options) {
|
||||
const resolvedSize = options.snapToGrid === false ? options.size : snapPositiveSizeToGrid(options.size, options.gridSize ?? DEFAULT_GRID_SIZE);
|
||||
let previousSize = null;
|
||||
let previousGeometry = null;
|
||||
let previousSelection = null;
|
||||
let previousToolMode = null;
|
||||
return {
|
||||
@@ -16,6 +17,7 @@ export function createResizeBoxBrushCommand(options) {
|
||||
previousSize = {
|
||||
...brush.size
|
||||
};
|
||||
previousGeometry = cloneBoxBrushGeometry(brush.geometry);
|
||||
}
|
||||
if (previousSelection === null) {
|
||||
previousSelection = cloneSelectionForCommand(context.getSelection());
|
||||
@@ -23,17 +25,19 @@ export function createResizeBoxBrushCommand(options) {
|
||||
if (previousToolMode === null) {
|
||||
previousToolMode = context.getToolMode();
|
||||
}
|
||||
const nextGeometry = scaleBoxBrushGeometryToSize(brush.geometry, resolvedSize);
|
||||
context.setDocument(replaceBrush(currentDocument, {
|
||||
...brush,
|
||||
size: {
|
||||
...resolvedSize
|
||||
}
|
||||
},
|
||||
geometry: nextGeometry
|
||||
}));
|
||||
context.setSelection(setSingleBrushSelection(options.brushId));
|
||||
context.setToolMode("select");
|
||||
},
|
||||
undo(context) {
|
||||
if (previousSize === null) {
|
||||
if (previousSize === null || previousGeometry === null) {
|
||||
return;
|
||||
}
|
||||
const currentDocument = context.getDocument();
|
||||
@@ -42,7 +46,8 @@ export function createResizeBoxBrushCommand(options) {
|
||||
...brush,
|
||||
size: {
|
||||
...previousSize
|
||||
}
|
||||
},
|
||||
geometry: cloneBoxBrushGeometry(previousGeometry)
|
||||
}));
|
||||
if (previousSelection !== null) {
|
||||
context.setSelection(previousSelection);
|
||||
|
||||
@@ -21,6 +21,7 @@ export function createResizeBoxBrushCommand(options: ResizeBoxBrushCommandOption
|
||||
options.snapToGrid === false ? options.size : snapPositiveSizeToGrid(options.size, options.gridSize ?? DEFAULT_GRID_SIZE);
|
||||
|
||||
let previousSize: Vec3 | null = null;
|
||||
let previousGeometry: ReturnType<typeof cloneBoxBrushGeometry> | null = null;
|
||||
let previousSelection: EditorSelection | null = null;
|
||||
let previousToolMode: ToolMode | null = null;
|
||||
|
||||
@@ -35,6 +36,7 @@ export function createResizeBoxBrushCommand(options: ResizeBoxBrushCommandOption
|
||||
previousSize = {
|
||||
...brush.size
|
||||
};
|
||||
previousGeometry = cloneBoxBrushGeometry(brush.geometry);
|
||||
}
|
||||
|
||||
if (previousSelection === null) {
|
||||
@@ -45,19 +47,22 @@ export function createResizeBoxBrushCommand(options: ResizeBoxBrushCommandOption
|
||||
previousToolMode = context.getToolMode();
|
||||
}
|
||||
|
||||
const nextGeometry = scaleBoxBrushGeometryToSize(brush.geometry, resolvedSize);
|
||||
|
||||
context.setDocument(
|
||||
replaceBrush(currentDocument, {
|
||||
...brush,
|
||||
size: {
|
||||
...resolvedSize
|
||||
}
|
||||
},
|
||||
geometry: nextGeometry
|
||||
})
|
||||
);
|
||||
context.setSelection(setSingleBrushSelection(options.brushId));
|
||||
context.setToolMode("select");
|
||||
},
|
||||
undo(context) {
|
||||
if (previousSize === null) {
|
||||
if (previousSize === null || previousGeometry === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -69,7 +74,8 @@ export function createResizeBoxBrushCommand(options: ResizeBoxBrushCommandOption
|
||||
...brush,
|
||||
size: {
|
||||
...previousSize
|
||||
}
|
||||
},
|
||||
geometry: cloneBoxBrushGeometry(previousGeometry)
|
||||
})
|
||||
);
|
||||
|
||||
|
||||
@@ -46,7 +46,8 @@ export function createSetBoxBrushTransformCommand(options) {
|
||||
previousSnapshot = {
|
||||
center: cloneVec3(brush.center),
|
||||
rotationDegrees: cloneVec3(brush.rotationDegrees),
|
||||
size: cloneVec3(brush.size)
|
||||
size: cloneVec3(brush.size),
|
||||
geometry: cloneBoxBrushGeometry(brush.geometry)
|
||||
};
|
||||
}
|
||||
if (previousSelection === null) {
|
||||
@@ -55,11 +56,13 @@ export function createSetBoxBrushTransformCommand(options) {
|
||||
if (previousToolMode === null) {
|
||||
previousToolMode = context.getToolMode();
|
||||
}
|
||||
const nextGeometry = scaleBoxBrushGeometryToSize(brush.geometry, options.size);
|
||||
context.setDocument(replaceBrush(currentDocument, {
|
||||
...brush,
|
||||
center: cloneVec3(options.center),
|
||||
rotationDegrees: cloneVec3(options.rotationDegrees),
|
||||
size: cloneVec3(options.size)
|
||||
size: cloneVec3(options.size),
|
||||
geometry: nextGeometry
|
||||
}));
|
||||
context.setSelection(selectionToEditorSelection(options.selection));
|
||||
context.setToolMode("select");
|
||||
@@ -75,7 +78,8 @@ export function createSetBoxBrushTransformCommand(options) {
|
||||
...brush,
|
||||
center: cloneVec3(previousSnapshot.center),
|
||||
rotationDegrees: cloneVec3(previousSnapshot.rotationDegrees),
|
||||
size: cloneVec3(previousSnapshot.size)
|
||||
size: cloneVec3(previousSnapshot.size),
|
||||
geometry: cloneBoxBrushGeometry(previousSnapshot.geometry)
|
||||
}));
|
||||
if (previousSelection !== null) {
|
||||
context.setSelection(previousSelection);
|
||||
|
||||
@@ -34,6 +34,7 @@ interface BrushTransformSnapshot {
|
||||
center: Vec3;
|
||||
rotationDegrees: Vec3;
|
||||
size: Vec3;
|
||||
geometry: ReturnType<typeof cloneBoxBrushGeometry>;
|
||||
}
|
||||
|
||||
function cloneVec3(vector: Vec3): Vec3 {
|
||||
@@ -90,7 +91,8 @@ export function createSetBoxBrushTransformCommand(options: SetBoxBrushTransformC
|
||||
previousSnapshot = {
|
||||
center: cloneVec3(brush.center),
|
||||
rotationDegrees: cloneVec3(brush.rotationDegrees),
|
||||
size: cloneVec3(brush.size)
|
||||
size: cloneVec3(brush.size),
|
||||
geometry: cloneBoxBrushGeometry(brush.geometry)
|
||||
};
|
||||
}
|
||||
|
||||
@@ -102,12 +104,15 @@ export function createSetBoxBrushTransformCommand(options: SetBoxBrushTransformC
|
||||
previousToolMode = context.getToolMode();
|
||||
}
|
||||
|
||||
const nextGeometry = scaleBoxBrushGeometryToSize(brush.geometry, options.size);
|
||||
|
||||
context.setDocument(
|
||||
replaceBrush(currentDocument, {
|
||||
...brush,
|
||||
center: cloneVec3(options.center),
|
||||
rotationDegrees: cloneVec3(options.rotationDegrees),
|
||||
size: cloneVec3(options.size)
|
||||
size: cloneVec3(options.size),
|
||||
geometry: nextGeometry
|
||||
})
|
||||
);
|
||||
context.setSelection(selectionToEditorSelection(options.selection));
|
||||
@@ -127,7 +132,8 @@ export function createSetBoxBrushTransformCommand(options: SetBoxBrushTransformC
|
||||
...brush,
|
||||
center: cloneVec3(previousSnapshot.center),
|
||||
rotationDegrees: cloneVec3(previousSnapshot.rotationDegrees),
|
||||
size: cloneVec3(previousSnapshot.size)
|
||||
size: cloneVec3(previousSnapshot.size),
|
||||
geometry: cloneBoxBrushGeometry(previousSnapshot.geometry)
|
||||
})
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user