diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2024-01-16 16:32:00 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2024-01-16 16:32:00 -0500 |
| commit | d870e5fe0021278940810f403460ca7ec9fbae19 (patch) | |
| tree | 5fc0a04ce032a7a70ad658ba11f1dced9c63b68f | |
| parent | c30b1f9b2f5d231e98194db526560eb4e010edff (diff) | |
ECS refactor entity removal - bad shortcut logic
| -rw-r--r-- | src/ecs.cpp | 72 |
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; |
