/* * 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" namespace openVulkanoCpp::Vulkan { class VulkanGeometry final : virtual public ICloseable { Scene::Geometry* m_geometry; ManagedBuffer* m_vertexBuffer; ManagedBuffer* 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* vertexBuffer, ManagedBuffer* indexBuffer) : m_geometry(geo), m_vertexBuffer(vertexBuffer), m_indexBuffer(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* vertexBuffer, ManagedBuffer* indexBuffer) { m_geometry = geo; m_vertexBuffer = vertexBuffer; m_indexBuffer = 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 { } }; }