117 lines
3.4 KiB
C++
117 lines
3.4 KiB
C++
#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
|