Components.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #define IMPORT_CORE
  2. #include "core/Components.h"
  3. void initComponents(Components* c, size_t componentSize) {
  4. initHashMap(&c->entityToIndex, sizeof(Entity), sizeof(size_t));
  5. initList(&c->indexToEntity, sizeof(Entity));
  6. initList(&c->components, componentSize);
  7. }
  8. void destroyComponents(Components* c) {
  9. destroyHashMap(&c->entityToIndex);
  10. destroyList(&c->indexToEntity);
  11. destroyList(&c->components);
  12. }
  13. void* getOrAddComponent(Components* c, Entity e) {
  14. void* component = searchComponent(c, e);
  15. if(component != nullptr) {
  16. return component;
  17. }
  18. size_t index = c->components.length;
  19. putHashMapPair(&c->entityToIndex, &e, &index);
  20. addListData(&c->indexToEntity, &e);
  21. return addEmptyListData(&c->components);
  22. }
  23. void* searchComponent(Components* c, Entity e) {
  24. size_t* index = searchHashMapKey(&c->entityToIndex, &e);
  25. if(index == nullptr) {
  26. return nullptr;
  27. }
  28. return getListIndex(&c->components, *index);
  29. }
  30. bool removeComponent(Components* c, Entity e) {
  31. size_t* indexP = searchHashMapKey(&c->entityToIndex, &e);
  32. if(indexP == nullptr) {
  33. return false;
  34. }
  35. size_t lastIndex = c->components.length - 1;
  36. size_t index = *indexP;
  37. removeHashMapKey(&c->entityToIndex, &e);
  38. removeListIndexBySwap(&c->components, index);
  39. if(index == lastIndex) {
  40. removeListIndexBySwap(&c->indexToEntity, index);
  41. return true;
  42. }
  43. Entity other = getTypedListIndex(&c->indexToEntity, lastIndex, Entity);
  44. removeListIndexBySwap(&c->indexToEntity, index);
  45. putHashMapPair(&c->entityToIndex, &other, &index);
  46. return true;
  47. }
  48. void initComponentIterator(ComponentIterator* ci, Components* c) {
  49. ci->indexToEntity = getListStart(&c->indexToEntity);
  50. ci->indexToEntityEnd = getListEnd(&c->indexToEntity);
  51. ci->component = getListStart(&c->components);
  52. ci->componentEnd = getListEnd(&c->components);
  53. ci->componentSize = c->components.dataSize;
  54. ci->node = (ComponentNode){0};
  55. }
  56. bool hasNextComponentNode(ComponentIterator* ci) {
  57. return ci->indexToEntity != ci->indexToEntityEnd;
  58. }
  59. ComponentNode* nextComponentNode(ComponentIterator* ci) {
  60. ci->node.component = ci->component;
  61. ci->node.entity = *ci->indexToEntity;
  62. ci->indexToEntity++;
  63. ci->component = (char*)ci->component + ci->componentSize;
  64. return &ci->node;
  65. }
  66. void* getComponentsStart(Components* c) {
  67. return getListStart(&c->components);
  68. }
  69. void* getComponentsEnd(Components* c) {
  70. return getListEnd(&c->components);
  71. }