Tighten editor scene mutation boundary

This commit is contained in:
2026-04-28 17:53:36 +08:00
parent 357dc136fe
commit b67af931de
12 changed files with 290 additions and 62 deletions

View File

@@ -1126,7 +1126,9 @@ bool SceneViewportMoveGizmo::TryBeginDrag(
return true;
}
void SceneViewportMoveGizmo::UpdateDrag(const SceneViewportMoveGizmoContext& context) {
void SceneViewportMoveGizmo::UpdateDrag(
const SceneViewportMoveGizmoContext& context,
IUndoManager& undoManager) {
if (m_dragMode == DragMode::None ||
context.selectedObject == nullptr ||
context.selectedObject->GetID() != m_activeEntityId ||
@@ -1160,8 +1162,10 @@ void SceneViewportMoveGizmo::UpdateDrag(const SceneViewportMoveGizmoContext& con
m_dragObjects[index]->GetTransform() == nullptr) {
continue;
}
m_dragObjects[index]->GetTransform()->SetPosition(
m_dragStartObjectWorldPositions[index] + worldDelta);
undoManager.ApplyWorldTransformPreview(
m_dragObjects[index]->GetID(),
m_dragStartObjectWorldPositions[index] + worldDelta,
m_dragObjects[index]->GetTransform()->GetRotation());
}
return;
}
@@ -1178,8 +1182,10 @@ void SceneViewportMoveGizmo::UpdateDrag(const SceneViewportMoveGizmoContext& con
m_dragObjects[index]->GetTransform() == nullptr) {
continue;
}
m_dragObjects[index]->GetTransform()->SetPosition(
m_dragStartObjectWorldPositions[index] + worldDelta);
undoManager.ApplyWorldTransformPreview(
m_dragObjects[index]->GetID(),
m_dragStartObjectWorldPositions[index] + worldDelta,
m_dragObjects[index]->GetTransform()->GetRotation());
}
}
@@ -1557,7 +1563,8 @@ bool SceneViewportRotateGizmo::TryBeginDrag(
}
void SceneViewportRotateGizmo::UpdateDrag(
const SceneViewportRotateGizmoContext& context) {
const SceneViewportRotateGizmoContext& context,
IUndoManager& undoManager) {
if (m_activeAxis == SceneViewportRotateGizmoAxis::None ||
context.selectedObject == nullptr ||
context.selectedObject->GetID() != m_activeEntityId ||
@@ -1622,22 +1629,21 @@ void SceneViewportRotateGizmo::UpdateDrag(
continue;
}
if (m_rotateAroundSharedPivot) {
gameObject->GetTransform()->SetPosition(
m_dragStartPivotWorldPosition +
worldDeltaRotation *
(m_dragStartWorldPositions[index] - m_dragStartPivotWorldPosition));
} else {
gameObject->GetTransform()->SetPosition(m_dragStartWorldPositions[index]);
}
const Vector3 previewPosition =
m_rotateAroundSharedPivot
? m_dragStartPivotWorldPosition +
worldDeltaRotation *
(m_dragStartWorldPositions[index] - m_dragStartPivotWorldPosition)
: m_dragStartWorldPositions[index];
if (m_localSpace && m_activeAxis != SceneViewportRotateGizmoAxis::View) {
gameObject->GetTransform()->SetRotation(
m_dragStartWorldRotations[index] * localDeltaRotation);
} else {
gameObject->GetTransform()->SetRotation(
worldDeltaRotation * m_dragStartWorldRotations[index]);
}
const Quaternion previewRotation =
m_localSpace && m_activeAxis != SceneViewportRotateGizmoAxis::View
? m_dragStartWorldRotations[index] * localDeltaRotation
: worldDeltaRotation * m_dragStartWorldRotations[index];
undoManager.ApplyWorldTransformPreview(
gameObject->GetID(),
previewPosition,
previewRotation);
}
SceneViewportRotateGizmoContext drawContext = context;
@@ -2091,7 +2097,8 @@ bool SceneViewportScaleGizmo::TryBeginDrag(
}
void SceneViewportScaleGizmo::UpdateDrag(
const SceneViewportScaleGizmoContext& context) {
const SceneViewportScaleGizmoContext& context,
IUndoManager& undoManager) {
if (m_activeHandle == SceneViewportScaleGizmoHandle::None ||
context.selectedObject == nullptr ||
context.selectedObject->GetTransform() == nullptr ||
@@ -2137,7 +2144,7 @@ void SceneViewportScaleGizmo::UpdateDrag(
}
}
context.selectedObject->GetTransform()->SetLocalScale(localScale);
undoManager.ApplyLocalScalePreview(context.selectedObject->GetID(), localScale);
switch (m_activeHandle) {
case SceneViewportScaleGizmoHandle::X:
m_dragCurrentVisualScale = Vector3(