Files
XCEngine/editor/src/Viewport/SceneViewportInteractionActions.cpp

129 lines
4.4 KiB
C++
Raw Normal View History

#include "SceneViewportInteractionActions.h"
#include "IViewportHostService.h"
namespace XCEngine {
namespace Editor {
SceneViewportActiveGizmoKind ToSceneViewportActiveGizmoKind(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;
}
}
SceneViewportHoveredHandleState BuildSceneViewportHoveredHandleState(
const SceneViewportInteractionResult& interaction) {
SceneViewportHoveredHandleState state = {};
state.hoveredGizmoKind = ToSceneViewportActiveGizmoKind(interaction.kind);
if (interaction.kind == SceneViewportInteractionKind::MoveGizmo) {
state.moveAxis = interaction.moveAxis;
state.movePlane = interaction.movePlane;
} else if (interaction.kind == SceneViewportInteractionKind::RotateGizmo) {
state.rotateAxis = interaction.rotateAxis;
} else if (interaction.kind == SceneViewportInteractionKind::ScaleGizmo) {
state.scaleHandle = interaction.scaleHandle;
}
return state;
}
void ApplySceneViewportHoveredHandleState(
const SceneViewportHoveredHandleState& hoveredHandleState,
bool gizmoActive,
bool showingMoveGizmo,
SceneViewportMoveGizmo& moveGizmo,
bool showingRotateGizmo,
SceneViewportRotateGizmo& rotateGizmo,
bool showingScaleGizmo,
SceneViewportScaleGizmo& scaleGizmo) {
if (gizmoActive) {
return;
}
if (showingMoveGizmo) {
moveGizmo.SetHoveredHandle(hoveredHandleState.moveAxis, hoveredHandleState.movePlane);
}
if (showingRotateGizmo) {
rotateGizmo.SetHoveredHandle(hoveredHandleState.rotateAxis);
}
if (showingScaleGizmo) {
scaleGizmo.SetHoveredHandle(hoveredHandleState.scaleHandle);
}
}
SceneViewportInteractionActions BuildSceneViewportInteractionActions(
const SceneViewportInteractionResult& interaction,
bool hasInteractiveViewport,
bool clickedLeft,
bool canResolveViewportInteraction) {
SceneViewportInteractionActions actions = {};
actions.hoveredGizmoKind = ToSceneViewportActiveGizmoKind(interaction.kind);
actions.orientationAxis = interaction.kind == SceneViewportInteractionKind::OrientationGizmo
? interaction.orientationAxis
: SceneViewportOrientationAxis::None;
actions.sceneIconEntityId = interaction.kind == SceneViewportInteractionKind::SceneIcon
? interaction.entityId
: 0;
actions.beginTransformGizmo =
hasInteractiveViewport &&
clickedLeft &&
actions.hoveredGizmoKind != SceneViewportActiveGizmoKind::None;
actions.orientationGizmoClick =
hasInteractiveViewport &&
clickedLeft &&
actions.orientationAxis != SceneViewportOrientationAxis::None;
actions.sceneIconClick =
hasInteractiveViewport &&
clickedLeft &&
actions.sceneIconEntityId != 0;
actions.selectSceneClick =
hasInteractiveViewport &&
clickedLeft &&
canResolveViewportInteraction &&
!interaction.HasHit();
return actions;
}
void DispatchSceneViewportInteractionActions(
const SceneViewportInteractionActions& actions,
IEditorContext& context,
IViewportHostService& viewportHostService,
const ::XCEngine::UI::UISize& viewportSize,
const Math::Vector2& localMousePosition) {
if (actions.orientationGizmoClick) {
viewportHostService.AlignSceneViewToOrientationAxis(actions.orientationAxis);
}
if (actions.sceneIconClick) {
context.GetSelectionManager().SetSelectedEntity(actions.sceneIconEntityId);
return;
}
if (!actions.selectSceneClick) {
return;
}
const uint64_t selectedEntity = viewportHostService.PickSceneViewEntity(
context,
viewportSize,
::XCEngine::UI::UIPoint(localMousePosition.x, localMousePosition.y));
if (selectedEntity != 0) {
context.GetSelectionManager().SetSelectedEntity(selectedEntity);
} else {
context.GetSelectionManager().ClearSelection();
}
}
} // namespace Editor
} // namespace XCEngine