Refactor scene viewport state into local sessions
This commit is contained in:
116
editor/app/Features/Scene/SceneViewportSession.cpp
Normal file
116
editor/app/Features/Scene/SceneViewportSession.cpp
Normal file
@@ -0,0 +1,116 @@
|
||||
#include "Scene/SceneViewportSession.h"
|
||||
|
||||
#include "Scene/EditorSceneRuntime.h"
|
||||
|
||||
namespace XCEngine::UI::Editor::App {
|
||||
|
||||
namespace {
|
||||
|
||||
std::uint64_t CombineSceneViewportRequestRevisions(
|
||||
std::uint64_t sceneContentRevision,
|
||||
std::uint64_t sceneViewCameraRevision) {
|
||||
constexpr std::uint64_t kRevisionMixConstant = 0x9e3779b97f4a7c15ull;
|
||||
return sceneContentRevision ^
|
||||
(sceneViewCameraRevision + kRevisionMixConstant +
|
||||
(sceneContentRevision << 6u) +
|
||||
(sceneContentRevision >> 2u));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
SceneViewportSession::SceneViewportSession() {
|
||||
Reset();
|
||||
}
|
||||
|
||||
void SceneViewportSession::Reset() {
|
||||
m_cameraController.Reset();
|
||||
m_toolMode = SceneToolMode::Translate;
|
||||
m_toolSpaceMode = SceneToolSpaceMode::World;
|
||||
m_toolPivotMode = SceneToolPivotMode::Pivot;
|
||||
m_cameraRevision = 0u;
|
||||
}
|
||||
|
||||
EditorSceneCameraSnapshot SceneViewportSession::BuildCameraSnapshot() const {
|
||||
EditorSceneCameraSnapshot snapshot = {};
|
||||
snapshot.valid = true;
|
||||
snapshot.position = m_cameraController.GetPosition();
|
||||
snapshot.forward = m_cameraController.GetForward();
|
||||
snapshot.right = m_cameraController.GetRight();
|
||||
snapshot.up = m_cameraController.GetUp();
|
||||
snapshot.verticalFovDegrees = 60.0f;
|
||||
snapshot.nearClipPlane = 0.03f;
|
||||
snapshot.farClipPlane = 2000.0f;
|
||||
snapshot.orbitDistance = m_cameraController.GetDistance();
|
||||
return snapshot;
|
||||
}
|
||||
|
||||
SceneViewportRenderRequest SceneViewportSession::BuildRenderRequest(
|
||||
const EditorSceneRuntime& sceneRuntime) const {
|
||||
SceneViewportRenderRequest request = {};
|
||||
request.camera = BuildCameraSnapshot();
|
||||
request.requestRevision =
|
||||
BuildRequestRevision(sceneRuntime.GetSceneContentRevision());
|
||||
if (const std::optional<EditorSceneObjectId> selectedId =
|
||||
sceneRuntime.GetSelectedObjectId();
|
||||
selectedId.has_value()) {
|
||||
request.selectedObjectIds.push_back(selectedId.value());
|
||||
request.selectedHelpers =
|
||||
sceneRuntime.BuildSelectedViewportHelperSnapshots();
|
||||
}
|
||||
return request;
|
||||
}
|
||||
|
||||
void SceneViewportSession::ApplyCameraInput(
|
||||
const SceneViewportCameraInputState& input) {
|
||||
m_cameraController.ApplyInput(input);
|
||||
IncrementCameraRevision();
|
||||
}
|
||||
|
||||
bool SceneViewportSession::FocusSelection(
|
||||
const EditorSceneRuntime& sceneRuntime) {
|
||||
SceneTransformSnapshot snapshot = {};
|
||||
if (!sceneRuntime.CaptureSelectedTransformSnapshot(snapshot)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
m_cameraController.Focus(snapshot.position);
|
||||
IncrementCameraRevision();
|
||||
return true;
|
||||
}
|
||||
|
||||
SceneToolMode SceneViewportSession::GetToolMode() const {
|
||||
return m_toolMode;
|
||||
}
|
||||
|
||||
SceneToolSpaceMode SceneViewportSession::GetToolSpaceMode() const {
|
||||
return m_toolSpaceMode;
|
||||
}
|
||||
|
||||
SceneToolPivotMode SceneViewportSession::GetToolPivotMode() const {
|
||||
return m_toolPivotMode;
|
||||
}
|
||||
|
||||
void SceneViewportSession::SetToolMode(SceneToolMode mode) {
|
||||
m_toolMode = mode;
|
||||
}
|
||||
|
||||
void SceneViewportSession::SetToolSpaceMode(SceneToolSpaceMode mode) {
|
||||
m_toolSpaceMode = mode;
|
||||
}
|
||||
|
||||
void SceneViewportSession::SetToolPivotMode(SceneToolPivotMode mode) {
|
||||
m_toolPivotMode = mode;
|
||||
}
|
||||
|
||||
void SceneViewportSession::IncrementCameraRevision() {
|
||||
++m_cameraRevision;
|
||||
}
|
||||
|
||||
std::uint64_t SceneViewportSession::BuildRequestRevision(
|
||||
std::uint64_t sceneContentRevision) const {
|
||||
return CombineSceneViewportRequestRevisions(
|
||||
sceneContentRevision,
|
||||
m_cameraRevision);
|
||||
}
|
||||
|
||||
} // namespace XCEngine::UI::Editor::App
|
||||
Reference in New Issue
Block a user