Formalize staged scene viewport gizmo frame API

This commit is contained in:
2026-04-04 01:09:02 +08:00
parent 64a2efe993
commit d207043f8f
5 changed files with 486 additions and 44 deletions

View File

@@ -9,7 +9,6 @@
#include "Viewport/SceneViewportInteractionResolver.h"
#include "Viewport/SceneViewportMath.h"
#include "Viewport/SceneViewportTransformGizmoCoordinator.h"
#include "Viewport/SceneViewportTransformGizmoFrameBuilder.h"
#include "ViewportPanelContent.h"
#include "Platform/Win32Utf8.h"
#include "UI/UI.h"
@@ -339,46 +338,49 @@ void SceneViewPanel::Render() {
const bool showingScaleGizmo = m_toolMode == SceneViewportToolMode::Scale || usingTransformTool;
const bool useCenterPivot = m_pivotMode == SceneViewportPivotMode::Center;
const bool localSpace = m_transformSpaceMode == SceneViewportTransformSpaceMode::Local;
const SceneViewportTransformGizmoFrameOptions gizmoFrameOptions =
BuildSceneViewportTransformGizmoFrameOptions(
useCenterPivot,
localSpace,
usingTransformTool,
showingMoveGizmo,
showingRotateGizmo,
showingScaleGizmo);
const Math::Vector2 viewportSize(content.availableSize.x, content.availableSize.y);
const Math::Vector2 localMousePosition(
io.MousePos.x - content.itemMin.x,
io.MousePos.y - content.itemMin.y);
SceneViewportOverlayData overlay = {};
SceneViewportTransformGizmoFrameUpdate interactionGizmoFrame = {};
SceneViewportTransformGizmoFrameState gizmoFrameState = {};
SceneViewportOverlayFrameData emptySceneOverlayFrameData = {};
if (hasInteractiveViewport) {
overlay = viewportHostService->GetSceneViewOverlayData();
gizmoFrameState = RefreshSceneViewportTransformGizmos(
*m_context,
overlay,
viewportSize,
localMousePosition,
useCenterPivot,
localSpace,
usingTransformTool,
showingMoveGizmo,
interactionGizmoFrame = RefreshAndSubmitSceneViewportTransformGizmoFrame(
*viewportHostService,
BuildSceneViewportTransformGizmoRefreshRequest(
*m_context,
overlay,
viewportSize,
localMousePosition,
gizmoFrameOptions),
m_moveGizmo,
showingRotateGizmo,
m_rotateGizmo,
showingScaleGizmo,
m_scaleGizmo);
gizmoFrameState = interactionGizmoFrame.frameState;
} else {
CancelSceneViewportTransformGizmoDrags(*m_context, m_moveGizmo, m_rotateGizmo, m_scaleGizmo);
CancelSceneViewportTransformGizmoFrame(
*m_context,
m_moveGizmo,
m_rotateGizmo,
m_scaleGizmo);
}
const SceneViewportTransformGizmoOverlaySubmission interactionGizmoSubmission =
hasInteractiveViewport
? BuildSceneViewportTransformGizmoOverlaySubmission(
gizmoFrameState,
showingMoveGizmo,
m_moveGizmo,
showingRotateGizmo,
m_rotateGizmo,
showingScaleGizmo,
m_scaleGizmo)
? interactionGizmoFrame.overlaySubmission
: SceneViewportTransformGizmoOverlaySubmission{};
SubmitSceneViewportTransformGizmoOverlaySubmission(*viewportHostService, interactionGizmoSubmission);
const SceneViewportOverlayFrameData& interactionOverlayFrameData =
hasInteractiveViewport
? viewportHostService->GetSceneViewEditorOverlayFrameData(*m_context)
@@ -559,32 +561,17 @@ void SceneViewPanel::Render() {
if (content.hasViewportArea && content.frame.hasTexture) {
overlay = viewportHostService->GetSceneViewOverlayData();
const SceneViewportTransformGizmoFrameState drawGizmoFrameState =
RefreshSceneViewportTransformGizmos(
RefreshAndSubmitSceneViewportTransformGizmoFrame(
*viewportHostService,
BuildSceneViewportTransformGizmoRefreshRequest(
*m_context,
overlay,
viewportSize,
localMousePosition,
useCenterPivot,
localSpace,
usingTransformTool,
showingMoveGizmo,
m_moveGizmo,
showingRotateGizmo,
m_rotateGizmo,
showingScaleGizmo,
m_scaleGizmo);
SubmitSceneViewportTransformGizmoOverlaySubmission(
*viewportHostService,
BuildSceneViewportTransformGizmoOverlaySubmission(
drawGizmoFrameState,
showingMoveGizmo,
m_moveGizmo,
showingRotateGizmo,
m_rotateGizmo,
showingScaleGizmo,
m_scaleGizmo));
gizmoFrameOptions),
m_moveGizmo,
m_rotateGizmo,
m_scaleGizmo);
DrawSceneViewportHudOverlay(
ImGui::GetWindowDrawList(),