diff --git a/openVulkanoCpp/Scene/Camera.hpp b/openVulkanoCpp/Scene/Camera.hpp index 08dfac3..f755ded 100644 --- a/openVulkanoCpp/Scene/Camera.hpp +++ b/openVulkanoCpp/Scene/Camera.hpp @@ -13,10 +13,9 @@ namespace OpenVulkano::Scene { - class Camera : public Node + class Camera : public RenderResourceHolder, public Node { public: - ICloseable* renderCamera = nullptr; static constexpr inline size_t SIZE = sizeof(Math::Matrix4f) * 3 + sizeof(Math::Vector4f) + sizeof(float) * 12; static constexpr inline DescriptorSetLayoutBinding DESCRIPTOR_SET_LAYOUT_BINDING = { 0, DescriptorSetLayoutBinding::Type::TYPE_UNIFORM_BUFFER_DYNAMIC, 1, ShaderProgramType::ALL_GRAPHICS }; @@ -36,10 +35,7 @@ namespace OpenVulkano::Scene { } - ~Camera() override - { - //if (renderCamera) renderCamera->Close(); - } + ~Camera() override = default; void Init(float width, float height, float nearPlane, float farPlane) { @@ -152,6 +148,10 @@ namespace OpenVulkano::Scene float GetWidth() const { return m_width; } float GetHeight() const { return m_height; } Math::Vector2f GetSize() const { return { m_width, m_height }; } + + using RenderResourceHolder::GetRenderResource; + using RenderResourceHolder::HasRenderResource; + using RenderResourceHolder::operator RenderResourcePtr&; }; class PerspectiveCamera : public Camera diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp index 16e9c4b..ff946c0 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp @@ -213,7 +213,7 @@ namespace OpenVulkano::Vulkan VulkanCamera* ResourceManager::PrepareCamera(Scene::Camera* camera) { const std::unique_lock lock(mutex); - if (!camera->renderCamera) + if (!camera->HasRenderResource()) { const vk::DeviceSize allocSize = Utils::Align(Scene::Camera::SIZE, uniformBufferAlignment); const uint32_t imgs = context->swapChain.GetImageCount(); @@ -221,12 +221,10 @@ namespace OpenVulkano::Vulkan buffer->Map(); UniformBuffer* uBuffer = new UniformBuffer(); uBuffer->Init(std::move(buffer), allocSize, allocSize, GetDescriptorLayoutSet(Scene::Camera::DESCRIPTOR_SET_LAYOUT_BINDING), Scene::Camera::DESCRIPTOR_SET_LAYOUT_BINDING, 1); - VulkanCamera* vkCam = new VulkanCamera(); - vkCam->Init(camera, uBuffer); + VulkanCamera* vkCam = new VulkanCamera(camera, uBuffer); cameras.emplace_back(vkCam); - camera->renderCamera = vkCam; } - return static_cast(camera->renderCamera); + return static_cast(camera->GetRenderResource()); } UniformBuffer* ResourceManager::CreateUniformBuffer(const DescriptorSetLayoutBinding& binding, size_t size, void* data, uint32_t setId, bool hostVis) diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanCamera.hpp b/openVulkanoCpp/Vulkan/Scene/VulkanCamera.hpp index 1832fec..5ba6dce 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanCamera.hpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanCamera.hpp @@ -6,41 +6,34 @@ #pragma once -#include "Base/ICloseable.hpp" #include "Scene/Camera.hpp" #include "IRecordable.hpp" #include "Vulkan/Resources/UniformBuffer.hpp" namespace OpenVulkano::Vulkan { - class VulkanCamera : public ICloseable, public IRecordable +class VulkanCamera : public IRenderResource, public IRecordable { - Scene::Camera* m_camera = nullptr; - UniformBuffer* m_buffer = nullptr; + const Unique m_buffer; public: - ~VulkanCamera() override { if (m_camera) VulkanCamera::Close(); } + VulkanCamera(Scene::Camera* camera, UniformBuffer* uniformBuffer) + : IRenderResource(camera), m_buffer(uniformBuffer) + {} - void Init(Scene::Camera* camera, UniformBuffer* uniformBuffer) - { - m_camera = camera; - m_buffer = uniformBuffer; - } + ~VulkanCamera() override = default; void Record(VulkanDrawContext* context) override { - m_buffer->Update(m_camera->GetData(), Scene::Camera::SIZE, context->currentImageId); + m_buffer->Update(GetCamera()->GetData(), Scene::Camera::SIZE, context->currentImageId); m_buffer->Record(context); } - - void Close() override - { - m_camera->renderCamera = nullptr; - m_buffer->Close(); - m_camera = nullptr; - delete m_buffer; - } - [[nodiscard]] Scene::Camera* GetCamera() const { return m_camera; } + [[nodiscard]] Scene::Camera* GetCamera() const { return GetOwner(); } + + void Release() override + { + /* TODO */ + } }; } diff --git a/openVulkanoCpp/Vulkan/VulkanDrawContext.cpp b/openVulkanoCpp/Vulkan/VulkanDrawContext.cpp index 935bdd5..740aac6 100644 --- a/openVulkanoCpp/Vulkan/VulkanDrawContext.cpp +++ b/openVulkanoCpp/Vulkan/VulkanDrawContext.cpp @@ -44,8 +44,8 @@ namespace OpenVulkano::Vulkan void VulkanDrawContext::SetCamera(Scene::Camera* camera) { - if (!camera->renderCamera) m_lastCamera = ResourceManager::INSTANCE->PrepareCamera(camera); - else m_lastCamera = static_cast(camera->renderCamera); + if (!camera->HasRenderResource()) m_lastCamera = ResourceManager::INSTANCE->PrepareCamera(camera); + else m_lastCamera = camera->GetRenderResource(); if (m_lastShader) m_lastCamera->Record(this); } } \ No newline at end of file