From a87da63c9841d8d1ad46cc23c0b7d0a6f86626bc Mon Sep 17 00:00:00 2001 From: Anish Bhobe Date: Sat, 20 Jul 2024 10:25:16 +0200 Subject: [PATCH] Added Model Root node for global transforms. --- samples/03_model_render/model_loader.cpp | 34 +++++++++++++++---- samples/03_model_render/model_loader.h | 17 ++++++---- samples/03_model_render/model_render.cpp | 4 ++- .../render_resource_manager.cpp | 6 ++++ .../03_model_render/render_resource_manager.h | 1 + 5 files changed, 48 insertions(+), 14 deletions(-) diff --git a/samples/03_model_render/model_loader.cpp b/samples/03_model_render/model_loader.cpp index fa1d6e4..ad8de08 100644 --- a/samples/03_model_render/model_loader.cpp +++ b/samples/03_model_render/model_loader.cpp @@ -513,6 +513,7 @@ ModelLoader::LoadModel(cstr path, cstr name, bool batched) } Nodes nodes; + nodes.Add(mat4{1.0f}, -1); { if (model.defaultScene >= 0) { @@ -533,6 +534,7 @@ ModelLoader::LoadModel(cstr path, cstr name, bool batched) } if (node->scale.size() == 3) { + // We don't handle the scale 0 special case yet. nodeScale = glm::make_vec3(node->scale.data()); } if (node->matrix.size() == 16) @@ -561,7 +563,7 @@ ModelLoader::LoadModel(cstr path, cstr name, bool batched) auto *scene = &model.scenes[model.defaultScene]; for (i32 rootNodeIdx : scene->nodes) { - processNode(rootNodeIdx, -1); + processNode(rootNodeIdx, 0); } } } @@ -660,8 +662,6 @@ ModelLoader::LoadModel(cstr path, cstr name, bool batched) buffer.Destroy(pDevice); } - nodes.Update(); - return Model{m_ResourceManager, std::move(textureHandles), std::move(nodes), materialsHandle, positionBufferHandle, normalBufferHandle, texCoord0BufferHandle, color0Handle, indexBuffer, meshPrimitives, nodeHandle}; @@ -717,6 +717,18 @@ Model::operator=(Model &&other) noexcept return *this; } +const mat4 & +Model::GetModelTransform() const +{ + return m_Nodes[0]; +} + +void +Model::SetModelTransform(const mat4 &transform) +{ + m_Nodes.Set(0, transform); +} + Model::~Model() { if (!m_ResourceManager) @@ -735,12 +747,22 @@ Model::~Model() m_ResourceManager->Release(m_MaterialsHandle); } +void +Model::Update() +{ + if (m_Nodes.Update()) + { + m_ResourceManager->Write(m_NodeHandle, 0, m_Nodes.GetGlobalTransformByteSize(), + m_Nodes.GetGlobalTransformPtr()); + } +} + ModelLoader::ModelLoader(GpuResourceManager *resourceManager, vk::Queue transferQueue, u32 transferQueueIndex, u32 graphicsQueueIndex) : m_ResourceManager(resourceManager) - , m_TransferQueue(transferQueue) - , m_TransferQueueIndex(transferQueueIndex) - , m_GraphicsQueueIndex(graphicsQueueIndex) + , m_TransferQueue(transferQueue) + , m_TransferQueueIndex(transferQueueIndex) + , m_GraphicsQueueIndex(graphicsQueueIndex) { const Device *pDevice = resourceManager->m_Device; const vk::CommandPoolCreateInfo poolCreateInfo = { diff --git a/samples/03_model_render/model_loader.h b/samples/03_model_render/model_loader.h index db78627..25ac8a4 100644 --- a/samples/03_model_render/model_loader.h +++ b/samples/03_model_render/model_loader.h @@ -7,7 +7,6 @@ #include "buffer.h" #include "global.h" -#include "image.h" #include "render_resource_manager.h" @@ -92,20 +91,20 @@ struct Nodes [[nodiscard]] usize GetGlobalTransformByteSize() const { - return m_Transforms.size() * sizeof m_Transforms[0]; + return m_GlobalTransforms.size() * sizeof m_GlobalTransforms[0]; } [[nodiscard]] const mat4 * GetGlobalTransformPtr() const { - return m_Transforms.data(); + return m_GlobalTransforms.data(); } - void + bool Update() { if (!m_Dirty) - return; + return false; auto transformIter = m_Transforms.begin(); auto globalTransformIter = m_GlobalTransforms.begin(); @@ -133,7 +132,7 @@ struct Nodes { // Update w.r.t parent if either local or parent transforms updated. *globalTransformIter = m_GlobalTransforms[parentIdx] * *transformIter; - m_Parents_[parentIdx] |= m_Dirty; // Set dirty to propagate the update. + m_Parents_[parentIdx] |= DIRTY_BIT; // Set dirty to propagate the update. } } @@ -148,6 +147,7 @@ struct Nodes } m_Dirty = false; + return true; } }; @@ -181,13 +181,16 @@ struct Model IndexBuffer m_IndexBuffer; eastl::vector m_MeshPrimitives; + [[nodiscard]] const mat4 &GetModelTransform() const; + void SetModelTransform(const mat4 &transform); + void Update(); + Model(GpuResourceManager *resourceManager, eastl::vector &&textureHandles, Nodes&& nodes, BufferHandle materialsHandle, BufferHandle vertexPosHandle, BufferHandle normalHandle, BufferHandle uv0Handle, BufferHandle vertexColor, const IndexBuffer &indexBuffer, const eastl::vector &meshPrimitives, BufferHandle nodeHandle); Model(Model &&other) noexcept; Model &operator=(Model &&other) noexcept; - ~Model(); DISALLOW_COPY_AND_ASSIGN(Model); diff --git a/samples/03_model_render/model_render.cpp b/samples/03_model_render/model_render.cpp index d3b90e5..b894d71 100644 --- a/samples/03_model_render/model_render.cpp +++ b/samples/03_model_render/model_render.cpp @@ -236,7 +236,9 @@ main(int, char **) { Time::Update(); - camera.m_Model *= rotate(mat4{1.0f}, Cast(45.0_deg * Time::m_Delta), vec3(0.0f, 1.0f, 0.0f)); + model.SetModelTransform( + rotate(model.GetModelTransform(), Cast(45.0_deg * Time::m_Delta), vec3(0.0f, 1.0f, 0.0f))); + model.Update(); ubo.Write(&device, 0, sizeof camera, &camera); Frame *currentFrame = frameManager.GetNextFrame(&swapchain, &window); diff --git a/samples/03_model_render/render_resource_manager.cpp b/samples/03_model_render/render_resource_manager.cpp index 62e0418..a91035d 100644 --- a/samples/03_model_render/render_resource_manager.cpp +++ b/samples/03_model_render/render_resource_manager.cpp @@ -215,6 +215,12 @@ GpuResourceManager::Commit(StorageBuffer *storageBuffer) return handle; } +void +GpuResourceManager::Write(const BufferHandle handle, const usize offset, const usize size, const void *data) +{ + m_BufferManager.Fetch(handle)->Write(m_Device, offset, size, data); +} + void GpuResourceManager::EraseWrites(u32 handleIndex, HandleType handleType) { diff --git a/samples/03_model_render/render_resource_manager.h b/samples/03_model_render/render_resource_manager.h index d88d6c1..f1e999b 100644 --- a/samples/03_model_render/render_resource_manager.h +++ b/samples/03_model_render/render_resource_manager.h @@ -115,6 +115,7 @@ public: vk::DescriptorSet m_DescriptorSet; BufferHandle Commit(StorageBuffer *storageBuffer); + void Write(BufferHandle handle, usize offset, usize size, const void *data); void Release(BufferHandle handle); TextureHandle Commit(Texture *texture); void Release(TextureHandle handle);