Formalize scene viewport interaction actions
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
#include "SceneViewPanel.h"
|
||||
#include "Viewport/SceneViewportEditorOverlayData.h"
|
||||
#include "Viewport/SceneViewportHudOverlay.h"
|
||||
#include "Viewport/SceneViewportInteractionActions.h"
|
||||
#include "Viewport/SceneViewportInteractionResolver.h"
|
||||
#include "Viewport/SceneViewportOverlayHandleBuilder.h"
|
||||
#include "Viewport/SceneViewportMath.h"
|
||||
@@ -38,22 +39,6 @@ const char* GetSceneViewportTransformSpaceModeLabel(SceneViewportTransformSpaceM
|
||||
return mode == SceneViewportTransformSpaceMode::Global ? "Global" : "Local";
|
||||
}
|
||||
|
||||
SceneViewportActiveGizmoKind ToActiveGizmoKind(SceneViewportInteractionKind kind) {
|
||||
switch (kind) {
|
||||
case SceneViewportInteractionKind::MoveGizmo:
|
||||
return SceneViewportActiveGizmoKind::Move;
|
||||
case SceneViewportInteractionKind::RotateGizmo:
|
||||
return SceneViewportActiveGizmoKind::Rotate;
|
||||
case SceneViewportInteractionKind::ScaleGizmo:
|
||||
return SceneViewportActiveGizmoKind::Scale;
|
||||
case SceneViewportInteractionKind::OrientationGizmo:
|
||||
case SceneViewportInteractionKind::SceneIcon:
|
||||
case SceneViewportInteractionKind::None:
|
||||
default:
|
||||
return SceneViewportActiveGizmoKind::None;
|
||||
}
|
||||
}
|
||||
|
||||
float GetSceneToolbarToggleWidth(const char* firstLabel, const char* secondLabel) {
|
||||
constexpr float kHorizontalPadding = 10.0f;
|
||||
constexpr float kMinWidth = 68.0f;
|
||||
@@ -440,58 +425,22 @@ void SceneViewPanel::Render() {
|
||||
hoveredInteraction = ResolveSceneViewportInteraction(interactionRequest);
|
||||
}
|
||||
|
||||
if (!gizmoActive) {
|
||||
if (showingMoveGizmo) {
|
||||
m_moveGizmo.SetHoveredHandle(
|
||||
hoveredInteraction.kind == SceneViewportInteractionKind::MoveGizmo
|
||||
? hoveredInteraction.moveAxis
|
||||
: SceneViewportGizmoAxis::None,
|
||||
hoveredInteraction.kind == SceneViewportInteractionKind::MoveGizmo
|
||||
? hoveredInteraction.movePlane
|
||||
: SceneViewportGizmoPlane::None);
|
||||
}
|
||||
if (showingRotateGizmo) {
|
||||
m_rotateGizmo.SetHoveredHandle(
|
||||
hoveredInteraction.kind == SceneViewportInteractionKind::RotateGizmo
|
||||
? hoveredInteraction.rotateAxis
|
||||
: SceneViewportRotateGizmoAxis::None);
|
||||
}
|
||||
if (showingScaleGizmo) {
|
||||
m_scaleGizmo.SetHoveredHandle(
|
||||
hoveredInteraction.kind == SceneViewportInteractionKind::ScaleGizmo
|
||||
? hoveredInteraction.scaleHandle
|
||||
: SceneViewportScaleGizmoHandle::None);
|
||||
}
|
||||
}
|
||||
ApplySceneViewportHoveredHandleState(
|
||||
BuildSceneViewportHoveredHandleState(hoveredInteraction),
|
||||
gizmoActive,
|
||||
showingMoveGizmo,
|
||||
m_moveGizmo,
|
||||
showingRotateGizmo,
|
||||
m_rotateGizmo,
|
||||
showingScaleGizmo,
|
||||
m_scaleGizmo);
|
||||
|
||||
const SceneViewportActiveGizmoKind hoveredGizmoKind =
|
||||
ToActiveGizmoKind(hoveredInteraction.kind);
|
||||
const bool gizmoHovering = hoveredGizmoKind != SceneViewportActiveGizmoKind::None;
|
||||
const SceneViewportOrientationAxis orientationAxisHit =
|
||||
hoveredInteraction.kind == SceneViewportInteractionKind::OrientationGizmo
|
||||
? hoveredInteraction.orientationAxis
|
||||
: SceneViewportOrientationAxis::None;
|
||||
const uint64_t clickedSceneIconEntity =
|
||||
hoveredInteraction.kind == SceneViewportInteractionKind::SceneIcon
|
||||
? hoveredInteraction.entityId
|
||||
: 0;
|
||||
const bool beginTransformGizmo =
|
||||
hasInteractiveViewport &&
|
||||
content.clickedLeft &&
|
||||
gizmoHovering;
|
||||
const bool orientationGizmoClick =
|
||||
hasInteractiveViewport &&
|
||||
content.clickedLeft &&
|
||||
orientationAxisHit != SceneViewportOrientationAxis::None;
|
||||
const bool sceneIconClick =
|
||||
hasInteractiveViewport &&
|
||||
content.clickedLeft &&
|
||||
clickedSceneIconEntity != 0;
|
||||
const bool selectClick =
|
||||
hasInteractiveViewport &&
|
||||
content.clickedLeft &&
|
||||
canResolveViewportInteraction &&
|
||||
!hoveredInteraction.HasHit();
|
||||
const SceneViewportInteractionActions interactionActions =
|
||||
BuildSceneViewportInteractionActions(
|
||||
hoveredInteraction,
|
||||
hasInteractiveViewport,
|
||||
content.clickedLeft,
|
||||
canResolveViewportInteraction);
|
||||
const bool beginLeftPanDrag = usingViewMoveTool
|
||||
? ShouldBeginSceneViewportNavigationDrag(
|
||||
hasInteractiveViewport,
|
||||
@@ -517,38 +466,27 @@ void SceneViewPanel::Render() {
|
||||
ImGuiMouseButton_Middle);
|
||||
const bool beginPanDrag = beginLeftPanDrag || beginMiddlePanDrag;
|
||||
|
||||
if (toolOverlay.clicked || beginTransformGizmo || orientationGizmoClick || sceneIconClick || selectClick || beginLookDrag ||
|
||||
if (toolOverlay.clicked || interactionActions.HasClickAction() || beginLookDrag ||
|
||||
beginPanDrag) {
|
||||
ImGui::SetWindowFocus();
|
||||
}
|
||||
|
||||
if (beginTransformGizmo) {
|
||||
if (hoveredGizmoKind == SceneViewportActiveGizmoKind::Scale) {
|
||||
if (interactionActions.beginTransformGizmo) {
|
||||
if (interactionActions.hoveredGizmoKind == SceneViewportActiveGizmoKind::Scale) {
|
||||
m_scaleGizmo.TryBeginDrag(gizmoFrameState.scaleContext, m_context->GetUndoManager());
|
||||
} else if (hoveredGizmoKind == SceneViewportActiveGizmoKind::Move) {
|
||||
} else if (interactionActions.hoveredGizmoKind == SceneViewportActiveGizmoKind::Move) {
|
||||
m_moveGizmo.TryBeginDrag(gizmoFrameState.moveContext, m_context->GetUndoManager());
|
||||
} else if (hoveredGizmoKind == SceneViewportActiveGizmoKind::Rotate) {
|
||||
} else if (interactionActions.hoveredGizmoKind == SceneViewportActiveGizmoKind::Rotate) {
|
||||
m_rotateGizmo.TryBeginDrag(gizmoFrameState.rotateContext, m_context->GetUndoManager());
|
||||
}
|
||||
}
|
||||
|
||||
if (orientationGizmoClick) {
|
||||
viewportHostService->AlignSceneViewToOrientationAxis(orientationAxisHit);
|
||||
}
|
||||
|
||||
if (sceneIconClick) {
|
||||
m_context->GetSelectionManager().SetSelectedEntity(clickedSceneIconEntity);
|
||||
} else if (selectClick) {
|
||||
const uint64_t selectedEntity = viewportHostService->PickSceneViewEntity(
|
||||
*m_context,
|
||||
content.availableSize,
|
||||
ImVec2(localMousePosition.x, localMousePosition.y));
|
||||
if (selectedEntity != 0) {
|
||||
m_context->GetSelectionManager().SetSelectedEntity(selectedEntity);
|
||||
} else {
|
||||
m_context->GetSelectionManager().ClearSelection();
|
||||
}
|
||||
}
|
||||
DispatchSceneViewportInteractionActions(
|
||||
interactionActions,
|
||||
*m_context,
|
||||
*viewportHostService,
|
||||
content.availableSize,
|
||||
localMousePosition);
|
||||
|
||||
if (gizmoActive) {
|
||||
if (ImGui::IsMouseDown(ImGuiMouseButton_Left)) {
|
||||
|
||||
Reference in New Issue
Block a user