diff options
Diffstat (limited to 'src/ecs.cpp')
| -rw-r--r-- | src/ecs.cpp | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/src/ecs.cpp b/src/ecs.cpp index de8b0cd..0294c44 100644 --- a/src/ecs.cpp +++ b/src/ecs.cpp @@ -11,11 +11,13 @@ #include <BulletCollision/CollisionShapes/btConvexHullShape.h> #include <glm/gtc/type_ptr.hpp> +typedef pk_bkt_arr_t<Entity_Base *> type_bkt_arr_entities ; + struct ECS { struct pk_membucket *bkt = nullptr; struct ECSBucketContainers { pk_bkt_arr_t<Entity_Base> generics{}; - pk_bkt_arr_t<Entity_Base *> entityPtrs{}; + type_bkt_arr_entities entityPtrs{}; pk_bkt_arr_t<CompGrBinds> grBinds{}; pk_bkt_arr_t<CompInstance> instances{}; pk_bkt_arr_t<pke_component_event> ev_mgrs{}; @@ -87,7 +89,10 @@ EntityHandle ECS_CreateEntity(Entity_Base *entity, Entity_Base *parentEntity) { assert(entity->handle == EntityHandle_MAX && "Entity already created!"); EntityHandle entityHandle{pk_bkt_arr_new_handle(&ecs.bc.entityPtrs)}; entity->handle = entityHandle; - if (parentEntity) entity->parentHandle = parentEntity->handle; + entity->parentHandle = EntityHandle_MAX; + if (parentEntity != nullptr) { + entity->parentHandle = parentEntity->handle; + } if (entity->uuid == pk_uuid_max || entity->uuid == pk_uuid_zed) entity->uuid = pk_uuid_new_v7(); ecs.bc.entityPtrs[entityHandle] = entity; return entityHandle; @@ -123,6 +128,7 @@ pk_bkt_arr *ECS_GetEntities() { void ECS_Tick_Early(double delta) { // these reserves might happen 1 tick early, but that's fine (void)delta; + pk_arr_clear(&EntitiesToBeRemoved); bool shouldRun = entitiesMarkedForRemoval.next > 0 || EntitiesToBeRemoved.next > 0 || entitiesYetToBeRemoved.next > 0; pk_arr_reserve(&entitiesYetToBeRemoved, entitiesMarkedForRemoval.reserved); pk_arr_reserve(&EntitiesToBeRemoved, entitiesMarkedForRemoval.reserved); @@ -130,6 +136,7 @@ void ECS_Tick_Early(double delta) { pk_arr_clear(&entitiesYetToBeRemoved); if (!shouldRun) return; + EntitiesToBeRemoved.next = entitiesMarkedForRemoval.next; pk_arr_clear(&entitiesMarkedForRemoval); // this has the potential to be slow as balls @@ -143,9 +150,9 @@ void ECS_Tick_Early(double delta) { // That may or may not have implications about this logic. // Might need to do several passes? - auto ent_remove_cb = [](void *user_data, void *arr_obj_data) { - (void)user_data; - Entity_Base *ent = *reinterpret_cast<Entity_Base*const*>(arr_obj_data); + type_bkt_arr_entities::FN_Iter iter_tmpln; + iter_tmpln.func = [](Entity_Base **ent_ptr) { + Entity_Base *ent = *ent_ptr; Entity_Base *parentEnt = nullptr; if (ent->parentHandle != EntityHandle_MAX) { parentEnt = ecs.bc.entityPtrs[ent->parentHandle]; @@ -162,7 +169,7 @@ void ECS_Tick_Early(double delta) { pk_arr_append_t(&EntitiesToBeRemoved, ent); } }; - pk_bkt_arr_iterate(&ecs.bc.entityPtrs, ent_remove_cb, NULL); + pk_bkt_arr_iterate(&ecs.bc.entityPtrs, type_bkt_arr_entities::FN_Iter::invoke, &iter_tmpln); } struct updateGrBindsAfter { |
