diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-09-26 19:21:58 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-09-26 19:21:58 -0400 |
| commit | 517dedc6a05c9048fa57eae7e7c907452b408069 (patch) | |
| tree | e2f61e1c54147a9f3375fb0ab8a6f7f71ade94cc /src/ecs.cpp | |
| parent | 7c1ba040d64a3b877f44971048bf79410c2666b0 (diff) | |
update instance buffer & handle camera on window resize
Diffstat (limited to 'src/ecs.cpp')
| -rw-r--r-- | src/ecs.cpp | 63 |
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; } |
