Add render resouce
This commit is contained in:
@@ -183,7 +183,7 @@ namespace OpenVulkano::Vulkan
|
||||
VulkanNode* ResourceManager::PrepareNode(Scene::Node* node)
|
||||
{
|
||||
const std::unique_lock lock(mutex);
|
||||
if (!node->renderNode)
|
||||
if (!node->HasRenderResource())
|
||||
{
|
||||
UniformBuffer* uBuffer = new UniformBuffer();
|
||||
ManagedBuffer::Ptr buffer;
|
||||
@@ -193,23 +193,22 @@ namespace OpenVulkano::Vulkan
|
||||
if (node->GetUpdateFrequency() != Scene::UpdateFrequency::Never)
|
||||
{
|
||||
frameSize = allocSize;
|
||||
vkNode = new VulkanNodeDynamic();
|
||||
vkNode = new VulkanNodeDynamic(node, uBuffer);
|
||||
const uint32_t imgs = context->swapChain.GetImageCount();
|
||||
buffer = memPool.CreateBuffer(imgs * allocSize, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostVisible);
|
||||
buffer->Map();
|
||||
}
|
||||
else
|
||||
{
|
||||
vkNode = new VulkanNode();
|
||||
buffer = CreateDeviceOnlyBufferWithData(Scene::Node::SIZE, vk::BufferUsageFlagBits::eUniformBuffer, &node->worldMat);
|
||||
vkNode = new VulkanNode(node, uBuffer);
|
||||
}
|
||||
|
||||
uBuffer->Init(std::move(buffer), frameSize, allocSize, GetDescriptorLayoutSet(Scene::Node::DESCRIPTOR_SET_LAYOUT_BINDING), Scene::Node::DESCRIPTOR_SET_LAYOUT_BINDING, 0);
|
||||
vkNode->Init(node, uBuffer);
|
||||
node->renderNode = vkNode;
|
||||
nodes.emplace_back(vkNode);
|
||||
return vkNode;
|
||||
}
|
||||
return static_cast<VulkanNode*>(node->renderNode);
|
||||
return node->GetRenderResource();
|
||||
}
|
||||
|
||||
VulkanCamera* ResourceManager::PrepareCamera(Scene::Camera* camera)
|
||||
|
||||
@@ -6,28 +6,23 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "Base/ICloseable.hpp"
|
||||
#include "Base/Render/RenderResource.hpp"
|
||||
#include "IRecordable.hpp"
|
||||
#include "Scene/Camera.hpp"
|
||||
#include "Vulkan/Resources/UniformBuffer.hpp"
|
||||
|
||||
namespace OpenVulkano::Vulkan
|
||||
{
|
||||
class VulkanNode : public IRecordable, public ICloseable
|
||||
class VulkanNode : public IRenderResource<Scene::Node>, public IRecordable
|
||||
{
|
||||
public:
|
||||
Scene::Node* node = nullptr;
|
||||
UniformBuffer* buffer = nullptr;
|
||||
Unique<UniformBuffer> buffer = nullptr;
|
||||
|
||||
~VulkanNode() override
|
||||
{
|
||||
if (node) VulkanNode::Close();
|
||||
}
|
||||
~VulkanNode() override = default;
|
||||
|
||||
virtual void Init(Scene::Node* node, UniformBuffer* uniformBuffer)
|
||||
VulkanNode(Scene::Node* node, UniformBuffer* uniformBuffer)
|
||||
: IRenderResource<Scene::Node>(node), buffer(uniformBuffer)
|
||||
{
|
||||
this->node = node;
|
||||
this->buffer = uniformBuffer;
|
||||
}
|
||||
|
||||
void Record(VulkanDrawContext* context) override
|
||||
@@ -35,12 +30,9 @@ namespace OpenVulkano::Vulkan
|
||||
buffer->Record(context);
|
||||
}
|
||||
|
||||
void Close() override
|
||||
void Release() override
|
||||
{
|
||||
if (node) node->renderNode = nullptr;
|
||||
delete buffer;
|
||||
node = nullptr;
|
||||
buffer = nullptr;
|
||||
//TODO
|
||||
}
|
||||
};
|
||||
|
||||
@@ -48,18 +40,16 @@ namespace OpenVulkano::Vulkan
|
||||
{
|
||||
//uint32_t lastUpdate = -1;
|
||||
|
||||
void Init(Scene::Node* node, UniformBuffer* uniformBuffer) override
|
||||
{
|
||||
VulkanNode::Init(node, uniformBuffer);
|
||||
//lastUpdate = -1;
|
||||
}
|
||||
VulkanNodeDynamic(Scene::Node* node, UniformBuffer* uniformBuffer)
|
||||
: VulkanNode(node, uniformBuffer)
|
||||
{}
|
||||
|
||||
void Record(VulkanDrawContext* context) override
|
||||
{
|
||||
//if(context->currentImageId != lastUpdate) //TODO fix
|
||||
{
|
||||
//lastUpdate = bufferId;
|
||||
buffer->Update(&node->worldMat, sizeof(Math::Matrix4f), context->currentImageId);
|
||||
buffer->Update(&GetOwner()->worldMat, sizeof(Math::Matrix4f), context->currentImageId);
|
||||
}
|
||||
buffer->Record(context);
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace OpenVulkano::Vulkan
|
||||
|
||||
void VulkanDrawContext::EncodeNode(Scene::Node* node)
|
||||
{
|
||||
VulkanNode* vkNode = static_cast<VulkanNode*>(node->renderNode);
|
||||
VulkanNode* vkNode = node->GetRenderResource();
|
||||
if (!vkNode)
|
||||
{
|
||||
vkNode = renderer->GetResourceManager().PrepareNode(node);
|
||||
|
||||
Reference in New Issue
Block a user