Engine
Frameworkcreatedbymeusableforthecreationofsimplegames.CurrentlysupportsOpenGL(Verysimple)andVulkan.
Entity.hpp
Go to the documentation of this file.
1 #pragma once
2 #include "Engine/api.hpp"
5 
6 #include <ThirdParty/EASTL-master/include/EASTL/string.h>
7 
8 namespace Engine
9 {
14  {
15  public:
16 
17  virtual ~Entity() = default;
18 
19  template<typename ComponentType>
24  eastl::weak_ptr<ComponentType> GetComponent();
25 
26  template<typename ComponentType>
31  eastl::vector<eastl::weak_ptr<ComponentType>> GetComponents();
32 
37  eastl::vector<eastl::shared_ptr<Component>> GetAllComponents() const;
38 
39  template <class ComponentType, class... Args>
45  eastl::weak_ptr<ComponentType> AddComponent(Args&&... args);
46 
47  //template <class ComponentType, class... Args, eastl::enable_if_t<eastl::extent<ComponentType>::value != 0, int> = 0>
48  //eastl::weak_ptr<ComponentType> AddComponent(Args&&... args) = delete;
49 
50  template <class ComponentType, class... Args>
57  eastl::vector<eastl::weak_ptr<ComponentType>> AddComponents(size_t count, Args&&... args);
58 
59  template <typename ComponentType>
64  void RemoveComponent(size_t amountToRemove = 1);
65 
66  template <typename ComponentType>
70  void RemoveAllComponents();
71 
76  eastl::shared_ptr<Entity> GetPointer() const;
77 
81  virtual void Update();
82 
87  size_t ComponentCount() const;
88 
93  uint64_t GetID() const;
94 
98  eastl::string name;
99 
104  bool GetIsActive() const;
105 
110  void SetIsActive(bool isActive);
111 
112  protected:
113  uint64_t Id;
114  friend class EntitySystem;
115  friend class Map;
116  eastl::vector<eastl::shared_ptr<Component>> components;
117  explicit Entity(eastl::string name = "");
118  virtual void InitializeEntity();
119 
120  private:
121 
122  bool isActive;
123  void SetID(uint64_t Id);
124  void OnComponentAdded(eastl::weak_ptr<Component> addedComponent);
125  void OnComponentRemoved(eastl::weak_ptr<Component> removedComponent);
126 
127  // Allows use of OnBeginContact and OnEndContact by EntityContact Callback class
128  friend class EntityContact;
129  void OnBeginContact(eastl::weak_ptr<Entity> entity);
130  void OnEndContact(eastl::weak_ptr<Entity> entity);
131  };
132 
133  template <typename ComponentType>
134  eastl::weak_ptr<ComponentType> Entity::GetComponent()
135  {
136  for (size_t i = 0, size = components.size(); i < size; ++i)
137  {
138  if (dynamic_cast<ComponentType*>(components[i].get()))
139  {
140  return eastl::dynamic_pointer_cast<ComponentType>(components[i]);
141  }
142  }
143  return eastl::weak_ptr<ComponentType>();
144  }
145 
146  template <typename ComponentType>
147  eastl::vector<eastl::weak_ptr<ComponentType>> Entity::GetComponents()
148  {
149  eastl::vector<eastl::weak_ptr<ComponentType>> componentsToReturn;
150 
151  for (size_t i = 0, size = components.size(); i < size; ++i)
152  {
153  if (dynamic_cast<ComponentType*>(components[i].get()))
154  componentsToReturn.push_back(eastl::dynamic_pointer_cast<ComponentType>(components[i]));
155  }
156 
157  return componentsToReturn;
158  }
159 
160  template <class ComponentType, class... Args>
161  eastl::weak_ptr<ComponentType> Entity::AddComponent(Args&&... args)
162  {
163  eastl::shared_ptr<ComponentType> componentToAdd = eastl::shared_ptr<ComponentType>(new ComponentType(eastl::forward<Args>(args)...));
164  components.push_back(eastl::move(componentToAdd));
165 
166  eastl::shared_ptr<Component> componentToReturn = components.back();
167  componentToReturn->SetOwner(GetPointer());
168  componentToReturn->SetPointerReference(componentToReturn);
169  OnComponentAdded(componentToReturn);
170 
171  for (size_t j = 0, size = components.size(); j < size; ++j)
172  componentToReturn->OnComponentAdded(components[j]);
173 
174  componentToReturn->InitializeComponent();
175 
176  return eastl::static_pointer_cast<ComponentType>(componentToReturn);
177  }
178 
179  template <class ComponentType, class... Args>
180  eastl::vector<eastl::weak_ptr<ComponentType>> Entity::AddComponents(size_t count, Args&&... args)
181  {
182  eastl::vector<eastl::weak_ptr<ComponentType>> componentsToReturn;
183 
184  for (size_t i = 0; i < count; ++i)
185  {
186  eastl::shared_ptr<ComponentType> componentToAdd = eastl::shared_ptr<ComponentType>(new ComponentType(eastl::forward<Args>(args)...));
187  components.push_back(eastl::move(componentToAdd));
188 
189  eastl::shared_ptr<Component> componentToReturn = components.back();
190  componentToReturn->SetOwner(GetPointer());
191  componentToReturn->SetPointerReference(componentToReturn);
192  OnComponentAdded(componentToReturn);
193 
194  for (size_t j = 0, size = components.size(); j < size; ++j)
195  componentToReturn->OnComponentAdded(components[j]);
196 
197  componentToReturn->InitializeComponent();
198 
199  componentsToReturn.push_back(eastl::static_pointer_cast<ComponentType>(componentToReturn));
200  }
201  return componentsToReturn;
202  }
203 
204  template <typename ComponentType>
205  void Entity::RemoveComponent(size_t amountToRemove)
206  {
207  if (amountToRemove != 1 && amountToRemove > components.size())
208  amountToRemove = components.size();
209 
210  for (size_t i = components.size() - 1; i != -1; --i)
211  {
212  if (dynamic_cast<ComponentType*>(components[i].get()))
213  {
214  eastl::weak_ptr<Component> componentToRemove = components[i];
215  components.erase(components.begin() + i);
216  OnComponentRemoved(componentToRemove);
217  }
218  amountToRemove--;
219  if (amountToRemove == 0)
220  break;
221  }
222  }
223 
224  template <typename ComponentType>
226  {
227  for (size_t i = components.size() - 1; i != -1; --i)
228  {
229  if (dynamic_cast<ComponentType*>(components[i].get()))
230  {
231  eastl::weak_ptr<Component> componentToRemove = components[i];
232  components.erase(components.begin() + i);
233  OnComponentRemoved(componentToRemove);
234  }
235  }
236  }
237 } // 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< ComponentType > > AddComponents(size_t count, Args &&...args)
Allows you to create X amount of components of the given type.
Definition: Entity.hpp:180
void RemoveComponent(size_t amountToRemove=1)
Allows X amount of components of the given type.
Definition: Entity.hpp:205
eastl::vector< eastl::shared_ptr< Component > > components
Definition: Entity.hpp:116
uint64_t Id
Definition: Entity.hpp:113
eastl::weak_ptr< ComponentType > GetComponent()
This method allows you to get the first component of the given type.
Definition: Entity.hpp:134
This object keeps track of all available entities. NOTE: only the Engine class is allowed to create t...
eastl::vector< eastl::weak_ptr< ComponentType > > GetComponents()
This method allows you to get all of the components of the given type.
Definition: Entity.hpp:147
void RemoveAllComponents()
Deletes all the components of the given type.
Definition: Entity.hpp:225
eastl::string name
The name of this entity.
Definition: Entity.hpp:98
eastl::weak_ptr< ComponentType > AddComponent(Args &&...args)
Allows you to create a component of the given type.
Definition: Entity.hpp:161
IMGUI_API ImGuiID GetID(const char *str_id)
Definition: imgui.cpp:6353