summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-09-05 16:44:55 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-09-06 17:24:27 -0400
commitf3f2502d40bc4405be891de97ea7c081c760fd9b (patch)
tree48e78bfd01cabf72b0696064cd6a3359e2c3b10c /src
parent209ea9292599b294fe782ba43a4f3418849a65a3 (diff)
first pass removing entities
Diffstat (limited to 'src')
-rw-r--r--src/components.hpp2
-rw-r--r--src/ecs.cpp72
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();