diff options
| -rw-r--r-- | src/components.hpp | 2 | ||||
| -rw-r--r-- | src/ecs.cpp | 72 |
2 files changed, 66 insertions, 8 deletions
diff --git a/src/components.hpp b/src/components.hpp index 7f3c0bb..4ea4db2 100644 --- a/src/components.hpp +++ b/src/components.hpp @@ -34,6 +34,7 @@ struct InstPos { }; struct CompGrBinds { + EntityHandle entHandle = EntityHandle_MAX; GrBindsHandle grBindsHandle = GrBindsHandle_MAX; VkDeviceMemory deviceMemory = VK_NULL_HANDLE; VkBuffer vertexBuffer = VK_NULL_HANDLE; @@ -56,6 +57,7 @@ struct CompGrBinds { }; struct CompInstance { + EntityHandle entHandle = EntityHandle_MAX; GrBindsHandle grBindsHandle = GrBindsHandle_MAX; InstanceHandle instanceHandle = InstanceHandle_MAX; uint64_t index = ECS_UNSET_VAL; diff --git a/src/ecs.cpp b/src/ecs.cpp index 389e53f..14f19c2 100644 --- a/src/ecs.cpp +++ b/src/ecs.cpp @@ -14,8 +14,9 @@ struct InstanceBucket { CompInstance instances[maxBucketItemCount]; }; +DynArray<EntityHandle> EntitiesToBeRemoved{16}; // public + DynArray<EntityHandle> entitiesMarkedForRemoval{16}; -DynArray<EntityHandle> EntitiesToBeRemoved{16}; BucketContainer<EntityBucket, EntityHandle_T> Entities_BucketContainer{}; BucketContainer<GrBindsBucket, GrBindsHandle_T> Comp_GrBinds_BucketContainer{}; BucketContainer<InstanceBucket, InstanceHandle_T> Comp_Instance_BucketContainer{}; @@ -61,6 +62,8 @@ void ECS_MarkForRemoval(EntityHandle entityHandle) { } void ECS_Tick(double delta) { + static DynArray<Entity> entitiesYetToBeRemoved{0}; + entitiesYetToBeRemoved.Resize(EntitiesToBeRemoved.Count()); EntitiesToBeRemoved.Resize(0); for (long b = 0; b <= Entities_BucketContainer.bucketCounter; ++b) { uint64_t entCount = b == Entities_BucketContainer.bucketCounter ? Entities_BucketContainer.itemCounter >> 32 : maxBucketItemCount; @@ -71,20 +74,71 @@ void ECS_Tick(double delta) { ent->handle = EntityHandle_MAX; ent->parentHandle = EntityHandle_MAX; ent->isMarkedForRemoval = false; - // TODO destroy components + entitiesYetToBeRemoved[0] = *ent; } else { - if (entitiesMarkedForRemoval.Has(ent->handle)) { - ent->isMarkedForRemoval = true; - EntitiesToBeRemoved.Push(ent->handle); - continue; - } - if (EntitiesToBeRemoved.Has(ent->parentHandle)) { + if (entitiesMarkedForRemoval.Has(ent->handle) || EntitiesToBeRemoved.Has(ent->parentHandle)) { ent->isMarkedForRemoval = true; EntitiesToBeRemoved.Push(ent->handle); } } } } + for (long e = 0; e < entitiesYetToBeRemoved.Count(); ++e) { + Entity &clonedEnt = entitiesYetToBeRemoved[e]; + CompGrBinds *grBinds = nullptr; + InstanceBucket *instBucket = nullptr; + CompInstance *inst = nullptr; + uint64_t instBucketIndex = 0; + if (clonedEnt.grBindsHandle != GrBindsHandle_MAX) { + GrBindsHandle_T bindsHandle_t{static_cast<GrBindsHandle_T>(clonedEnt.grBindsHandle)}; + auto b = Buckets_GetBucketIndex(bindsHandle_t); + auto i = Buckets_GetItemIndex(bindsHandle_t); + grBinds = &Comp_GrBinds_BucketContainer.buckets[b].compGrBinds[i]; + } + if (grBinds != nullptr && clonedEnt.instanceHandle != InstanceHandle_MAX) { + InstanceHandle_T instanceHandle_t{static_cast<InstanceHandle_T>(clonedEnt.instanceHandle)}; + auto b = Buckets_GetBucketIndex(instanceHandle_t); + auto i = Buckets_GetItemIndex(instanceHandle_t); + instBucket = &Comp_Instance_BucketContainer.buckets[b]; + inst = &instBucket->instances[i]; + instBucketIndex = b; + } + if (inst != nullptr) { + grBinds->instances.Remove(inst->index); + for (long bi = instBucketIndex; bi <= Comp_Instance_BucketContainer.bucketCounter; ++bi) { + uint64_t instCounter = 0; + if (bi == Comp_Instance_BucketContainer.bucketCounter) { + instCounter = Comp_Instance_BucketContainer.itemCounter; + } else { + instCounter = maxBucketItemCount; + } + auto &bucket = Comp_Instance_BucketContainer.buckets[bi]; + for (long ii = 0; ii < instCounter; ++ii) { + if (bucket.instances[ii].grBindsHandle != clonedEnt.grBindsHandle) { + continue; + } + if (bucket.instances[ii].instanceHandle < clonedEnt.instanceHandle) { + continue; + } + bucket.instances[ii].index -= 1; + } + } + inst->entHandle = EntityHandle_MAX; + inst->grBindsHandle = GrBindsHandle_MAX; + inst->index = ECS_UNSET_VAL; + inst->instanceHandle = InstanceHandle_MAX; + inst->ptr = CAFE_BABE(InstPos); + } else if (grBinds != nullptr) { + /* + * 2023-09-05 JB note - the Vulkan assets (device memory, buffers, + * pipeline layout, and descriptor set) are unloaded elsewhere, just, + * as they were created elsewhere. + */ + DynArrayDestroy(&grBinds->vertexes); + DynArrayDestroy(&grBinds->indexes); + DynArrayDestroy(&grBinds->instances); + } + } entitiesMarkedForRemoval.Resize(0); } @@ -96,6 +150,7 @@ CompGrBinds &ECS_CreateGrBinds(EntityHandle entHandle) { auto b = Buckets_GetBucketIndex(newHandle); auto i = Buckets_GetItemIndex(newHandle); auto &comp = Comp_GrBinds_BucketContainer.buckets[b].compGrBinds[i]; + comp.entHandle = entHandle; comp.grBindsHandle = ent->grBindsHandle; return comp; } @@ -138,6 +193,7 @@ CompInstance &ECS_CreateInstance(EntityHandle entHandle) { auto i = Buckets_GetItemIndex(newHandle); auto &comp = Comp_Instance_BucketContainer.buckets[b].instances[i]; + comp.entHandle = entHandle; comp.grBindsHandle = ent->grBindsHandle; comp.instanceHandle = ent->instanceHandle; comp.index = grBinds.instances.Count(); |
