summaryrefslogtreecommitdiff
path: root/src/ecs.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-09-26 19:21:58 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-09-26 19:21:58 -0400
commit517dedc6a05c9048fa57eae7e7c907452b408069 (patch)
treee2f61e1c54147a9f3375fb0ab8a6f7f71ade94cc /src/ecs.cpp
parent7c1ba040d64a3b877f44971048bf79410c2666b0 (diff)
update instance buffer & handle camera on window resize
Diffstat (limited to 'src/ecs.cpp')
-rw-r--r--src/ecs.cpp63
1 files changed, 58 insertions, 5 deletions
diff --git a/src/ecs.cpp b/src/ecs.cpp
index 360370f..9d7b321 100644
--- a/src/ecs.cpp
+++ b/src/ecs.cpp
@@ -72,7 +72,7 @@ void ECS_MarkForRemoval(EntityHandle entityHandle) {
entitiesMarkedForRemoval.Push(entityHandle);
}
-void ECS_Tick(double delta) {
+void ECS_Tick_Early(double delta) {
static DynArray<Entity> entitiesYetToBeRemoved{0};
entitiesYetToBeRemoved.Resize(EntitiesToBeRemoved.Count());
EntitiesToBeRemoved.Resize(0);
@@ -151,6 +151,58 @@ void ECS_Tick(double delta) {
entitiesMarkedForRemoval.Resize(0);
}
+void ECS_Tick_Late(double delta) {
+ for (long b = 0; b <= Comp_GrBinds_BucketContainer.bucketCounter; ++b) {
+ auto &bkt = Comp_GrBinds_BucketContainer.buckets[b];
+ long count = Comp_GrBinds_BucketContainer.bucketCounter == b ? Comp_GrBinds_BucketContainer.itemCounter >> 32 : maxBucketItemCount;
+ for (long i = 0; i < count; ++i) {
+ auto &grBinds = bkt.compGrBinds[i];
+ if (grBinds.isInstanceBufferNeedingUpdated) {
+ VkDeviceSize byteCount = sizeof(InstPos) * grBinds.instances.Count();
+ VkBuffer transferBuffer;
+ VkDeviceMemory transferMemory;
+ void *deviceData;
+ BeginTransferBuffer(byteCount, transferBuffer, transferMemory, deviceData);
+ memcpy(deviceData, grBinds.instances.GetPtr(), byteCount);
+ {
+ VkCommandBufferBeginInfo cbbi;
+ cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
+ cbbi.pNext = nullptr;
+ cbbi.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
+ cbbi.pInheritanceInfo = nullptr;
+
+ vkBeginCommandBuffer(transferCommandBuffer, &cbbi);
+
+ VkBufferCopy vkBufferCopy;
+ vkBufferCopy.srcOffset = 0;
+ vkBufferCopy.dstOffset = 0;
+ vkBufferCopy.size = byteCount;
+
+ vkCmdCopyBuffer(transferCommandBuffer, transferBuffer, grBinds.instanceBuffer, 1, &vkBufferCopy);
+
+ vkEndCommandBuffer(transferCommandBuffer);
+
+ VkSubmitInfo vkSubmitInfo{};
+ vkSubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ vkSubmitInfo.pNext = nullptr;
+ vkSubmitInfo.waitSemaphoreCount = 0;
+ vkSubmitInfo.pWaitSemaphores = nullptr;
+ vkSubmitInfo.pWaitDstStageMask = nullptr;
+ vkSubmitInfo.commandBufferCount = 1;
+ vkSubmitInfo.pCommandBuffers = &transferCommandBuffer;
+ vkSubmitInfo.signalSemaphoreCount = 0;
+ vkSubmitInfo.pSignalSemaphores = nullptr;
+ vkQueueSubmit(transferQueue, 1, &vkSubmitInfo, nullptr);
+ vkQueueWaitIdle(transferQueue);
+ vkResetCommandBuffer(transferCommandBuffer, 0);
+ }
+ EndTransferBuffer(transferBuffer, transferMemory);
+ grBinds.isInstanceBufferNeedingUpdated = false;
+ }
+ }
+ }
+}
+
CompGrBinds &ECS_CreateGrBinds(EntityHandle entHandle) {
assert(entHandle != EntityHandle_MAX);
@@ -211,7 +263,8 @@ CompInstance &ECS_CreateInstance(EntityHandle entHandle, EntityHandle entityType
auto b2 = Buckets_GetBucketIndex(grBindsHandle_t);
auto i2 = Buckets_GetItemIndex(grBindsHandle_t);
- auto &grBinds = Comp_GrBinds_BucketContainer.buckets[b2].compGrBinds[i2];
+ auto *grBinds = &Comp_GrBinds_BucketContainer.buckets[b2].compGrBinds[i2];
+ grBinds->isInstanceBufferNeedingUpdated = true;
auto b = Buckets_GetBucketIndex(newHandle);
auto i = Buckets_GetItemIndex(newHandle);
auto *comp = &Comp_Instance_BucketContainer.buckets[b].instances[i];
@@ -219,13 +272,13 @@ CompInstance &ECS_CreateInstance(EntityHandle entHandle, EntityHandle entityType
comp->entHandle = entHandle;
comp->grBindsHandle = ent->grBindsHandle;
comp->instanceHandle = ent->instanceHandle;
- comp->index = grBinds.instances.Count();
- grBinds.instances.Push({
+ comp->index = grBinds->instances.Count();
+ grBinds->instances.Push({
.pos = glm::vec3(0),
.rot = glm::vec3(1),
.scale = glm::vec3(1),
});
- comp->ptr = &grBinds.instances[comp->index];
+ comp->ptr = &grBinds->instances[comp->index];
return *comp;
}