#pragma once #include #include #include #include #include #include namespace UI { using EntityID = uint64_t; constexpr EntityID INVALID_ENTITY = 0; class Component { public: virtual ~Component() = default; virtual std::string GetName() const = 0; }; class TransformComponent : public Component { public: float position[3] = {0.0f, 0.0f, 0.0f}; float rotation[3] = {0.0f, 0.0f, 0.0f}; float scale[3] = {1.0f, 1.0f, 1.0f}; std::string GetName() const override { return "Transform"; } }; class MeshRendererComponent : public Component { public: std::string materialName = "Default-Material"; std::string meshName = ""; std::string GetName() const override { return "Mesh Renderer"; } }; struct Entity { EntityID id = INVALID_ENTITY; std::string name; EntityID parent = INVALID_ENTITY; std::vector children; std::vector> components; bool selected = false; template T* AddComponent(Args&&... args) { auto comp = std::make_unique(std::forward(args)...); T* ptr = comp.get(); components.push_back(std::move(comp)); return ptr; } template T* GetComponent() { for (auto& comp : components) { if (auto casted = dynamic_cast(comp.get())) { return casted; } } return nullptr; } }; using ComponentInspectorFn = std::function; struct ComponentInspectorInfo { std::string name; ComponentInspectorFn renderFn; }; class ComponentRegistry { public: static ComponentRegistry& Get() { static ComponentRegistry instance; return instance; } template void RegisterComponent(const std::string& name, ComponentInspectorFn inspectorFn) { m_inspectors[name] = {name, inspectorFn}; m_factories[name] = []() -> std::unique_ptr { return std::make_unique(); }; } ComponentInspectorInfo* GetInspector(const std::string& name) { auto it = m_inspectors.find(name); if (it != m_inspectors.end()) { return &it->second; } return nullptr; } private: ComponentRegistry() = default; std::unordered_map m_inspectors; std::unordered_map()>> m_factories; }; }