summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/components.hpp1
-rw-r--r--src/ecs.cpp63
-rw-r--r--src/ecs.hpp4
-rw-r--r--src/entities.cpp2
-rw-r--r--src/game.cpp4
-rw-r--r--src/window.cpp12
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();