2 changed files with 111 additions and 0 deletions
			
			
		| @ -0,0 +1,37 @@ | ||||
| #include "inferno/scene/entity.h" | ||||
| 
 | ||||
| namespace Inferno { | ||||
| 
 | ||||
| 	Entity::Entity(const std::shared_ptr<entt::registry>& registry) | ||||
| 		: m_registry(registry) | ||||
| 	{ | ||||
| 		m_entity = m_registry.lock()->create(); | ||||
| 	} | ||||
| 
 | ||||
| 	Entity::Entity(const std::shared_ptr<entt::registry>& registry, entt::entity handle) | ||||
| 		: m_registry(registry) | ||||
| 	{ | ||||
| 		ASSERT(m_registry.lock()->valid(handle), "Can't construct entity from invalid handle"); | ||||
| 		m_entity = handle; | ||||
| 	} | ||||
| 
 | ||||
| 	Entity::Entity(const std::shared_ptr<entt::registry>& registry, uint32_t handle) | ||||
| 		: m_registry(registry) | ||||
| 	{ | ||||
| 		ASSERT(m_registry.lock()->valid(entt::entity(handle)), "Can't construct entity from invalid handle"); | ||||
| 		m_entity = entt::entity(handle); | ||||
| 	} | ||||
| 
 | ||||
| 	void Entity::valid() const | ||||
| 	{ | ||||
| 		ASSERT(m_registry.lock()->valid(m_entity)); | ||||
| 	} | ||||
| 
 | ||||
| // ----------------------------------------
 | ||||
| 
 | ||||
| 	const LogStream& operator<<(const LogStream& stream, entt::entity entity) | ||||
| 	{ | ||||
| 		return stream << static_cast<uint32_t>(entity); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,74 @@ | ||||
| #ifndef ENTITY_H | ||||
| #define ENTITY_H | ||||
| 
 | ||||
| #include <cstdint> // uint32_t, size_t | ||||
| #include <memory>  // std::shared_ptr, std::weak_ptr | ||||
| #include <utility> // std::forward | ||||
| 
 | ||||
| #include "entt/entity/registry.hpp" // ent::entity, entt::registry | ||||
| 
 | ||||
| #include "inferno/assertions.h" | ||||
| 
 | ||||
| namespace Inferno { | ||||
| 
 | ||||
| 	class Entity { | ||||
| 	public: | ||||
| 		Entity(const std::shared_ptr<entt::registry>& registry); | ||||
| 		Entity(const std::shared_ptr<entt::registry>& registry, entt::entity handle); | ||||
| 		Entity(const std::shared_ptr<entt::registry>& registry, uint32_t handle); | ||||
| 
 | ||||
| 		void valid() const; | ||||
| 
 | ||||
| 		template<typename... T> | ||||
| 		[[nodiscard]] bool has() const | ||||
| 		{ | ||||
| 			valid(); | ||||
| 			return m_registry.lock()->has<T...>(m_entity); | ||||
| 		} | ||||
| 
 | ||||
| 		template<typename... T> | ||||
| 		[[nodiscard]] bool any() const | ||||
| 		{ | ||||
| 			valid(); | ||||
| 			return m_registry.lock()->any<T...>(m_entity); | ||||
| 		} | ||||
| 
 | ||||
| 		template<typename T, typename... P> | ||||
| 		T& add(P&&... parameters) const | ||||
| 		{ | ||||
| 			valid(); | ||||
| 			return m_registry.lock()->emplace_or_replace<T>(m_entity, std::forward<P>(parameters)...); | ||||
| 		}; | ||||
| 
 | ||||
| 		template<typename T> | ||||
| 		size_t remove() const | ||||
| 		{ | ||||
| 			valid(); | ||||
| 			return m_registry.lock()->remove_if_exists<T>(m_entity); | ||||
| 		} | ||||
| 
 | ||||
| 		template<typename T, typename... P> | ||||
| 		T& get(P&&... parameters) const | ||||
| 		{ | ||||
| 			valid(); | ||||
| 			return m_registry.lock()->get_or_emplace<T>(m_entity, std::forward<P>(parameters)...); | ||||
| 		} | ||||
| 
 | ||||
| 		inline operator bool() const { return m_entity != entt::null; } | ||||
| 		inline operator entt::entity() const { return m_entity; } | ||||
| 		inline operator uint32_t() const { return static_cast<uint32_t>(m_entity); } | ||||
| 		inline uint32_t operator ()() const { return static_cast<uint32_t>(m_entity); } // ()
 | ||||
| 
 | ||||
| 	private: | ||||
| 		entt::entity m_entity = entt::null; | ||||
| 
 | ||||
| 		std::weak_ptr<entt::registry> m_registry; | ||||
| 	}; | ||||
| 
 | ||||
| // ----------------------------------------
 | ||||
| 
 | ||||
| 	const LogStream& operator<<(const LogStream& stream, entt::entity handle); | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| #endif // ENTITY_H
 | ||||
					Loading…
					
					
				
		Reference in new issue