#pragma once #include #include #include "../Scene.h" #include "../Components/BaseComponent.h" #include "../Resource/Serializable.h" #include "../Components/NameComponent.h" namespace Nuake { class Entity : public ISerializable { public: Entity(entt::entity handle, Scene* scene); Entity(const Entity& ent); Entity(); void AddChild(Entity ent); int GetHandle() { return (int)m_EntityHandle; } int GetID() { return GetComponent().ID; } template bool HasComponent() { return m_Scene->m_Registry.all_of(m_EntityHandle); } bool IsValid() { return m_Scene->m_Registry.valid((entt::entity)GetHandle()); } template T& AddComponent() { T& component = m_Scene->m_Registry.emplace(m_EntityHandle); return component; } template void RemoveComponent() { m_Scene->m_Registry.remove(m_EntityHandle); } template T& GetComponent() { T& component = m_Scene->m_Registry.get(m_EntityHandle); return component; } void Destroy() { Logger::Log("Deleted eneity :" + std::to_string((int)m_EntityHandle)); m_Scene->m_Registry.destroy(m_EntityHandle); } bool operator==(const Entity& other) const { return m_EntityHandle == other.m_EntityHandle && m_Scene == other.m_Scene; } bool operator!=(const Entity& other) const { return !(*this == other); } json Serialize() override; bool Deserialize(const std::string& str); Scene* GetScene() { return m_Scene; } private: entt::entity m_EntityHandle; Scene* m_Scene; }; }