Render resource handling for camera
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user