Add render resource handling for geometry
This commit is contained in:
@@ -153,7 +153,7 @@ namespace OpenVulkano::Vulkan
|
||||
VulkanGeometry* ResourceManager::PrepareGeometry(Scene::Geometry* geometry)
|
||||
{
|
||||
const std::unique_lock lock(mutex);
|
||||
if(!geometry->renderGeo)
|
||||
if(!geometry->HasRenderResource())
|
||||
{
|
||||
ManagedBuffer::Ptr vertexBuffer =
|
||||
CreateDeviceOnlyBufferWithData(sizeof(Vertex) * geometry->GetVertexCount(), vk::BufferUsageFlagBits::eVertexBuffer, geometry->GetVertices());
|
||||
@@ -162,14 +162,13 @@ namespace OpenVulkano::Vulkan
|
||||
indexBuffer = CreateDeviceOnlyBufferWithData(Utils::EnumAsInt(geometry->indexType) * geometry->GetIndexCount(), vk::BufferUsageFlagBits::eIndexBuffer, geometry->GetIndices());
|
||||
VulkanGeometry* vkGeo = new VulkanGeometry(geometry, vertexBuffer, indexBuffer);
|
||||
geometries.emplace_back(vkGeo);
|
||||
geometry->renderGeo = vkGeo;
|
||||
if (geometry->ownsMemory && geometry->freeAfterUpload)
|
||||
{
|
||||
geometry->Free();
|
||||
}
|
||||
return vkGeo;
|
||||
}
|
||||
return dynamic_cast<VulkanGeometry*>(geometry->renderGeo);
|
||||
return geometry->GetRenderResource();
|
||||
}
|
||||
|
||||
void ResourceManager::PrepareMaterial(Scene::Material* material)
|
||||
|
||||
@@ -20,13 +20,12 @@ namespace OpenVulkano::Vulkan
|
||||
{
|
||||
SimpleDrawable* drawable = static_cast<SimpleDrawable*>(instance);
|
||||
Geometry* mesh = drawable->GetMesh();
|
||||
VulkanGeometry* renderGeo = static_cast<VulkanGeometry*>(mesh->renderGeo);
|
||||
VulkanGeometry* renderGeo = mesh->GetRenderResource();
|
||||
if (!renderGeo) renderGeo = drawContext->renderer->GetResourceManager().PrepareGeometry(mesh);
|
||||
renderGeo->RecordBind(drawContext->commandBuffer);
|
||||
|
||||
if (drawable->GetBuffer())
|
||||
{
|
||||
|
||||
VulkanUniformBuffer* vkBuffer = drawable->GetBuffer()->GetRenderResource();
|
||||
if (!vkBuffer)
|
||||
{
|
||||
|
||||
@@ -13,36 +13,21 @@
|
||||
|
||||
namespace OpenVulkano::Vulkan
|
||||
{
|
||||
class VulkanGeometry final : public ICloseable
|
||||
class VulkanGeometry final : public IRenderResource<Scene::Geometry>
|
||||
{
|
||||
Scene::Geometry* m_geometry;
|
||||
ManagedBuffer::Ptr m_vertexBuffer;
|
||||
ManagedBuffer::Ptr m_indexBuffer;
|
||||
vk::IndexType m_indexType;
|
||||
vk::DeviceSize m_offsets = 0;
|
||||
|
||||
public:
|
||||
VulkanGeometry() : m_geometry(nullptr), m_vertexBuffer(nullptr)
|
||||
, m_indexBuffer(nullptr), m_indexType(vk::IndexType::eUint32)
|
||||
{}
|
||||
|
||||
VulkanGeometry(Scene::Geometry* geo, ManagedBuffer::Ptr& vertexBuffer, ManagedBuffer::Ptr& indexBuffer)
|
||||
: m_geometry(geo), m_vertexBuffer(std::move(vertexBuffer)), m_indexBuffer(std::move(indexBuffer))
|
||||
: IRenderResource<Scene::Geometry>(geo)
|
||||
, m_vertexBuffer(std::move(vertexBuffer)), m_indexBuffer(std::move(indexBuffer))
|
||||
, m_indexType((geo->indexType == Scene::VertexIndexType::UINT16) ? vk::IndexType::eUint16 : vk::IndexType::eUint32)
|
||||
{}
|
||||
|
||||
~VulkanGeometry() override
|
||||
{
|
||||
if (m_vertexBuffer) VulkanGeometry::Close();
|
||||
}
|
||||
|
||||
void Init(Scene::Geometry* geo, ManagedBuffer::Ptr& vertexBuffer, ManagedBuffer::Ptr& indexBuffer)
|
||||
{
|
||||
m_geometry = geo;
|
||||
m_vertexBuffer = std::move(vertexBuffer);
|
||||
m_indexBuffer = std::move(indexBuffer);
|
||||
m_indexType = (geo->indexType == Scene::VertexIndexType::UINT16) ? vk::IndexType::eUint16 : vk::IndexType::eUint32;
|
||||
}
|
||||
~VulkanGeometry() override = default;
|
||||
|
||||
void RecordBind(vk::CommandBuffer& cmdBuffer)
|
||||
{
|
||||
@@ -52,15 +37,13 @@ namespace OpenVulkano::Vulkan
|
||||
|
||||
void RecordDraw(vk::CommandBuffer& cmdBuffer)
|
||||
{
|
||||
if (m_geometry->GetIndexCount()) { cmdBuffer.drawIndexed(m_geometry->GetIndexCount(), 1, 0, 0, 0); }
|
||||
else { cmdBuffer.draw(m_geometry->GetVertexCount(), 1, 0, 0); }
|
||||
if (GetOwner()->GetIndexCount()) { cmdBuffer.drawIndexed(GetOwner()->GetIndexCount(), 1, 0, 0, 0); }
|
||||
else { cmdBuffer.draw(GetOwner()->GetVertexCount(), 1, 0, 0); }
|
||||
}
|
||||
|
||||
void Close() override
|
||||
void Release() override
|
||||
{
|
||||
m_geometry->renderGeo = nullptr;
|
||||
m_vertexBuffer.reset();
|
||||
m_indexBuffer.reset();
|
||||
//TODO
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user