Refactor scene viewport state into local sessions

This commit is contained in:
2026-04-29 14:13:47 +08:00
parent da6f37dafe
commit 212d4016e0
16 changed files with 353 additions and 380 deletions

View File

@@ -2,6 +2,7 @@
#include "Viewport/EditorViewportPicking.h"
#include "Scene/EditorSceneRuntime.h"
#include "Scene/SceneViewportSession.h"
#include "State/EditorCommandFocusService.h"
#include "Panels/EditorPanelIds.h"
@@ -105,30 +106,31 @@ bool TryResolveToolModeShortcut(
void ApplySceneToolMode(
SceneToolMode mode,
SceneViewportSession& session,
EditorSceneRuntime& sceneRuntime,
SceneViewportTransformGizmo& transformGizmo) {
if (sceneRuntime.GetToolMode() == mode) {
if (session.GetToolMode() == mode) {
return;
}
transformGizmo.CancelDrag(sceneRuntime);
sceneRuntime.SetToolMode(mode);
session.SetToolMode(mode);
}
void ApplySceneViewportToggleButton(
std::size_t toggleIndex,
EditorSceneRuntime& sceneRuntime) {
SceneViewportSession& session) {
if (toggleIndex == 0u) {
sceneRuntime.SetToolPivotMode(
sceneRuntime.GetToolPivotMode() == SceneToolPivotMode::Pivot
session.SetToolPivotMode(
session.GetToolPivotMode() == SceneToolPivotMode::Pivot
? SceneToolPivotMode::Center
: SceneToolPivotMode::Pivot);
return;
}
if (toggleIndex == 1u) {
sceneRuntime.SetToolSpaceMode(
sceneRuntime.GetToolSpaceMode() == SceneToolSpaceMode::World
session.SetToolSpaceMode(
session.GetToolSpaceMode() == SceneToolSpaceMode::World
? SceneToolSpaceMode::Local
: SceneToolSpaceMode::World);
}
@@ -162,6 +164,7 @@ void SceneViewportController::SetCommandFocusService(
void SceneViewportController::Update(
EditorSceneRuntime& sceneRuntime,
SceneViewportSession& session,
const IViewportObjectPickerService& viewportObjectPicker,
const UIEditorWorkspaceComposeState& composeState,
const UIEditorWorkspaceComposeFrame& composeFrame) {
@@ -173,7 +176,6 @@ void SceneViewportController::Update(
if (m_transformGizmo.IsActive()) {
m_transformGizmo.CancelDrag(sceneRuntime);
}
sceneRuntime.SetHoveredToolHandle(SceneToolHandle::None);
ResetInteractionState();
return;
}
@@ -221,9 +223,9 @@ void SceneViewportController::Update(
slotLayout.inputRect,
slotLayout.topBarRect,
slotLayout.bounds,
sceneRuntime.GetToolMode(),
sceneRuntime.GetToolPivotMode(),
sceneRuntime.GetToolSpaceMode(),
session.GetToolMode(),
session.GetToolPivotMode(),
session.GetToolSpaceMode(),
kSceneViewportToolOverlayInvalidIndex,
kSceneViewportToolOverlayInvalidIndex,
kSceneViewportToolOverlayInvalidIndex,
@@ -254,7 +256,7 @@ void SceneViewportController::Update(
m_activeToggleOverlayIndex = transitionHoveredToggleOverlayIndex;
ApplySceneViewportToggleButton(
m_activeToggleOverlayIndex,
sceneRuntime);
session);
continue;
}
@@ -268,6 +270,7 @@ void SceneViewportController::Update(
if (m_activeToolOverlayIndex < m_toolOverlay.GetFrame().buttons.size()) {
ApplySceneToolMode(
m_toolOverlay.GetFrame().buttons[m_activeToolOverlayIndex].mode,
session,
sceneRuntime,
m_transformGizmo);
}
@@ -288,9 +291,9 @@ void SceneViewportController::Update(
slotLayout.inputRect,
slotLayout.topBarRect,
slotLayout.bounds,
sceneRuntime.GetToolMode(),
sceneRuntime.GetToolPivotMode(),
sceneRuntime.GetToolSpaceMode(),
session.GetToolMode(),
session.GetToolPivotMode(),
session.GetToolSpaceMode(),
m_hoveredToolOverlayIndex,
m_activeToolOverlayIndex,
m_hoveredToggleOverlayIndex,
@@ -300,7 +303,7 @@ void SceneViewportController::Update(
m_activeToolOverlayIndex != kSceneViewportToolOverlayInvalidIndex ||
m_activeToggleOverlayIndex != kSceneViewportToolOverlayInvalidIndex;
const bool usingViewMoveTool = IsViewMoveTool(sceneRuntime.GetToolMode());
const bool usingViewMoveTool = IsViewMoveTool(session.GetToolMode());
if (!m_transformGizmo.IsActive()) {
for (const auto& transition : inputFrame.pointerButtonTransitions) {
@@ -351,28 +354,29 @@ void SceneViewportController::Update(
!m_navigationState.panDragging) {
SceneToolMode shortcutMode = SceneToolMode::View;
if (TryResolveToolModeShortcut(inputFrame, shortcutMode)) {
ApplySceneToolMode(shortcutMode, sceneRuntime, m_transformGizmo);
ApplySceneToolMode(shortcutMode, session, sceneRuntime, m_transformGizmo);
}
}
if (inputFrame.focused &&
!m_transformGizmo.IsActive() &&
WasKeyPressed(inputFrame, KeyCode::F)) {
sceneRuntime.FocusSceneSelection();
session.FocusSelection(sceneRuntime);
}
RefreshSceneOverlays(
sceneRuntime,
session,
slotLayout.inputRect,
pointerScreen,
viewportHoverEligible);
sceneRuntime.SetHoveredToolHandle(SceneToolHandle::None);
if (m_transformGizmo.IsActive()) {
if (WasKeyPressed(inputFrame, KeyCode::Escape)) {
m_transformGizmo.CancelDrag(sceneRuntime);
RefreshSceneOverlays(
sceneRuntime,
session,
slotLayout.inputRect,
pointerScreen,
viewportHoverEligible);
@@ -383,6 +387,7 @@ void SceneViewportController::Update(
m_transformGizmo.EndDrag(sceneRuntime);
RefreshSceneOverlays(
sceneRuntime,
session,
slotLayout.inputRect,
pointerScreen,
viewportHoverEligible);
@@ -392,6 +397,7 @@ void SceneViewportController::Update(
m_transformGizmo.UpdateDrag(sceneRuntime);
RefreshSceneOverlays(
sceneRuntime,
session,
slotLayout.inputRect,
pointerScreen,
viewportHoverEligible);
@@ -409,14 +415,16 @@ void SceneViewportController::Update(
RefreshSceneOverlays(
sceneRuntime,
session,
slotLayout.inputRect,
transition.screenPosition,
true);
if (m_transformGizmo.IsHoveringHandle() &&
m_transformGizmo.TryBeginDrag(sceneRuntime)) {
m_transformGizmo.TryBeginDrag(sceneRuntime, session)) {
m_navigationState = {};
RefreshSceneOverlays(
sceneRuntime,
session,
slotLayout.inputRect,
pointerScreen,
viewportHoverEligible);
@@ -429,6 +437,7 @@ void SceneViewportController::Update(
sceneRuntime.SetSelection(sceneIconHit.entityId);
RefreshSceneOverlays(
sceneRuntime,
session,
slotLayout.inputRect,
pointerScreen,
viewportHoverEligible);
@@ -449,6 +458,7 @@ void SceneViewportController::Update(
RefreshSceneOverlays(
sceneRuntime,
session,
slotLayout.inputRect,
pointerScreen,
viewportHoverEligible);
@@ -486,14 +496,15 @@ void SceneViewportController::Update(
}
if (HasCameraInput(input)) {
sceneRuntime.ApplySceneViewportCameraInput(input);
session.ApplyCameraInput(input);
RefreshSceneOverlays(
sceneRuntime,
session,
slotLayout.inputRect,
pointerScreen,
viewportHoverEligible);
} else {
m_sceneOverlay.Refresh(sceneRuntime, slotLayout.inputRect);
m_sceneOverlay.Refresh(sceneRuntime, session, slotLayout.inputRect);
}
}
@@ -529,12 +540,14 @@ float SceneViewportController::ConsumeDeltaTimeSeconds() {
void SceneViewportController::RefreshSceneOverlays(
EditorSceneRuntime& sceneRuntime,
const SceneViewportSession& session,
const UIRect& viewportRect,
const UIPoint& pointerScreen,
bool hoverEnabled) {
m_sceneOverlay.Refresh(sceneRuntime, viewportRect);
m_sceneOverlay.Refresh(sceneRuntime, session, viewportRect);
m_transformGizmo.Refresh(
sceneRuntime,
session,
viewportRect,
pointerScreen,
hoverEnabled);