#ifndef World_h__ #define World_h__ #include "../Common.h" #include "Entity.h" #include "ObjectPool.h" #include "ComponentPool.h" #include "EventBroker.h" class World { public: World() = default; World(EventBroker* eventBroker) : m_EventBroker(eventBroker) { } ~World(); World(const World& other); // Create empty entity EntityID CreateEntity(EntityID parent = 0); // Delete entity and all components within void DeleteEntity(EntityID entity); // Check if an entity exists bool ValidEntity(EntityID entity) const; // Register a component type and allocate space for it void RegisterComponent(ComponentInfo& ci); // Attach a component to an entity and fill it with default values ComponentWrapper AttachComponent(EntityID entity, const std::string& componentType); // Check if an entity has a component bool HasComponent(EntityID entity, const std::string& componentType) const; // Get a component of an entity ComponentWrapper GetComponent(EntityID entity, const std::string& componentType); // Delete a component off an entity void DeleteComponent(EntityID entity, const std::string& componentType); // Get all components of the specified type const ComponentPool* GetComponents(const std::string& componentType); // Get entity parent EntityID GetParent(EntityID entity); // Change the parent of an entity void SetParent(EntityID entity, EntityID parent); // Get children of an entity const std::pair::const_iterator, std::unordered_multimap::const_iterator> GetDirectChildren(EntityID entity); // Get all component pools const std::unordered_map& GetComponentPools() const { return m_ComponentPools; } // Get the entity children map const std::unordered_multimap& GetEntityChildren() const { return m_EntityChildren; } // Set the textual name of an entity void SetName(EntityID entity, const std::string& name); // Get the textual name of an entity std::string GetName(EntityID entity) const; private: EventBroker* m_EventBroker = nullptr; EntityID m_CurrentEntityID = 0; std::unordered_map m_EntityParents; // TODO: This should be a more effective structure std::unordered_multimap m_EntityChildren; std::unordered_map m_ComponentPools; std::unordered_map m_EntityNames; EntityID generateEntityID(); void deleteEntityRecursive(EntityID entity, bool cascaded = false); }; #endif