Render resource handling for camera
This commit is contained in:
@@ -13,10 +13,9 @@
|
||||
|
||||
namespace OpenVulkano::Scene
|
||||
{
|
||||
class Camera : public Node
|
||||
class Camera : public RenderResourceHolder<Camera>, 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<Camera>::GetRenderResource;
|
||||
using RenderResourceHolder<Camera>::HasRenderResource;
|
||||
using RenderResourceHolder<Camera>::operator RenderResourcePtr&;
|
||||
};
|
||||
|
||||
class PerspectiveCamera : public Camera
|
||||
|
||||
@@ -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<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)
|
||||
|
||||
@@ -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<Scene::Camera>, public IRecordable
|
||||
{
|
||||
Scene::Camera* m_camera = nullptr;
|
||||
UniformBuffer* m_buffer = nullptr;
|
||||
const Unique<UniformBuffer> m_buffer;
|
||||
|
||||
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)
|
||||
{
|
||||
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 GetOwner(); }
|
||||
|
||||
[[nodiscard]] Scene::Camera* GetCamera() const { return m_camera; }
|
||||
void Release() override
|
||||
{
|
||||
/* TODO */
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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<VulkanCamera*>(camera->renderCamera);
|
||||
if (!camera->HasRenderResource()) m_lastCamera = ResourceManager::INSTANCE->PrepareCamera(camera);
|
||||
else m_lastCamera = camera->GetRenderResource();
|
||||
if (m_lastShader) m_lastCamera->Record(this);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user