231 ComponentArray componentArray = {};
233 ComponentBitSet componentBitSet;
234 GroupBitSet groupBitSet;
236 std::optional<ComponentArray> nodeComponentArray;
237 std::optional<ComponentBitSet> nodeComponentBitSet;
239 Entity* parent_entity =
nullptr;
243 bool isVertical =
false;
245 float slotSpacing = 0.0f;
251 void setId(EntityID m_id) {
id = m_id; }
253 EntityID getId() {
return id; }
267 std::vector<std::unique_ptr<BaseComponent>> components;
272 virtual void update(
float deltaTime)
275 for (
auto& c : components) {
276 c->update(deltaTime);
280 virtual void cellUpdate() {};
282 virtual Cell* getOwnerCell()
const {
return nullptr; };
286 for (
auto& c : components) {
287 c->draw(e_index, batch, window);
292 for (
auto& c : components) {
293 c->draw(e_index, batch, window);
298 for (
auto& c : components) {
299 c->draw(e_index, batch, window);
304 for (
auto& c : components) {
305 c->draw(e_index, batch, window);
309 virtual void onCreation() {
312 Entity* getParentEntity() {
313 return parent_entity;
316 void setParentEntity(
Entity* pEntity) {
317 parent_entity = pEntity;
320 bool isActive() {
return active; }
321 virtual void destroy() {
325 bool hasGroup(Group mGroup)
327 return groupBitSet[mGroup];
330 virtual void addToGroup(Group mGroup);
331 virtual void removeGroup(Group mGroup);
333 template <
typename T>
bool hasComponent()
const
335 if constexpr (std::is_base_of_v<LinkComponent, T>) {
336 return this && componentBitSet[GetLinkComponentTypeID<T>()];
338 else if constexpr (std::is_base_of_v<NodeComponent, T>) {
339 return this && nodeComponentBitSet.has_value() && (*nodeComponentBitSet)[GetNodeComponentTypeID<T>()];
341 return this && componentBitSet[GetComponentTypeID<T>()];
344 template <
typename T,
typename... TArgs>
347 T* c(
new T(std::forward<TArgs>(mArgs)...));
348 if constexpr (std::is_base_of_v<LinkComponent, T>) {
349 std::unique_ptr<LinkComponent> uPtr{ c };
350 components.emplace_back(std::move(uPtr));
352 setComponentEntity(c);
353 componentArray[GetLinkComponentTypeID<T>()] = c;
354 componentBitSet[GetLinkComponentTypeID<T>()] =
true;
356 c->id = GetLinkComponentTypeID<T>();
361 else if constexpr (std::is_base_of_v<NodeComponent, T>) {
362 std::unique_ptr<NodeComponent> uPtr{ c };
363 components.emplace_back(std::move(uPtr));
365 setComponentEntity(c);
366 (*nodeComponentArray)[GetNodeComponentTypeID<T>()] = c;
367 (*nodeComponentBitSet)[GetNodeComponentTypeID<T>()] =
true;
369 c->id = GetNodeComponentTypeID<T>();
375 std::unique_ptr<Component> uPtr{ c };
376 components.emplace_back(std::move(uPtr));
378 setComponentEntity(c);
379 componentArray[GetComponentTypeID<T>()] = c;
380 componentBitSet[GetComponentTypeID<T>()] =
true;
382 c->id = GetComponentTypeID<T>();
391 template <
typename T>
392 void removeComponent()
394 if constexpr (std::is_base_of_v<LinkComponent, T>)
396 size_t id = GetLinkComponentTypeID<T>();
397 auto it = std::remove_if(components.begin(), components.end(),
398 [
id](
const std::unique_ptr<BaseComponent>& comp) {
399 return typeid(*comp).hash_code() == typeid(T).hash_code();
402 if (it != components.end())
404 components.erase(it, components.end());
405 componentArray[id] =
nullptr;
406 componentBitSet[id] =
false;
409 else if constexpr (std::is_base_of_v<NodeComponent, T>)
411 size_t id = GetNodeComponentTypeID<T>();
412 auto it = std::remove_if(components.begin(), components.end(),
413 [
id](
const std::unique_ptr<BaseComponent>& comp) {
414 return typeid(*comp).hash_code() == typeid(T).hash_code();
417 if (it != components.end())
419 components.erase(it, components.end());
420 (*nodeComponentArray)[id] =
nullptr;
421 (*nodeComponentBitSet)[id] =
false;
426 size_t id = GetComponentTypeID<T>();
427 auto it = std::remove_if(components.begin(), components.end(),
428 [
id](
const std::unique_ptr<BaseComponent>& comp) {
429 return typeid(*comp).hash_code() == typeid(T).hash_code();
432 if (it != components.end())
434 components.erase(it, components.end());
435 componentArray[id] =
nullptr;
436 componentBitSet[id] =
false;
441 virtual void setComponentEntity(
Component* c) {
451 template<
typename T> T& GetComponent()
const
453 if constexpr (std::is_base_of_v<LinkComponent, T>) {
454 auto ptr(componentArray[GetLinkComponentTypeID<T>()]);
455 return *
static_cast<T*
>(ptr);
457 else if constexpr (std::is_base_of_v<NodeComponent, T>) {
458 auto ptr((*nodeComponentArray)[GetNodeComponentTypeID<T>()]);
459 return *
static_cast<T*
>(ptr);
462 auto ptr(componentArray[GetComponentTypeID<T>()]);
463 return *
static_cast<T*
>(ptr);
467 template<
typename T> T* GetComponentPtr()
469 if constexpr (std::is_base_of_v<LinkComponent, T>) {
470 auto ptr(componentArray[GetLinkComponentTypeID<T>()]);
471 return static_cast<T*
>(ptr);
473 else if constexpr (std::is_base_of_v<NodeComponent, T>) {
474 auto ptr((*nodeComponentArray)[GetNodeComponentTypeID<T>()]);
475 return static_cast<T*
>(ptr);
478 auto ptr(componentArray[GetComponentTypeID<T>()]);
479 return static_cast<T*
>(ptr);
483 bool hasComponentByName(
const std::string& componentName) {
484 for (
auto& component : components) {
486 component->GetComponentName() == componentName) {
500 virtual void imgui_print() {}
502 virtual void imgui_display() {}
504 virtual void removeEntityFromCell() {}
505 virtual void removeFromCell() {};
506 virtual void removeFromCells() {};