Render resource handling for camera

This commit is contained in:
Georg Hagen
2024-08-21 15:09:49 +02:00
parent 2d08b3ab91
commit 6f19758beb
4 changed files with 24 additions and 33 deletions

View File

@@ -13,10 +13,9 @@
namespace OpenVulkano::Scene namespace OpenVulkano::Scene
{ {
class Camera : public Node class Camera : public RenderResourceHolder<Camera>, public Node
{ {
public: public:
ICloseable* renderCamera = nullptr;
static constexpr inline size_t SIZE = sizeof(Math::Matrix4f) * 3 + sizeof(Math::Vector4f) + sizeof(float) * 12; 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 }; 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 ~Camera() override = default;
{
//if (renderCamera) renderCamera->Close();
}
void Init(float width, float height, float nearPlane, float farPlane) void Init(float width, float height, float nearPlane, float farPlane)
{ {
@@ -152,6 +148,10 @@ namespace OpenVulkano::Scene
float GetWidth() const { return m_width; } float GetWidth() const { return m_width; }
float GetHeight() const { return m_height; } float GetHeight() const { return m_height; }
Math::Vector2f GetSize() const { return { m_width, m_height }; } Math::Vector2f GetSize() const { return { m_width, m_height }; }
using RenderResourceHolder<Camera>::GetRenderResource;
using RenderResourceHolder<Camera>::HasRenderResource;
using RenderResourceHolder<Camera>::operator RenderResourcePtr&;
}; };
class PerspectiveCamera : public Camera class PerspectiveCamera : public Camera

View File

@@ -213,7 +213,7 @@ namespace OpenVulkano::Vulkan
VulkanCamera* ResourceManager::PrepareCamera(Scene::Camera* camera) VulkanCamera* ResourceManager::PrepareCamera(Scene::Camera* camera)
{ {
const std::unique_lock lock(mutex); const std::unique_lock lock(mutex);
if (!camera->renderCamera) if (!camera->HasRenderResource())
{ {
const vk::DeviceSize allocSize = Utils::Align(Scene::Camera::SIZE, uniformBufferAlignment); const vk::DeviceSize allocSize = Utils::Align(Scene::Camera::SIZE, uniformBufferAlignment);
const uint32_t imgs = context->swapChain.GetImageCount(); const uint32_t imgs = context->swapChain.GetImageCount();
@@ -221,12 +221,10 @@ namespace OpenVulkano::Vulkan
buffer->Map(); buffer->Map();
UniformBuffer* uBuffer = new UniformBuffer(); 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); 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(); VulkanCamera* vkCam = new VulkanCamera(camera, uBuffer);
vkCam->Init(camera, uBuffer);
cameras.emplace_back(vkCam); cameras.emplace_back(vkCam);
camera->renderCamera = vkCam;
} }
return static_cast<VulkanCamera*>(camera->renderCamera); return static_cast<VulkanCamera*>(camera->GetRenderResource());
} }
UniformBuffer* ResourceManager::CreateUniformBuffer(const DescriptorSetLayoutBinding& binding, size_t size, void* data, uint32_t setId, bool hostVis) UniformBuffer* ResourceManager::CreateUniformBuffer(const DescriptorSetLayoutBinding& binding, size_t size, void* data, uint32_t setId, bool hostVis)

View File

@@ -6,41 +6,34 @@
#pragma once #pragma once
#include "Base/ICloseable.hpp"
#include "Scene/Camera.hpp" #include "Scene/Camera.hpp"
#include "IRecordable.hpp" #include "IRecordable.hpp"
#include "Vulkan/Resources/UniformBuffer.hpp" #include "Vulkan/Resources/UniformBuffer.hpp"
namespace OpenVulkano::Vulkan namespace OpenVulkano::Vulkan
{ {
class VulkanCamera : public ICloseable, public IRecordable class VulkanCamera : public IRenderResource<Scene::Camera>, public IRecordable
{ {
Scene::Camera* m_camera = nullptr; const Unique<UniformBuffer> m_buffer;
UniformBuffer* m_buffer = nullptr;
public: public:
~VulkanCamera() override { if (m_camera) VulkanCamera::Close(); } VulkanCamera(Scene::Camera* camera, UniformBuffer* uniformBuffer)
: IRenderResource<Scene::Camera>(camera), m_buffer(uniformBuffer)
{}
void Init(Scene::Camera* camera, UniformBuffer* uniformBuffer) ~VulkanCamera() override = default;
{
m_camera = camera;
m_buffer = uniformBuffer;
}
void Record(VulkanDrawContext* context) override 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); 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 */
}
}; };
} }

View File

@@ -44,8 +44,8 @@ namespace OpenVulkano::Vulkan
void VulkanDrawContext::SetCamera(Scene::Camera* camera) void VulkanDrawContext::SetCamera(Scene::Camera* camera)
{ {
if (!camera->renderCamera) m_lastCamera = ResourceManager::INSTANCE->PrepareCamera(camera); if (!camera->HasRenderResource()) m_lastCamera = ResourceManager::INSTANCE->PrepareCamera(camera);
else m_lastCamera = static_cast<VulkanCamera*>(camera->renderCamera); else m_lastCamera = camera->GetRenderResource();
if (m_lastShader) m_lastCamera->Record(this); if (m_lastShader) m_lastCamera->Record(this);
} }
} }