Graphics/GraphicalMesh: Allow to update submeshes

This commit is contained in:
SirLynix
2022-06-16 18:19:48 +02:00
parent 2cc4944f58
commit 62ba4f172b
8 changed files with 73 additions and 25 deletions

View File

@@ -11,16 +11,17 @@
namespace Nz
{
GraphicalMesh::GraphicalMesh(const Mesh& mesh)
std::shared_ptr<GraphicalMesh> GraphicalMesh::BuildFromMesh(const Mesh& mesh)
{
assert(mesh.GetAnimationType() == AnimationType::Static);
const std::shared_ptr<RenderDevice>& renderDevice = Graphics::Instance()->GetRenderDevice();
m_subMeshes.reserve(mesh.GetSubMeshCount());
std::shared_ptr<GraphicalMesh> gfxMesh = std::make_shared<GraphicalMesh>();
for (std::size_t i = 0; i < mesh.GetSubMeshCount(); ++i)
{
const SubMesh& subMesh = *mesh.GetSubMesh(i);
const Nz::SubMesh& subMesh = *mesh.GetSubMesh(i);
const StaticMesh& staticMesh = static_cast<const StaticMesh&>(subMesh);
@@ -33,7 +34,7 @@ namespace Nz
assert(vertexBuffer->GetBuffer()->GetStorage() == DataStorage::Software);
const SoftwareBuffer* vertexBufferContent = static_cast<const SoftwareBuffer*>(vertexBuffer->GetBuffer().get());
auto& submeshData = m_subMeshes.emplace_back();
GraphicalMesh::SubMesh submeshData;
submeshData.indexBuffer = renderDevice->InstantiateBuffer(BufferType::Index, indexBuffer->GetStride() * indexBuffer->GetIndexCount(), BufferUsage::DeviceLocal | BufferUsage::Write);
if (!submeshData.indexBuffer->Fill(indexBufferContent->GetData() + indexBuffer->GetStartOffset(), 0, indexBuffer->GetEndOffset() - indexBuffer->GetStartOffset()))
throw std::runtime_error("failed to fill index buffer");
@@ -46,6 +47,10 @@ namespace Nz
throw std::runtime_error("failed to fill vertex buffer");
submeshData.vertexDeclaration = vertexBuffer->GetVertexDeclaration();
gfxMesh->AddSubMesh(std::move(submeshData));
}
return gfxMesh;
}
}

View File

@@ -29,6 +29,11 @@ namespace Nz
};
}
m_onInvalidated.Connect(m_graphicalMesh->OnInvalidated, [this](GraphicalMesh*)
{
OnElementInvalidated(this);
});
UpdateAABB(aabb);
}