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 | |
| parent | 7c1ba040d64a3b877f44971048bf79410c2666b0 (diff) | |
update instance buffer & handle camera on window resize
Diffstat (limited to 'src')
| -rw-r--r-- | src/components.hpp | 1 | ||||
| -rw-r--r-- | src/ecs.cpp | 63 | ||||
| -rw-r--r-- | src/ecs.hpp | 4 | ||||
| -rw-r--r-- | src/entities.cpp | 2 | ||||
| -rw-r--r-- | src/game.cpp | 4 | ||||
| -rw-r--r-- | src/window.cpp | 12 |
6 files changed, 76 insertions, 10 deletions
diff --git a/src/components.hpp b/src/components.hpp index 76dd7fc..70c36d5 100644 --- a/src/components.hpp +++ b/src/components.hpp @@ -54,6 +54,7 @@ struct CompGrBinds { uint32_t instanceCount = 0; VkDeviceSize instanceOffsets = 0; DynArray<InstPos> instances{0}; + bool isInstanceBufferNeedingUpdated = false; }; struct CompInstance { 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; } diff --git a/src/ecs.hpp b/src/ecs.hpp index 38ebc91..6293bc9 100644 --- a/src/ecs.hpp +++ b/src/ecs.hpp @@ -5,6 +5,7 @@ #include "macros.hpp" #include "memory.hpp" #include "components.hpp" +#include "window.hpp" #include "glm/vec3.hpp" @@ -16,7 +17,8 @@ static struct { } ComponentTypes; void ECS_Init(); -void ECS_Tick(double delta); +void ECS_Tick_Early(double delta); +void ECS_Tick_Late(double delta); EntityHandle ECS_CreateEntity(EntityHandle parentEntHandle = EntityHandle{EntityHandle_T{0xFFFFFFFFFFFFFFFF}}); void ECS_MarkForRemoval(EntityHandle entHandle); uint64_t ECS_GetEntities_BucketCount(); diff --git a/src/entities.cpp b/src/entities.cpp index db3d0a3..c270be4 100644 --- a/src/entities.cpp +++ b/src/entities.cpp @@ -797,7 +797,7 @@ void EntityType_Load(EntityType &et) { // set up instance buffer bufferCI.size = sizeof(InstPos) * et.startingInstanceCount; - bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; + bufferCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; vkCreateBuffer(vkDevice, &bufferCI, vkAllocator, &grBinds.instanceBuffer); VkMemoryRequirements vkMemoryRequirementsInst; vkGetBufferMemoryRequirements(vkDevice, grBinds.instanceBuffer, &vkMemoryRequirementsInst); diff --git a/src/game.cpp b/src/game.cpp index 897d305..db81e47 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -193,6 +193,7 @@ void Game_Tick(double delta) { * ECS_Tick() gets called first because it updates the public * `EntitiesToBeRemoved` for all other ticks to use. */ + ECS_Tick_Early(delta); if (shouldCreateEntityType) { assert(entityTypeToCreate != nullptr); assert(entityTypeToCreate != CAFE_BABE(EntityType)); @@ -212,8 +213,7 @@ void Game_Tick(double delta) { EntityHandle newEntity = ECS_CreateEntity(); ECS_CreateInstance(newEntity, createInfo.entityTypeEntityHandle); } - - ECS_Tick(delta); + ECS_Tick_Late(delta); } void RecordImGuiEditorWrapper() { diff --git a/src/window.cpp b/src/window.cpp index b32ea15..f567820 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -3,6 +3,9 @@ #include "window.hpp" +#include "glm/ext/matrix_transform.hpp" +#include "glm/gtc/matrix_transform.hpp" + #define NELEMS(x) (sizeof(x) / sizeof((x)[0])) const bool ENABLE_VALIDATION_LAYERS = true; @@ -73,7 +76,7 @@ VkSemaphore presentRenderFinishedSemaphores[MAX_FRAMES_IN_FLIGHT]; VkFence presentInFlightFences[MAX_FRAMES_IN_FLIGHT]; UniformBufferObject UBO{ .model = glm::mat4(1), - .view = glm::mat4(1), + .view = glm::lookAt(glm::vec3(0), glm::vec3(2, 2, 0), glm::vec3(0, 0, 1)), .proj = glm::mat4(1), }; VkDeviceMemory uniformBufferMemory; @@ -725,6 +728,11 @@ void UpdatePresentDescriptorSets() { vkUpdateDescriptorSets(vkDevice, MAX_FRAMES_IN_FLIGHT, writeDescriptorSets, 0, nullptr); } +void UpdateCameraProjection() { + UBO.proj = glm::perspective(glm::radians(45.f), extent.width / (float)extent.height, 0.1f, 100.f); + UBO.proj[1][1] *= -1; +} + void CreateRenderPass() { VkAttachmentDescription colorAttachment; colorAttachment.flags = {}; @@ -1466,6 +1474,7 @@ void RecreateSwapchain() { DestroySwapchain(); CreateSwapchain(); UpdatePresentDescriptorSets(); + UpdateCameraProjection(); CreateFramebuffers(); shouldRecreateSwapchain = false; } @@ -1488,6 +1497,7 @@ void CreateWindow(PKEWindowProperties *wp) { CreateRenderPass(); CreateGraphicsPipeline(); UpdatePresentDescriptorSets(); + UpdateCameraProjection(); CreateFramebuffers(); CreateCommandPool(); CreateCommandBuffer(); |
