#pragma once #include "Core/GameObject.h" #include "SelectionManager.h" #include #include #include #include namespace UI { struct ClipboardData { std::string name; std::vector> components; std::vector children; }; class SceneManager { public: static SceneManager& Get() { static SceneManager instance; return instance; } EntityID CreateEntity(const std::string& name, EntityID parent = INVALID_ENTITY); Entity* GetEntity(EntityID id) { auto it = m_entities.find(id); if (it != m_entities.end()) { return &it->second; } return nullptr; } const Entity* GetEntity(EntityID id) const { auto it = m_entities.find(id); if (it != m_entities.end()) { return &it->second; } return nullptr; } const std::vector& GetRootEntities() const { return m_rootEntities; } void DeleteEntity(EntityID id); void RenameEntity(EntityID id, const std::string& newName) { auto* entity = GetEntity(id); if (entity) { entity->name = newName; OnEntityChanged.Invoke(id); } } void CopyEntity(EntityID id); EntityID PasteEntity(EntityID parent = INVALID_ENTITY); EntityID DuplicateEntity(EntityID id); void MoveEntity(EntityID id, EntityID newParent); void CreateDemoScene(); bool HasClipboardData() const { return m_clipboard.has_value(); } Event OnEntityCreated; Event OnEntityDeleted; Event OnEntityChanged; Event<> OnSceneChanged; private: SceneManager() = default; ClipboardData CopyEntityRecursive(const Entity* entity); EntityID PasteEntityRecursive(const ClipboardData& data, EntityID parent); EntityID m_nextEntityId = 1; std::unordered_map m_entities; std::vector m_rootEntities; std::optional m_clipboard; }; }