Files
XCEngine/editor/src/Viewport/SceneViewportChrome.h

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