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

@@ -1,9 +1,11 @@
#pragma once
#include "Core/IEditorContext.h"
#include "SceneViewportNavigation.h"
#include "IViewportHostService.h"
#include "SceneViewportEditorModes.h"
#include "SceneViewportHudOverlay.h"
#include "SceneViewportInteractionActions.h"
#include "SceneViewportInteractionResolver.h"
#include "SceneViewportTransformGizmoCoordinator.h"
@@ -128,5 +130,62 @@ inline SceneViewportInteractionResolveRequest BuildSceneViewportInteractionResol
return request;
}
inline bool ShouldFocusSceneViewportAfterInteraction(
bool toolCommandTriggered,
const SceneViewportInteractionActions& interactionActions,
const SceneViewportNavigationUpdate& navigationUpdate) {
return toolCommandTriggered ||
interactionActions.HasClickAction() ||
navigationUpdate.beginLookDrag ||
navigationUpdate.beginPanDrag;
}
struct SceneViewportPresentationRequest {
IEditorContext* context = nullptr;
IViewportHostService* viewportHostService = nullptr;
bool hasInteractiveViewport = false;
SceneViewportFrameGeometry geometry = {};
SceneViewportTransformGizmoFrameOptions gizmoFrameOptions = {};
SceneViewportMoveGizmo* moveGizmo = nullptr;
SceneViewportRotateGizmo* rotateGizmo = nullptr;
SceneViewportScaleGizmo* scaleGizmo = nullptr;
ImDrawList* drawList = nullptr;
ImVec2 viewportMin = ImVec2(0.0f, 0.0f);
ImVec2 viewportMax = ImVec2(0.0f, 0.0f);
bool IsValid() const {
return context != nullptr &&
viewportHostService != nullptr &&
moveGizmo != nullptr &&
rotateGizmo != nullptr &&
scaleGizmo != nullptr;
}
};
inline void RefreshAndDrawSceneViewportPresentation(const SceneViewportPresentationRequest& request) {
if (!request.IsValid() || !request.hasInteractiveViewport) {
return;
}
const SceneViewportOverlayData overlay = request.viewportHostService->GetSceneViewOverlayData();
RefreshAndSubmitSceneViewportTransformGizmoFrame(
*request.viewportHostService,
BuildSceneViewportTransformGizmoRefreshRequest(
*request.context,
overlay,
request.geometry.viewportSize,
request.geometry.localMousePosition,
request.gizmoFrameOptions),
*request.moveGizmo,
*request.rotateGizmo,
*request.scaleGizmo);
DrawSceneViewportHudOverlay(
request.drawList,
BuildSceneViewportHudOverlayData(overlay),
request.viewportMin,
request.viewportMax);
}
} // namespace Editor
} // namespace XCEngine