Formalize scene viewport transform gizmo overlay provider

This commit is contained in:
2026-04-03 16:50:46 +08:00
parent 03bd755e0a
commit 73415915e6
11 changed files with 198 additions and 141 deletions

View File

@@ -14,13 +14,9 @@
#include "Platform/Win32Utf8.h"
#include "UI/UI.h"
#include <XCEngine/Debug/Logger.h>
#include <imgui.h>
#include <algorithm>
#include <cstdarg>
#include <cstdio>
#include <filesystem>
#include <vector>
@@ -388,15 +384,6 @@ SceneViewportToolOverlayResult RenderSceneViewportToolOverlay(
return result;
}
void LogSceneViewNavigation(Debug::Logger& logger, const char* format, ...) {
char buffer[512] = {};
va_list args;
va_start(args, format);
std::vsnprintf(buffer, sizeof(buffer), format, args);
va_end(args);
logger.Info(Debug::LogCategory::General, buffer);
}
bool ShouldBeginSceneViewportNavigationDrag(
bool hasInteractiveViewport,
bool hovered,
@@ -428,7 +415,6 @@ void SceneViewPanel::Render() {
const ViewportPanelContentResult content = RenderViewportPanelContent(*m_context, EditorViewportKind::Scene);
if (IViewportHostService* viewportHostService = m_context->GetViewportHostService()) {
const ImGuiIO& io = ImGui::GetIO();
auto& logger = Debug::Logger::Get();
const bool hasInteractiveViewport = content.hasViewportArea && content.frame.hasTexture;
const SceneViewportToolOverlayResult toolOverlay = RenderSceneViewportToolOverlay(content, m_toolMode);
const bool viewportContentHovered = content.hovered && !toolOverlay.hovered;
@@ -536,12 +522,12 @@ void SceneViewPanel::Render() {
m_scaleGizmo,
gizmoFrameState.scaleContext)
: SceneViewportTransformGizmoHandleBuildInputs{};
const SceneViewportTransformGizmoOverlayState interactionGizmoOverlayState =
BuildSceneViewportTransformGizmoOverlayState(interactionGizmoInputs);
viewportHostService->SetSceneViewTransformGizmoOverlayState(interactionGizmoOverlayState);
const SceneViewportOverlayFrameData& interactionOverlayFrameData =
hasInteractiveViewport
? viewportHostService->GetSceneViewInteractionOverlayFrameData(
*m_context,
overlay,
interactionGizmoInputs)
? viewportHostService->GetSceneViewEditorOverlayFrameData(*m_context)
: emptySceneOverlayFrameData;
const SceneViewportOverlayHandleHitResult overlayHandleHit =
hasInteractiveViewport
@@ -664,25 +650,6 @@ void SceneViewPanel::Render() {
ImGuiMouseButton_Middle);
const bool beginPanDrag = beginLeftPanDrag || beginMiddlePanDrag;
if (ImGui::IsMouseClicked(ImGuiMouseButton_Right) || ImGui::IsMouseClicked(ImGuiMouseButton_Middle)) {
LogSceneViewNavigation(
logger,
"SceneView nav click hovered=%d focused=%d hasViewport=%d clickedR=%d clickedM=%d downR=%d downM=%d "
"look=%d pan=%d gizmoActive=%d ioDelta=(%.2f, %.2f)",
content.hovered ? 1 : 0,
content.focused ? 1 : 0,
hasInteractiveViewport ? 1 : 0,
ImGui::IsMouseClicked(ImGuiMouseButton_Right) ? 1 : 0,
ImGui::IsMouseClicked(ImGuiMouseButton_Middle) ? 1 : 0,
ImGui::IsMouseDown(ImGuiMouseButton_Right) ? 1 : 0,
ImGui::IsMouseDown(ImGuiMouseButton_Middle) ? 1 : 0,
m_lookDragging ? 1 : 0,
m_panDragging ? 1 : 0,
gizmoActive ? 1 : 0,
io.MouseDelta.x,
io.MouseDelta.y);
}
if (toolOverlay.clicked || beginTransformGizmo || orientationGizmoClick || sceneIconClick || selectClick || beginLookDrag ||
beginPanDrag) {
ImGui::SetWindowFocus();
@@ -741,14 +708,6 @@ void SceneViewPanel::Render() {
m_panDragging = false;
m_loggedLookDelta = false;
m_loggedPanDelta = false;
LogSceneViewNavigation(
logger,
"SceneView begin look drag hovered=%d focused=%d downR=%d downM=%d gizmoActive=%d",
content.hovered ? 1 : 0,
content.focused ? 1 : 0,
ImGui::IsMouseDown(ImGuiMouseButton_Right) ? 1 : 0,
ImGui::IsMouseDown(ImGuiMouseButton_Middle) ? 1 : 0,
gizmoActive ? 1 : 0);
}
if (beginPanDrag) {
m_panDragging = true;
@@ -756,25 +715,13 @@ void SceneViewPanel::Render() {
m_panDragButton = beginLeftPanDrag ? ImGuiMouseButton_Left : ImGuiMouseButton_Middle;
m_loggedPanDelta = false;
m_loggedLookDelta = false;
LogSceneViewNavigation(
logger,
"SceneView begin pan drag hovered=%d focused=%d button=%d downR=%d downM=%d downL=%d gizmoActive=%d",
content.hovered ? 1 : 0,
content.focused ? 1 : 0,
m_panDragButton,
ImGui::IsMouseDown(ImGuiMouseButton_Right) ? 1 : 0,
ImGui::IsMouseDown(ImGuiMouseButton_Middle) ? 1 : 0,
ImGui::IsMouseDown(ImGuiMouseButton_Left) ? 1 : 0,
gizmoActive ? 1 : 0);
}
if (m_lookDragging && !ImGui::IsMouseDown(ImGuiMouseButton_Right)) {
LogSceneViewNavigation(logger, "SceneView end look drag");
m_lookDragging = false;
m_loggedLookDelta = false;
}
if (m_panDragging && !ImGui::IsMouseDown(m_panDragButton)) {
LogSceneViewNavigation(logger, "SceneView end pan drag");
m_panDragging = false;
m_panDragButton = ImGuiMouseButton_Middle;
m_loggedPanDelta = false;
@@ -819,13 +766,6 @@ void SceneViewPanel::Render() {
input.mouseDelta = io.MouseDelta;
if (!m_loggedLookDelta &&
(input.mouseDelta.x != 0.0f || input.mouseDelta.y != 0.0f)) {
LogSceneViewNavigation(
logger,
"SceneView look delta=(%.2f, %.2f) hovered=%d downR=%d",
input.mouseDelta.x,
input.mouseDelta.y,
content.hovered ? 1 : 0,
ImGui::IsMouseDown(ImGuiMouseButton_Right) ? 1 : 0);
m_loggedLookDelta = true;
}
}
@@ -834,13 +774,6 @@ void SceneViewPanel::Render() {
input.mouseDelta = io.MouseDelta;
if (!m_loggedPanDelta &&
(input.mouseDelta.x != 0.0f || input.mouseDelta.y != 0.0f)) {
LogSceneViewNavigation(
logger,
"SceneView pan delta=(%.2f, %.2f) hovered=%d downM=%d",
input.mouseDelta.x,
input.mouseDelta.y,
content.hovered ? 1 : 0,
ImGui::IsMouseDown(ImGuiMouseButton_Middle) ? 1 : 0);
m_loggedPanDelta = true;
}
}
@@ -866,18 +799,18 @@ void SceneViewPanel::Render() {
showingScaleGizmo,
m_scaleGizmo);
viewportHostService->SetSceneViewTransientTransformGizmoOverlayData(
overlay,
BuildSceneViewportTransformGizmoHandleBuildInputs(
showingMoveGizmo,
m_moveGizmo,
drawGizmoFrameState.moveContext,
showingRotateGizmo,
m_rotateGizmo,
drawGizmoFrameState.rotateContext,
showingScaleGizmo,
m_scaleGizmo,
drawGizmoFrameState.scaleContext));
viewportHostService->SetSceneViewTransformGizmoOverlayState(
BuildSceneViewportTransformGizmoOverlayState(
BuildSceneViewportTransformGizmoHandleBuildInputs(
showingMoveGizmo,
m_moveGizmo,
drawGizmoFrameState.moveContext,
showingRotateGizmo,
m_rotateGizmo,
drawGizmoFrameState.rotateContext,
showingScaleGizmo,
m_scaleGizmo,
drawGizmoFrameState.scaleContext)));
DrawSceneViewportOverlay(
ImGui::GetWindowDrawList(),