2d-platformer/Engine-Core/include/Entities/EntityMemoryPool.h

61 lines
1.3 KiB
C++

#pragma once
#include <tuple>
#include <Entities/Components.h>
#include <Containers.h>
#include <utility.h>
class EntityManager;
class Entity;
using ComponentsContainer = std::tuple
<
container::Array<Transform, util::MAX_ENTITIES>,
container::Array<Sprite, util::MAX_ENTITIES>,
container::Array<BoundingBox, util::MAX_ENTITIES>
//container::Array<DrawDepth, util::MAX_ENTITIES>
>;
class EntityMemoryPool
{
private:
friend class EntityManager;
friend class Entity;
ComponentsContainer m_components;
container::Array<tag_t, util::MAX_ENTITIES> m_tags;
container::Array<subtag_t, util::MAX_ENTITIES> m_subTags;
container::Array<bool, util::MAX_ENTITIES> m_aliveStates;
container::Array<bool, util::MAX_ENTITIES> m_visibility;
container::Array<size_t, util::MAX_ENTITIES> m_ids;
private:
EntityMemoryPool();
EntityMemoryPool(const EntityMemoryPool&) = delete;
static EntityMemoryPool& instance()
{
static EntityMemoryPool pool{};
return pool;
}
template<typename T>
T& getComponent(index_t index)
{ return std::get<container::Array<T, util::MAX_ENTITIES>>(m_components)[index]; }
tag_t getTag(index_t index) const
{ return m_tags[index]; }
auto getAlive(index_t index)
{ return m_aliveStates[index]; }
size_t getId(index_t index) const
{ return m_ids[index]; }
auto getVisiblity(index_t index)
{ return m_visibility[index]; }
};