summaryrefslogtreecommitdiff
path: root/src/ecs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ecs.cpp')
-rw-r--r--src/ecs.cpp19
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 {