Formalize scene viewport chrome and presentation helpers

This commit is contained in:
2026-04-04 13:50:34 +08:00
parent a3ba08bb99
commit bd35b8b4e8
9 changed files with 626 additions and 269 deletions

View File

@@ -0,0 +1,88 @@
#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