Engine
Frameworkcreatedbymeusableforthecreationofsimplegames.CurrentlysupportsOpenGL(Verysimple)andVulkan.
EntitySystem.hpp
Go to the documentation of this file.
1 #pragma once
2 #include "Engine/api.hpp"
4 
5 #include <ThirdParty/EASTL-master/include/EASTL/shared_ptr.h>
6 #include <ThirdParty/EASTL-master/include/EASTL/string.h>
7 
8 namespace Engine
9 {
14  {
15  public:
19  void RemoveAllEntities();
20 
31  eastl::weak_ptr<Entity> CreateEntity(eastl::string entityName = "", int teamId = 0);
32 
33  template<typename EntityType>
43  eastl::weak_ptr<EntityType> CreateEntity(eastl::string entityName = "");
44 
45  template<class EntityType, class... Args>
56  eastl::weak_ptr<EntityType> CreateEntity(eastl::string entityName = "", Args&&... args);
57 
64  eastl::weak_ptr<Entity> GetEntity(uint64_t Id);
65 
70  eastl::vector<eastl::shared_ptr<Entity>> GetAllEntities() const;
71 
72  template<typename ComponentType>
77  eastl::vector<eastl::weak_ptr<ComponentType>> GetAllComponents();
78 
79  template<typename ComponentType>
84  eastl::vector<eastl::weak_ptr<Entity>> GetAllEntitiesWithComponent();
85 
90  void AddEntity(eastl::shared_ptr<Entity> entityToAdd);
91 
96  void RemoveEntity(eastl::shared_ptr<Entity> entityToRemove);
97 
98  private:
99  eastl::vector<eastl::shared_ptr<Entity>> system;
100 
101  friend class Engine;
102 
103  EntitySystem() = default;
104  public:
105  ~EntitySystem();
106  private:
107 
108  void Update();
109  };
110 
111  template <typename EntityType>
112  eastl::weak_ptr<EntityType> EntitySystem::CreateEntity(eastl::string entityName)
113  {
114  AddEntity(eastl::shared_ptr<EntityType>(new EntityType(entityName)));
115 
116  system.back()->InitializeEntity();
117 
118  return eastl::static_pointer_cast<EntityType, Entity>(system.back());
119  }
120 
121  template <class EntityType, class... Args>
122  eastl::weak_ptr<EntityType> EntitySystem::CreateEntity(eastl::string entityName, Args&&... args)
123  {
124  AddEntity(eastl::shared_ptr<EntityType>(new EntityType(eastl::forward<Args>(args)...)));
125 
126  system.back()->name = entityName;
127  system.back()->InitializeEntity();
128 
129  return eastl::static_pointer_cast<EntityType, Entity>(system.back());
130  }
131 
132  template <typename ComponentType>
133  eastl::vector<eastl::weak_ptr<ComponentType>> EntitySystem::GetAllComponents()
134  {
135  eastl::vector<eastl::weak_ptr<ComponentType>> componentsToReturn = eastl::vector<eastl::weak_ptr<ComponentType>>();
136 
137  for (eastl::vector<eastl::shared_ptr<Entity>>::iterator it = system.begin(), end = system.end(); it != end; ++it)
138  {
139  eastl::vector<eastl::weak_ptr<ComponentType>> componentsToAdd = it->get()->GetComponents<ComponentType>();
140 
141  componentsToReturn.reserve(componentsToReturn.size() + componentsToAdd.size());
142  componentsToReturn.insert(componentsToReturn.end(), componentsToAdd.begin(), componentsToAdd.end());
143  }
144 
145  return componentsToReturn;
146  }
147 
148  template <typename ComponentType>
149  eastl::vector<eastl::weak_ptr<Entity>> EntitySystem::GetAllEntitiesWithComponent()
150  {
151  eastl::vector<eastl::weak_ptr<Entity>> entitiesToReturn = eastl::vector<eastl::weak_ptr<Entity>>();
152 
153  for (size_t i = 0, size = system.size(); i < size; ++i)
154  {
155  if (system[i].get()->GetComponent<ComponentType>().expired() != false)
156  entitiesToReturn.push_back(system[i]);
157  }
158 
159  return entitiesToReturn;
160  }
161 } // namespace Engine
This object is able a holder object for components. NOTE: only the EntitySystem is allowed to create ...
Definition: Entity.hpp:13
#define ENGINE_API
Definition: api.hpp:25
eastl::vector< eastl::weak_ptr< Entity > > GetAllEntitiesWithComponent()
This method allows you to get a vector of weak pointer with entities that have the defined component ...
This object keeps track of all available entities. NOTE: only the Engine class is allowed to create t...
eastl::vector< eastl::weak_ptr< ComponentType > > GetAllComponents()
This method allows you to get a vector of weak pointers with the component type you are looking for...
eastl::weak_ptr< Entity > CreateEntity(eastl::string entityName="", int teamId=0)
Allows you to create a new Entity. This method will also add the entity to the given team if that tea...
void Update() noexcept
The general update method of the entire engine system. Call this from your main loop.
Definition: engine.cpp:137