docs: add editor runtime flow docs

This commit is contained in:
2026-04-04 00:45:13 +08:00
parent 8abca3dec5
commit 2620b5914b
41 changed files with 2367 additions and 126 deletions

View File

@@ -7,8 +7,8 @@
#include "Viewport/SceneViewportHudOverlay.h"
#include "Viewport/SceneViewportInteractionActions.h"
#include "Viewport/SceneViewportInteractionResolver.h"
#include "Viewport/SceneViewportOverlayHandleBuilder.h"
#include "Viewport/SceneViewportMath.h"
#include "Viewport/SceneViewportTransformGizmoCoordinator.h"
#include "Viewport/SceneViewportTransformGizmoFrameBuilder.h"
#include "ViewportPanelContent.h"
#include "Platform/Win32Utf8.h"
@@ -346,7 +346,6 @@ void SceneViewPanel::Render() {
SceneViewportOverlayData overlay = {};
SceneViewportTransformGizmoFrameState gizmoFrameState = {};
SceneViewportOverlayFrameData emptySceneOverlayFrameData = {};
SceneViewportActiveGizmoKind activeGizmoKind = SceneViewportActiveGizmoKind::None;
if (hasInteractiveViewport) {
overlay = viewportHostService->GetSceneViewOverlayData();
@@ -364,44 +363,28 @@ void SceneViewPanel::Render() {
m_rotateGizmo,
showingScaleGizmo,
m_scaleGizmo);
activeGizmoKind = gizmoFrameState.activeGizmoKind;
} else {
CancelSceneViewportTransformGizmoDrags(*m_context, m_moveGizmo, m_rotateGizmo, m_scaleGizmo);
}
const SceneViewportTransformGizmoHandleBuildInputs interactionGizmoInputs =
const SceneViewportTransformGizmoOverlaySubmission interactionGizmoSubmission =
hasInteractiveViewport
? BuildSceneViewportTransformGizmoHandleBuildInputs(
? BuildSceneViewportTransformGizmoOverlaySubmission(
gizmoFrameState,
showingMoveGizmo,
m_moveGizmo,
gizmoFrameState.moveContext,
showingRotateGizmo,
m_rotateGizmo,
gizmoFrameState.rotateContext,
showingScaleGizmo,
m_scaleGizmo,
gizmoFrameState.scaleContext)
: SceneViewportTransformGizmoHandleBuildInputs{};
const SceneViewportTransformGizmoOverlayState interactionGizmoOverlayState =
BuildSceneViewportTransformGizmoOverlayState(interactionGizmoInputs);
viewportHostService->SetSceneViewTransformGizmoOverlayState(interactionGizmoOverlayState);
m_scaleGizmo)
: SceneViewportTransformGizmoOverlaySubmission{};
SubmitSceneViewportTransformGizmoOverlaySubmission(*viewportHostService, interactionGizmoSubmission);
const SceneViewportOverlayFrameData& interactionOverlayFrameData =
hasInteractiveViewport
? viewportHostService->GetSceneViewEditorOverlayFrameData(*m_context)
: emptySceneOverlayFrameData;
const bool moveGizmoActive = showingMoveGizmo && m_moveGizmo.IsActive();
const bool rotateGizmoActive = showingRotateGizmo && m_rotateGizmo.IsActive();
const bool scaleGizmoActive = showingScaleGizmo && m_scaleGizmo.IsActive();
if (moveGizmoActive) {
activeGizmoKind = SceneViewportActiveGizmoKind::Move;
} else if (rotateGizmoActive) {
activeGizmoKind = SceneViewportActiveGizmoKind::Rotate;
} else if (scaleGizmoActive) {
activeGizmoKind = SceneViewportActiveGizmoKind::Scale;
} else {
activeGizmoKind = SceneViewportActiveGizmoKind::None;
}
const bool gizmoActive = activeGizmoKind != SceneViewportActiveGizmoKind::None;
const SceneViewportActiveGizmoKind activeGizmoKind = interactionGizmoSubmission.activeGizmoKind;
const bool gizmoActive = interactionGizmoSubmission.GizmoActive();
const SceneViewportHudOverlayData interactionHudOverlay =
BuildSceneViewportHudOverlayData(overlay);
SceneViewportInteractionResult hoveredInteraction = {};
@@ -471,15 +454,13 @@ void SceneViewPanel::Render() {
ImGui::SetWindowFocus();
}
if (interactionActions.beginTransformGizmo) {
if (interactionActions.hoveredGizmoKind == SceneViewportActiveGizmoKind::Scale) {
m_scaleGizmo.TryBeginDrag(gizmoFrameState.scaleContext, m_context->GetUndoManager());
} else if (interactionActions.hoveredGizmoKind == SceneViewportActiveGizmoKind::Move) {
m_moveGizmo.TryBeginDrag(gizmoFrameState.moveContext, m_context->GetUndoManager());
} else if (interactionActions.hoveredGizmoKind == SceneViewportActiveGizmoKind::Rotate) {
m_rotateGizmo.TryBeginDrag(gizmoFrameState.rotateContext, m_context->GetUndoManager());
}
}
ExecuteSceneViewportTransformGizmoLifecycleCommand(
BuildBeginSceneViewportTransformGizmoLifecycleCommand(interactionActions),
m_context->GetUndoManager(),
gizmoFrameState,
m_moveGizmo,
m_rotateGizmo,
m_scaleGizmo);
DispatchSceneViewportInteractionActions(
interactionActions,
@@ -488,25 +469,15 @@ void SceneViewPanel::Render() {
content.availableSize,
localMousePosition);
if (gizmoActive) {
if (ImGui::IsMouseDown(ImGuiMouseButton_Left)) {
if (activeGizmoKind == SceneViewportActiveGizmoKind::Move) {
m_moveGizmo.UpdateDrag(gizmoFrameState.moveContext);
} else if (activeGizmoKind == SceneViewportActiveGizmoKind::Rotate) {
m_rotateGizmo.UpdateDrag(gizmoFrameState.rotateContext);
} else if (activeGizmoKind == SceneViewportActiveGizmoKind::Scale) {
m_scaleGizmo.UpdateDrag(gizmoFrameState.scaleContext);
}
} else {
if (activeGizmoKind == SceneViewportActiveGizmoKind::Move) {
m_moveGizmo.EndDrag(m_context->GetUndoManager());
} else if (activeGizmoKind == SceneViewportActiveGizmoKind::Rotate) {
m_rotateGizmo.EndDrag(m_context->GetUndoManager());
} else if (activeGizmoKind == SceneViewportActiveGizmoKind::Scale) {
m_scaleGizmo.EndDrag(m_context->GetUndoManager());
}
}
}
ExecuteSceneViewportTransformGizmoLifecycleCommand(
BuildFrameSceneViewportTransformGizmoLifecycleCommand(
activeGizmoKind,
ImGui::IsMouseDown(ImGuiMouseButton_Left)),
m_context->GetUndoManager(),
gizmoFrameState,
m_moveGizmo,
m_rotateGizmo,
m_scaleGizmo);
if (beginLookDrag) {
m_lookDragging = true;
@@ -604,18 +575,16 @@ void SceneViewPanel::Render() {
showingScaleGizmo,
m_scaleGizmo);
viewportHostService->SetSceneViewTransformGizmoOverlayState(
BuildSceneViewportTransformGizmoOverlayState(
BuildSceneViewportTransformGizmoHandleBuildInputs(
showingMoveGizmo,
m_moveGizmo,
drawGizmoFrameState.moveContext,
showingRotateGizmo,
m_rotateGizmo,
drawGizmoFrameState.rotateContext,
showingScaleGizmo,
m_scaleGizmo,
drawGizmoFrameState.scaleContext)));
SubmitSceneViewportTransformGizmoOverlaySubmission(
*viewportHostService,
BuildSceneViewportTransformGizmoOverlaySubmission(
drawGizmoFrameState,
showingMoveGizmo,
m_moveGizmo,
showingRotateGizmo,
m_rotateGizmo,
showingScaleGizmo,
m_scaleGizmo));
DrawSceneViewportHudOverlay(
ImGui::GetWindowDrawList(),