89 lines
2.6 KiB
C++
89 lines
2.6 KiB
C++
#pragma once
|
|
|
|
#include "Core/IUndoManager.h"
|
|
#include "SceneViewportMoveGizmo.h"
|
|
#include "SceneViewportNavigation.h"
|
|
#include "SceneViewportRotateGizmo.h"
|
|
#include "SceneViewportScaleGizmo.h"
|
|
#include "panels/ViewportPanelContent.h"
|
|
|
|
namespace XCEngine {
|
|
namespace Editor {
|
|
|
|
struct SceneViewportToolOverlayResult {
|
|
bool hovered = false;
|
|
bool clicked = false;
|
|
SceneViewportToolMode clickedTool = SceneViewportToolMode::Move;
|
|
};
|
|
|
|
struct SceneViewportToolCommand {
|
|
SceneViewportToolMode targetTool = SceneViewportToolMode::Move;
|
|
bool triggered = false;
|
|
bool cancelMoveGizmo = false;
|
|
bool cancelRotateGizmo = false;
|
|
bool cancelScaleGizmo = false;
|
|
|
|
bool HasAction() const {
|
|
return triggered;
|
|
}
|
|
};
|
|
|
|
void RenderSceneViewportTopBar(
|
|
SceneViewportPivotMode& pivotMode,
|
|
SceneViewportTransformSpaceMode& transformSpaceMode);
|
|
|
|
SceneViewportToolOverlayResult RenderSceneViewportToolOverlay(
|
|
const ViewportPanelContentResult& content,
|
|
SceneViewportToolMode activeTool);
|
|
|
|
inline SceneViewportToolCommand BuildSceneViewportToolCommand(
|
|
const SceneViewportToolOverlayResult& overlayResult,
|
|
const SceneViewportToolShortcutAction& shortcutAction) {
|
|
SceneViewportToolCommand command = {};
|
|
|
|
if (overlayResult.clicked) {
|
|
command.targetTool = overlayResult.clickedTool;
|
|
command.triggered = true;
|
|
command.cancelMoveGizmo = true;
|
|
command.cancelRotateGizmo = true;
|
|
command.cancelScaleGizmo = true;
|
|
}
|
|
|
|
if (shortcutAction.HasAction()) {
|
|
command.targetTool = shortcutAction.targetTool;
|
|
command.triggered = true;
|
|
command.cancelMoveGizmo = command.cancelMoveGizmo || shortcutAction.cancelMoveGizmo;
|
|
command.cancelRotateGizmo = command.cancelRotateGizmo || shortcutAction.cancelRotateGizmo;
|
|
command.cancelScaleGizmo = command.cancelScaleGizmo || shortcutAction.cancelScaleGizmo;
|
|
}
|
|
|
|
return command;
|
|
}
|
|
|
|
inline void ExecuteSceneViewportToolCommand(
|
|
const SceneViewportToolCommand& command,
|
|
IUndoManager& undoManager,
|
|
SceneViewportMoveGizmo& moveGizmo,
|
|
SceneViewportRotateGizmo& rotateGizmo,
|
|
SceneViewportScaleGizmo& scaleGizmo,
|
|
SceneViewportToolMode& toolMode) {
|
|
if (!command.HasAction()) {
|
|
return;
|
|
}
|
|
|
|
if (command.cancelMoveGizmo && moveGizmo.IsActive()) {
|
|
moveGizmo.CancelDrag(&undoManager);
|
|
}
|
|
if (command.cancelRotateGizmo && rotateGizmo.IsActive()) {
|
|
rotateGizmo.CancelDrag(&undoManager);
|
|
}
|
|
if (command.cancelScaleGizmo && scaleGizmo.IsActive()) {
|
|
scaleGizmo.CancelDrag(&undoManager);
|
|
}
|
|
|
|
toolMode = command.targetTool;
|
|
}
|
|
|
|
} // namespace Editor
|
|
} // namespace XCEngine
|