summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2024-01-16 16:32:00 -0500
committerJonathan Bradley <jcb@pikum.xyz>2024-01-16 16:32:00 -0500
commitd870e5fe0021278940810f403460ca7ec9fbae19 (patch)
tree5fc0a04ce032a7a70ad658ba11f1dced9c63b68f /src
parentc30b1f9b2f5d231e98194db526560eb4e010edff (diff)
ECS refactor entity removal - bad shortcut logic
Diffstat (limited to 'src')
-rw-r--r--src/ecs.cpp72
1 files changed, 36 insertions, 36 deletions
diff --git a/src/ecs.cpp b/src/ecs.cpp
index 203adb5..80a4daf 100644
--- a/src/ecs.cpp
+++ b/src/ecs.cpp
@@ -92,24 +92,30 @@ Entity_Base *ECS_GetEntity(EntityHandle handle) {
}
void ECS_MarkForRemoval(Entity_Base *entity) {
+ assert(entity->handle != EntityHandle_MAX && "Attempting to remove invalid entity");
assert(entity->isMarkedForRemoval == false && "Entity already marked for removal");
entitiesMarkedForRemoval.Push(entity);
}
void ECS_Tick_Early(double delta) {
// these reserves might happen 1 tick early, but that's fine
+ bool shouldRun = entitiesMarkedForRemoval.Count() > 0 || EntitiesToBeRemoved.Count() > 0 || entitiesYetToBeRemoved.Count() > 0;
entitiesYetToBeRemoved.Reserve(entitiesMarkedForRemoval.Count());
EntitiesToBeRemoved.Resize(entitiesMarkedForRemoval.Count());
memcpy(EntitiesToBeRemoved.GetPtr(), entitiesMarkedForRemoval.GetPtr(), sizeof(void *) * entitiesMarkedForRemoval.Count());
entitiesYetToBeRemoved.Resize(0);
- if (entitiesMarkedForRemoval.Count() == 0) return;
+ if (!shouldRun) return;
+ entitiesMarkedForRemoval.Resize(0);
// this has the potential to be slow as balls
- for (long b = 0; b <= ecs.bc.entityPtrs.pkeHandle.bucketIndex; ++b) {
- uint64_t entCount = b == ecs.bc.entityPtrs.pkeHandle.bucketIndex ? ecs.bc.entityPtrs.pkeHandle.itemIndex : ecs.bc.entityPtrs.limits.itemIndex;
- for (long e = 0; e < entCount; ++e) {
+ for (PkeHandleBucketIndex_T b = 0; b <= ecs.bc.entityPtrs.pkeHandle.bucketIndex; ++b) {
+ PkeHandleItemIndex_T entCount = b == ecs.bc.entityPtrs.pkeHandle.bucketIndex ? ecs.bc.entityPtrs.pkeHandle.itemIndex : ecs.bc.entityPtrs.limits.itemIndex;
+ for (PkeHandleItemIndex_T e = 0; e < entCount; ++e) {
Entity_Base *ent = ecs.bc.entityPtrs.buckets[b][e];
if (ent->handle == EntityHandle_MAX) continue;
+ Entity_Base *parentEnt = nullptr;
+ if (ent->parentHandle != EntityHandle_MAX)
+ parentEnt = ecs.bc.entityPtrs.buckets[ent->parentHandle.bucketIndex][ent->parentHandle.itemIndex];
if (ent->isMarkedForRemoval) {
entitiesYetToBeRemoved.Push(ent);
ent->handle = EntityHandle_MAX;
@@ -117,7 +123,7 @@ void ECS_Tick_Early(double delta) {
ent->isMarkedForRemoval = false;
} else if (EntitiesToBeRemoved.Has(ent)) {
ent->isMarkedForRemoval = true;
- } else if (EntitiesToBeRemoved.Has(ent)) {
+ } else if (parentEnt != nullptr && EntitiesToBeRemoved.Has(parentEnt)) {
ent->isMarkedForRemoval = true;
EntitiesToBeRemoved.Push(ent);
}
@@ -125,10 +131,6 @@ void ECS_Tick_Early(double delta) {
}
}
-bool DynArrayFindComponent(Entity_Base *const &entity, const EntityHandle &handle) {
- return entity->handle == handle;
-}
-
struct updateGrBindsAfter {
GrBindsHandle grBindsHandle = GrBindsHandle_MAX;
uint32_t count = 0;
@@ -157,33 +159,31 @@ void ECS_Tick(double delta) {
} else {
inst.isNeedingUpdated = true;
}
- if (entityRemovalCount > 0) {
- int64_t removeIndex = entitiesYetToBeRemoved.FindFirstIndex(DynArrayFindComponent, inst.entHandle);
- if (removeIndex != -1) {
- if (inst.grBindsHandle != GrBindsHandle_MAX) {
- int64_t afterIndex = updateGrBinds.FindFirstIndex(DynArrayFindGrBinds, inst.grBindsHandle);
- updateGrBindsAfter *after = nullptr;
- if (afterIndex != -1) {
- after = &updateGrBinds[afterIndex];
- } else {
- after = &updateGrBinds.Push();
- after->grBindsHandle = inst.grBindsHandle;
- }
- after->count += 1;
+ Entity_Base *ent = ecs.bc.entityPtrs.buckets[inst.entHandle.bucketIndex][inst.entHandle.itemIndex];
+ if (entityRemovalCount > 0 && entitiesYetToBeRemoved.Has(ent)) {
+ if (inst.grBindsHandle != GrBindsHandle_MAX) {
+ int64_t afterIndex = updateGrBinds.FindFirstIndex(DynArrayFindGrBinds, inst.grBindsHandle);
+ updateGrBindsAfter *after = nullptr;
+ if (afterIndex != -1) {
+ after = &updateGrBinds[afterIndex];
+ } else {
+ after = &updateGrBinds.Push();
+ after->grBindsHandle = inst.grBindsHandle;
}
-
- inst.entHandle = EntityHandle_MAX;
- inst.grBindsHandle = GrBindsHandle_MAX;
- inst.index = ECS_UNSET_VAL_32;
- inst.instanceHandle = InstanceHandle_MAX;
- inst.isNeedingUpdated = false;
- BtDynamicsWorld->removeRigidBody(inst.bt.rigidBody);
- Pke_Delete<btDefaultMotionState>(inst.bt.motionState, MemBkt_Bullet);
- Pke_Delete<btRigidBody>(inst.bt.rigidBody, MemBkt_Bullet);
- inst.bt.rigidBody = CAFE_BABE(btRigidBody);
- inst.bt.motionState = CAFE_BABE(btDefaultMotionState);
- continue;
+ after->count += 1;
}
+
+ inst.entHandle = EntityHandle_MAX;
+ inst.grBindsHandle = GrBindsHandle_MAX;
+ inst.index = ECS_UNSET_VAL_32;
+ inst.instanceHandle = InstanceHandle_MAX;
+ inst.isNeedingUpdated = false;
+ BtDynamicsWorld->removeRigidBody(inst.bt.rigidBody);
+ Pke_Delete<btDefaultMotionState>(inst.bt.motionState, MemBkt_Bullet);
+ Pke_Delete<btRigidBody>(inst.bt.rigidBody, MemBkt_Bullet);
+ inst.bt.rigidBody = CAFE_BABE(btRigidBody);
+ inst.bt.motionState = CAFE_BABE(btDefaultMotionState);
+ continue;
}
if (updateGrBinds.Count() > 0 && inst.instanceHandle != InstanceHandle_MAX) {
int64_t afterIndex = updateGrBinds.FindFirstIndex(DynArrayFindGrBinds, inst.grBindsHandle);
@@ -205,9 +205,9 @@ void ECS_Tick(double delta) {
if (grBinds.entHandle == EntityHandle_MAX) {
continue;
}
- auto removalIndex = entitiesYetToBeRemoved.FindFirstIndex(DynArrayFindComponent, grBinds.entHandle);
auto afterIndex = updateGrBinds.FindFirstIndex(DynArrayFindGrBinds, grBinds.grBindsHandle);
- if (removalIndex != -1) {
+ Entity_Base *ent = ecs.bc.entityPtrs.buckets[grBinds.entHandle.bucketIndex][grBinds.entHandle.itemIndex];
+ if (entitiesYetToBeRemoved.Has(ent)) {
grBinds.entHandle = EntityHandle_MAX;
grBinds.grBindsHandle = GrBindsHandle_MAX;
grBinds.vkPipelineLayout = VK_NULL_HANDLE;