Added Model Root node for global transforms.
This commit is contained in:
parent
41a1725c34
commit
a87da63c98
|
|
@ -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 = {
|
||||
|
|
|
|||
|
|
@ -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<MeshPrimitive> m_MeshPrimitives;
|
||||
|
||||
[[nodiscard]] const mat4 &GetModelTransform() const;
|
||||
void SetModelTransform(const mat4 &transform);
|
||||
void Update();
|
||||
|
||||
Model(GpuResourceManager *resourceManager, eastl::vector<TextureHandle> &&textureHandles, Nodes&& nodes,
|
||||
BufferHandle materialsHandle, BufferHandle vertexPosHandle, BufferHandle normalHandle, BufferHandle uv0Handle, BufferHandle vertexColor,
|
||||
const IndexBuffer &indexBuffer, const eastl::vector<MeshPrimitive> &meshPrimitives, BufferHandle nodeHandle);
|
||||
|
||||
Model(Model &&other) noexcept;
|
||||
Model &operator=(Model &&other) noexcept;
|
||||
|
||||
~Model();
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(Model);
|
||||
|
|
|
|||
|
|
@ -236,7 +236,9 @@ main(int, char **)
|
|||
{
|
||||
Time::Update();
|
||||
|
||||
camera.m_Model *= rotate(mat4{1.0f}, Cast<f32>(45.0_deg * Time::m_Delta), vec3(0.0f, 1.0f, 0.0f));
|
||||
model.SetModelTransform(
|
||||
rotate(model.GetModelTransform(), Cast<f32>(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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue