refactor(new_editor): snapshot hosted editor restructuring
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user