refactor(new_editor): snapshot hosted editor restructuring

This commit is contained in:
2026-04-21 00:57:14 +08:00
parent e123e584c8
commit 9b7b369007
248 changed files with 21152 additions and 14397 deletions

View File

@@ -115,12 +115,33 @@ void ApplySceneToolMode(
sceneRuntime.SetToolMode(mode);
}
void ApplySceneViewportToggleButton(
std::size_t toggleIndex,
EditorSceneRuntime& sceneRuntime) {
if (toggleIndex == 0u) {
sceneRuntime.SetToolPivotMode(
sceneRuntime.GetToolPivotMode() == SceneToolPivotMode::Pivot
? SceneToolPivotMode::Center
: SceneToolPivotMode::Pivot);
return;
}
if (toggleIndex == 1u) {
sceneRuntime.SetToolSpaceMode(
sceneRuntime.GetToolSpaceMode() == SceneToolSpaceMode::World
? SceneToolSpaceMode::Local
: SceneToolSpaceMode::World);
}
}
} // namespace
void SceneViewportController::Initialize(
const std::filesystem::path& repoRoot,
Ports::TexturePort& renderer) {
Ports::TexturePort& renderer,
const BuiltInIcons* builtInIcons) {
m_toolOverlay.Initialize(repoRoot, renderer);
m_sceneOverlay.SetBuiltInIcons(builtInIcons);
ResetInteractionState();
}
@@ -131,6 +152,7 @@ void SceneViewportController::Shutdown(Ports::TexturePort& renderer) {
void SceneViewportController::ResetInteractionState() {
ResetFrameState();
m_sceneOverlay.ResetFrame();
m_toolOverlay.ResetFrame();
m_transformGizmo.ResetVisualState();
}
@@ -181,13 +203,15 @@ void SceneViewportController::Update(
inputFrame.pointerButtonTransitions.end(),
[&](const auto& transition) {
return transition.pressed &&
ContainsPoint(slotLayout.inputRect, transition.screenPosition);
ContainsPoint(slotLayout.bounds, transition.screenPosition);
}))) {
m_commandFocusService->ClaimFocus(EditorActionRoute::Scene);
}
if (inputFrame.focusLost) {
m_navigationState = {};
m_hoveredToggleOverlayIndex = kSceneViewportToolOverlayInvalidIndex;
m_activeToggleOverlayIndex = kSceneViewportToolOverlayInvalidIndex;
m_hoveredToolOverlayIndex = kSceneViewportToolOverlayInvalidIndex;
m_activeToolOverlayIndex = kSceneViewportToolOverlayInvalidIndex;
if (m_transformGizmo.IsActive()) {
@@ -197,12 +221,22 @@ void SceneViewportController::Update(
m_toolOverlay.BuildFrame(
slotLayout.inputRect,
slotLayout.topBarRect,
slotLayout.bounds,
sceneRuntime.GetToolMode(),
sceneRuntime.GetToolPivotMode(),
sceneRuntime.GetToolSpaceMode(),
kSceneViewportToolOverlayInvalidIndex,
kSceneViewportToolOverlayInvalidIndex,
kSceneViewportToolOverlayInvalidIndex,
kSceneViewportToolOverlayInvalidIndex);
const bool pointerOverToolOverlay =
const bool pointerOverOverlay =
inputState.hasPointerPosition &&
m_toolOverlay.Contains(pointerScreen);
const std::size_t hoveredToggleOverlayIndex =
inputState.hasPointerPosition
? m_toolOverlay.HitTestToggle(pointerScreen)
: kSceneViewportToolOverlayInvalidIndex;
const std::size_t hoveredToolOverlayIndex =
inputState.hasPointerPosition
? m_toolOverlay.HitTest(pointerScreen)
@@ -213,6 +247,19 @@ void SceneViewportController::Update(
continue;
}
const std::size_t transitionHoveredToggleOverlayIndex =
m_toolOverlay.HitTestToggle(transition.screenPosition);
if (transition.pressed &&
transitionHoveredToggleOverlayIndex !=
kSceneViewportToolOverlayInvalidIndex &&
!m_transformGizmo.IsActive()) {
m_activeToggleOverlayIndex = transitionHoveredToggleOverlayIndex;
ApplySceneViewportToggleButton(
m_activeToggleOverlayIndex,
sceneRuntime);
continue;
}
const std::size_t transitionHoveredToolOverlayIndex =
m_toolOverlay.HitTest(transition.screenPosition);
if (transition.pressed &&
@@ -229,21 +276,31 @@ void SceneViewportController::Update(
continue;
}
m_activeToggleOverlayIndex = kSceneViewportToolOverlayInvalidIndex;
m_activeToolOverlayIndex = kSceneViewportToolOverlayInvalidIndex;
}
if (!leftMouseDown) {
m_activeToggleOverlayIndex = kSceneViewportToolOverlayInvalidIndex;
m_activeToolOverlayIndex = kSceneViewportToolOverlayInvalidIndex;
}
m_hoveredToggleOverlayIndex = hoveredToggleOverlayIndex;
m_hoveredToolOverlayIndex = hoveredToolOverlayIndex;
m_toolOverlay.BuildFrame(
slotLayout.inputRect,
slotLayout.topBarRect,
slotLayout.bounds,
sceneRuntime.GetToolMode(),
sceneRuntime.GetToolPivotMode(),
sceneRuntime.GetToolSpaceMode(),
m_hoveredToolOverlayIndex,
m_activeToolOverlayIndex);
m_activeToolOverlayIndex,
m_hoveredToggleOverlayIndex,
m_activeToggleOverlayIndex);
const bool toolOverlayInteractionActive =
m_activeToolOverlayIndex != kSceneViewportToolOverlayInvalidIndex;
const bool overlayInteractionActive =
m_activeToolOverlayIndex != kSceneViewportToolOverlayInvalidIndex ||
m_activeToggleOverlayIndex != kSceneViewportToolOverlayInvalidIndex;
const bool usingViewMoveTool = IsViewMoveTool(sceneRuntime.GetToolMode());
@@ -284,13 +341,13 @@ void SceneViewportController::Update(
const bool viewportHoverEligible =
inputState.hasPointerPosition &&
ContainsPoint(slotLayout.inputRect, pointerScreen) &&
!pointerOverToolOverlay &&
!toolOverlayInteractionActive &&
!pointerOverOverlay &&
!overlayInteractionActive &&
!m_navigationState.lookDragging &&
!m_navigationState.panDragging;
if (!m_transformGizmo.IsActive() &&
!toolOverlayInteractionActive &&
!overlayInteractionActive &&
inputFrame.focused &&
!m_navigationState.lookDragging &&
!m_navigationState.panDragging) {
@@ -306,7 +363,7 @@ void SceneViewportController::Update(
sceneRuntime.FocusSceneSelection();
}
m_transformGizmo.Refresh(
RefreshSceneOverlays(
sceneRuntime,
slotLayout.inputRect,
pointerScreen,
@@ -316,7 +373,7 @@ void SceneViewportController::Update(
if (m_transformGizmo.IsActive()) {
if (WasKeyPressed(inputFrame, KeyCode::Escape)) {
m_transformGizmo.CancelDrag(sceneRuntime);
m_transformGizmo.Refresh(
RefreshSceneOverlays(
sceneRuntime,
slotLayout.inputRect,
pointerScreen,
@@ -326,7 +383,7 @@ void SceneViewportController::Update(
if (!leftMouseDown) {
m_transformGizmo.EndDrag(sceneRuntime);
m_transformGizmo.Refresh(
RefreshSceneOverlays(
sceneRuntime,
slotLayout.inputRect,
pointerScreen,
@@ -335,7 +392,7 @@ void SceneViewportController::Update(
}
m_transformGizmo.UpdateDrag(sceneRuntime);
m_transformGizmo.Refresh(
RefreshSceneOverlays(
sceneRuntime,
slotLayout.inputRect,
pointerScreen,
@@ -352,7 +409,7 @@ void SceneViewportController::Update(
continue;
}
m_transformGizmo.Refresh(
RefreshSceneOverlays(
sceneRuntime,
slotLayout.inputRect,
transition.screenPosition,
@@ -360,7 +417,19 @@ void SceneViewportController::Update(
if (m_transformGizmo.IsHoveringHandle() &&
m_transformGizmo.TryBeginDrag(sceneRuntime)) {
m_navigationState = {};
m_transformGizmo.Refresh(
RefreshSceneOverlays(
sceneRuntime,
slotLayout.inputRect,
pointerScreen,
viewportHoverEligible);
return;
}
const SceneViewportSceneOverlay::HitResult sceneIconHit =
m_sceneOverlay.HitTest(transition.screenPosition);
if (sceneIconHit.HasHit()) {
sceneRuntime.SetSelection(sceneIconHit.entityId);
RefreshSceneOverlays(
sceneRuntime,
slotLayout.inputRect,
pointerScreen,
@@ -380,7 +449,7 @@ void SceneViewportController::Update(
}
}
m_transformGizmo.Refresh(
RefreshSceneOverlays(
sceneRuntime,
slotLayout.inputRect,
pointerScreen,
@@ -388,7 +457,7 @@ void SceneViewportController::Update(
}
}
if (toolOverlayInteractionActive) {
if (overlayInteractionActive) {
return;
}
@@ -414,27 +483,32 @@ void SceneViewportController::Update(
} else if (m_navigationState.panDragging) {
input.panDeltaX = inputFrame.pointerDelta.x;
input.panDeltaY = inputFrame.pointerDelta.y;
} else if (ContainsPoint(slotLayout.inputRect, pointerScreen) && !pointerOverToolOverlay) {
} else if (ContainsPoint(slotLayout.inputRect, pointerScreen) && !pointerOverOverlay) {
input.zoomDelta = NormalizeWheelDelta(inputFrame.wheelDelta);
}
if (HasCameraInput(input)) {
sceneRuntime.ApplySceneViewportCameraInput(input);
m_transformGizmo.Refresh(
RefreshSceneOverlays(
sceneRuntime,
slotLayout.inputRect,
pointerScreen,
viewportHoverEligible);
} else {
m_sceneOverlay.Refresh(sceneRuntime, slotLayout.inputRect);
}
}
void SceneViewportController::Append(::XCEngine::UI::UIDrawList& drawList) const {
m_sceneOverlay.Append(drawList);
AppendSceneViewportTransformGizmo(drawList, m_transformGizmo.GetFrame());
AppendSceneViewportToolOverlay(drawList, m_toolOverlay.GetFrame());
}
void SceneViewportController::ResetFrameState() {
m_navigationState = {};
m_hoveredToggleOverlayIndex = kSceneViewportToolOverlayInvalidIndex;
m_activeToggleOverlayIndex = kSceneViewportToolOverlayInvalidIndex;
m_hoveredToolOverlayIndex = kSceneViewportToolOverlayInvalidIndex;
m_activeToolOverlayIndex = kSceneViewportToolOverlayInvalidIndex;
m_lastUpdateTime = {};
@@ -455,4 +529,17 @@ float SceneViewportController::ConsumeDeltaTimeSeconds() {
return std::clamp(deltaTime, 0.0f, 0.1f);
}
void SceneViewportController::RefreshSceneOverlays(
EditorSceneRuntime& sceneRuntime,
const UIRect& viewportRect,
const UIPoint& pointerScreen,
bool hoverEnabled) {
m_sceneOverlay.Refresh(sceneRuntime, viewportRect);
m_transformGizmo.Refresh(
sceneRuntime,
viewportRect,
pointerScreen,
hoverEnabled);
}
} // namespace XCEngine::UI::Editor::App