Files
OpenVulkano/openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp
2024-07-11 13:22:01 +02:00

66 lines
1.9 KiB
C++

/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#pragma once
#include "IRecordable.hpp"
#include "Scene/Scene.hpp"
#include "Scene/Geometry.hpp"
#include "Vulkan/Resources/ManagedBuffer.hpp"
namespace OpenVulkano::Vulkan
{
class VulkanGeometry final : public ICloseable
{
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))
, 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;
}
void RecordBind(vk::CommandBuffer& cmdBuffer)
{
cmdBuffer.bindVertexBuffers(0, 1, &m_vertexBuffer->buffer, &m_offsets);
cmdBuffer.bindIndexBuffer(m_indexBuffer->buffer, 0, m_indexType);
}
void RecordDraw(vk::CommandBuffer& cmdBuffer)
{
cmdBuffer.drawIndexed(m_geometry->GetIndexCount(), 1, 0, 0, 0);
}
void Close() override
{
m_geometry->renderGeo = nullptr;
m_vertexBuffer.reset();
m_indexBuffer.reset();
}
};
}