123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- #define IMPORT_CORE
- #include "core/Components.h"
- void initComponents(Components* c, size_t componentSize) {
- initHashMap(&c->entityToIndex, sizeof(Entity), sizeof(size_t));
- initList(&c->indexToEntity, sizeof(Entity));
- initList(&c->components, componentSize);
- }
- void destroyComponents(Components* c) {
- destroyHashMap(&c->entityToIndex);
- destroyList(&c->indexToEntity);
- destroyList(&c->components);
- }
- void* getOrAddComponent(Components* c, Entity e) {
- void* component = searchComponent(c, e);
- if(component != nullptr) {
- return component;
- }
- size_t index = c->components.length;
- putHashMapPair(&c->entityToIndex, &e, &index);
- addListData(&c->indexToEntity, &e);
- return addEmptyListData(&c->components);
- }
- void* searchComponent(Components* c, Entity e) {
- size_t* index = searchHashMapKey(&c->entityToIndex, &e);
- if(index == nullptr) {
- return nullptr;
- }
- return getListIndex(&c->components, *index);
- }
- bool removeComponent(Components* c, Entity e) {
- size_t* indexP = searchHashMapKey(&c->entityToIndex, &e);
- if(indexP == nullptr) {
- return false;
- }
- size_t lastIndex = c->components.length - 1;
- size_t index = *indexP;
- removeHashMapKey(&c->entityToIndex, &e);
- removeListIndexBySwap(&c->components, index);
- if(index == lastIndex) {
- removeListIndexBySwap(&c->indexToEntity, index);
- return true;
- }
- Entity other = getTypedListIndex(&c->indexToEntity, lastIndex, Entity);
- removeListIndexBySwap(&c->indexToEntity, index);
- putHashMapPair(&c->entityToIndex, &other, &index);
- return true;
- }
- void initComponentIterator(ComponentIterator* ci, Components* c) {
- ci->indexToEntity = getListStart(&c->indexToEntity);
- ci->indexToEntityEnd = getListEnd(&c->indexToEntity);
- ci->component = getListStart(&c->components);
- ci->componentEnd = getListEnd(&c->components);
- ci->componentSize = c->components.dataSize;
- ci->node = (ComponentNode){0};
- }
- bool hasNextComponentNode(ComponentIterator* ci) {
- return ci->indexToEntity != ci->indexToEntityEnd;
- }
- ComponentNode* nextComponentNode(ComponentIterator* ci) {
- ci->node.component = ci->component;
- ci->node.entity = *ci->indexToEntity;
- ci->indexToEntity++;
- ci->component = (char*)ci->component + ci->componentSize;
- return &ci->node;
- }
- void* getComponentsStart(Components* c) {
- return getListStart(&c->components);
- }
- void* getComponentsEnd(Components* c) {
- return getListEnd(&c->components);
- }
|