Files
XCEngine/editor/app/Services/Scene/EditorSceneRuntime.h

151 lines
5.6 KiB
C++

#pragma once
#include "Scene/EditorSceneBackend.h"
#include "Scene/SceneToolState.h"
#include "State/EditorSelectionService.h"
#include <memory>
#include <filesystem>
#include <optional>
#include <cstdint>
#include <string>
#include <string_view>
#include <vector>
namespace XCEngine::Math {
struct Quaternion;
struct Vector3;
} // namespace XCEngine::Math
namespace XCEngine::Components {
class Scene;
} // namespace XCEngine::Components
namespace XCEngine::UI::Editor::App {
class EditorSceneRuntime {
public:
EditorSceneRuntime() = default;
EditorSceneRuntime(const EditorSceneRuntime&) = delete;
EditorSceneRuntime& operator=(const EditorSceneRuntime&) = delete;
EditorSceneRuntime(EditorSceneRuntime&&) = delete;
EditorSceneRuntime& operator=(EditorSceneRuntime&&) = delete;
void Reset();
void SetBackend(std::unique_ptr<EditorSceneBackend> backend);
EditorStartupSceneResult Initialize(const std::filesystem::path& projectRoot);
void BindSelectionService(EditorSelectionService* selectionService);
void RefreshScene();
void EnsureSceneSelection();
EditorSceneHierarchySnapshot BuildHierarchySnapshot() const;
std::vector<EditorSceneViewportIconSnapshot> BuildSceneViewportIconSnapshots() const;
std::optional<EditorSceneViewportSelectionSnapshot> BuildSceneViewportSelectionSnapshot() const;
std::vector<EditorSceneViewportHelperSnapshot> BuildSelectedViewportHelperSnapshots() const;
bool HasSceneSelection() const;
std::optional<EditorSceneObjectId> GetSelectedObjectId() const;
std::string GetSelectedItemId() const;
std::string GetSelectedDisplayName() const;
std::optional<EditorSceneObjectSnapshot> GetSelectedObjectSnapshot() const;
std::vector<EditorSceneComponentDescriptor> GetSelectedComponents() const;
std::uint64_t GetSelectionStamp() const;
std::uint64_t GetInspectorRevision() const;
std::uint64_t GetSceneContentRevision() const;
bool SetSelection(std::string_view itemId);
bool SetSelection(EditorSceneObjectId id);
void ClearSelection();
bool NewScene(std::string_view sceneName);
bool OpenSceneAsset(const std::filesystem::path& scenePath);
bool SaveScene(const std::filesystem::path& scenePath);
::XCEngine::Components::Scene* GetActiveScene() const;
std::string GetActiveSceneName() const;
std::unique_ptr<EditorScenePlaySession> BeginPlaySession();
bool RenameGameObject(
std::string_view itemId,
std::string_view newName);
bool DeleteGameObject(std::string_view itemId);
std::string DuplicateGameObject(std::string_view itemId);
bool ReparentGameObject(
std::string_view itemId,
std::string_view parentItemId);
bool MoveGameObjectBefore(
std::string_view itemId,
std::string_view targetItemId);
bool MoveGameObjectAfter(
std::string_view itemId,
std::string_view targetItemId);
bool MoveGameObjectToRoot(std::string_view itemId);
bool AddComponentToSelectedGameObject(std::string_view componentTypeName);
bool CanRemoveSelectedComponent(std::string_view componentId) const;
bool RemoveSelectedComponent(std::string_view componentId);
bool SetSelectedTransformLocalPosition(
std::string_view componentId,
const ::XCEngine::Math::Vector3& position);
bool SetSelectedTransformLocalEulerAngles(
std::string_view componentId,
const ::XCEngine::Math::Vector3& eulerAngles);
bool SetSelectedTransformLocalScale(
std::string_view componentId,
const ::XCEngine::Math::Vector3& scale);
bool ApplySelectedComponentMutation(
const EditorSceneComponentMutation& mutation);
bool CaptureSelectedTransformSnapshot(SceneTransformSnapshot& outSnapshot) const;
bool ApplyTransformSnapshot(const SceneTransformSnapshot& snapshot);
bool RecordTransformEdit(
const SceneTransformSnapshot& before,
const SceneTransformSnapshot& after);
bool ApplyTransformToolWorldPreview(
EditorSceneObjectId targetId,
const ::XCEngine::Math::Vector3& position,
const ::XCEngine::Math::Quaternion& rotation);
bool ApplyTransformToolLocalScalePreview(
EditorSceneObjectId targetId,
const ::XCEngine::Math::Vector3& localScale);
bool CanUndoTransformEdit() const;
bool CanRedoTransformEdit() const;
bool UndoTransformEdit();
bool RedoTransformEdit();
private:
struct TransformEditTransaction {
SceneTransformSnapshot before = {};
SceneTransformSnapshot after = {};
};
EditorSelectionService& SelectionService();
const EditorSelectionService& SelectionService() const;
bool HasHierarchySelection() const;
void RevalidateSelection();
bool HasValidSelection() const;
std::optional<EditorSceneObjectSnapshot> GetObjectSnapshot(
std::string_view itemId) const;
EditorSceneComponentDescriptor ResolveSelectedComponentDescriptor(
std::string_view componentId) const;
bool SelectFirstAvailableGameObject();
void ResetTransformEditHistory();
void IncrementInspectorRevision();
void IncrementSceneContentRevision();
std::filesystem::path m_projectRoot = {};
std::unique_ptr<EditorSceneBackend> m_backend = {};
EditorSelectionService m_ownedSelectionService = {};
EditorSelectionService* m_selectionService = &m_ownedSelectionService;
std::vector<TransformEditTransaction> m_transformUndoStack = {};
std::vector<TransformEditTransaction> m_transformRedoStack = {};
std::uint64_t m_inspectorRevision = 0u;
std::uint64_t m_sceneContentRevision = 0u;
};
} // namespace XCEngine::UI::Editor::App