Graphics: Use memory pools for render elements

This commit is contained in:
SirLynix
2022-08-30 19:27:52 +02:00
parent 7949c57f16
commit 017a6c7af3
43 changed files with 528 additions and 133 deletions

View File

@@ -13,6 +13,7 @@
#include <Nazara/Graphics/FramePipelinePass.hpp>
#include <Nazara/Graphics/MaterialPass.hpp>
#include <Nazara/Graphics/RenderElement.hpp>
#include <Nazara/Graphics/RenderElementOwner.hpp>
#include <Nazara/Graphics/RenderQueue.hpp>
#include <Nazara/Graphics/RenderQueueRegistry.hpp>
#include <Nazara/Math/Frustum.hpp>
@@ -20,6 +21,7 @@
namespace Nz
{
class AbstractViewer;
class ElementRendererRegistry;
class FrameGraph;
class FramePipeline;
class Material;
@@ -27,7 +29,7 @@ namespace Nz
class NAZARA_GRAPHICS_API DepthPipelinePass : public FramePipelinePass
{
public:
DepthPipelinePass(FramePipeline& owner, AbstractViewer* viewer);
DepthPipelinePass(FramePipeline& owner, ElementRendererRegistry& elementRegistry, AbstractViewer* viewer);
DepthPipelinePass(const DepthPipelinePass&) = delete;
DepthPipelinePass(DepthPipelinePass&&) = delete;
~DepthPipelinePass();
@@ -57,12 +59,13 @@ namespace Nz
std::size_t m_depthPassIndex;
std::size_t m_lastVisibilityHash;
std::vector<std::unique_ptr<ElementRendererData>> m_elementRendererData;
std::vector<std::unique_ptr<RenderElement>> m_renderElements;
std::vector<ElementRenderer::RenderStates> m_renderStates;
std::vector<RenderElementOwner> m_renderElements;
std::unordered_map<MaterialPass*, MaterialPassEntry> m_materialPasses;
RenderQueue<RenderElement*> m_renderQueue;
RenderQueue<const RenderElement*> m_renderQueue;
RenderQueueRegistry m_renderQueueRegistry;
AbstractViewer* m_viewer;
ElementRendererRegistry& m_elementRegistry;
FramePipeline& m_pipeline;
bool m_rebuildCommandBuffer;
bool m_rebuildElements;

View File

@@ -11,6 +11,7 @@
#include <Nazara/Core/Algorithm.hpp>
#include <Nazara/Graphics/Config.hpp>
#include <Nazara/Graphics/Enums.hpp>
#include <Nazara/Graphics/RenderElementPool.hpp>
#include <Nazara/Renderer/RenderBufferView.hpp>
#include <memory>
#include <optional>
@@ -32,6 +33,8 @@ namespace Nz
ElementRenderer() = default;
virtual ~ElementRenderer();
virtual RenderElementPoolBase& GetPool() = 0;
virtual std::unique_ptr<ElementRendererData> InstanciateData() = 0;
virtual void Prepare(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, RenderFrame& currentFrame, std::size_t elementCount, const Pointer<const RenderElement>* elements, const RenderStates* renderStates);
virtual void PrepareEnd(RenderFrame& currentFrame, ElementRendererData& rendererData);
@@ -41,7 +44,6 @@ namespace Nz
struct RenderStates
{
RenderBufferView lightData;
RenderBufferView skeletalData;
};
};

View File

@@ -0,0 +1,51 @@
// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - Graphics module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#pragma once
#ifndef NAZARA_GRAPHICS_ELEMENTRENDERERREGISTRY_HPP
#define NAZARA_GRAPHICS_ELEMENTRENDERERREGISTRY_HPP
#include <Nazara/Prerequisites.hpp>
#include <Nazara/Graphics/Config.hpp>
#include <Nazara/Graphics/ElementRenderer.hpp>
#include <Nazara/Graphics/RenderElementPool.hpp>
#include <Nazara/Graphics/RenderQueue.hpp>
#include <memory>
namespace Nz
{
class ElementRenderer;
class NAZARA_GRAPHICS_API ElementRendererRegistry
{
public:
ElementRendererRegistry();
ElementRendererRegistry(const ElementRendererRegistry&) = delete;
ElementRendererRegistry(ElementRendererRegistry&&) = delete;
~ElementRendererRegistry() = default;
template<typename T, typename... Args> RenderElementOwner AllocateElement(Args&&... args);
template<typename F> void ForEachElementRenderer(F&& callback);
inline ElementRenderer& GetElementRenderer(std::size_t elementIndex);
inline std::size_t GetElementRendererCount() const;
template<typename F> void ProcessRenderQueue(const RenderQueue<const RenderElement*>& renderQueue, F&& callback);
template<typename T> void RegisterElementRenderer(std::unique_ptr<ElementRenderer> renderer);
inline void RegisterElementRenderer(std::size_t elementIndex, std::unique_ptr<ElementRenderer> renderer);
ElementRendererRegistry& operator=(const ElementRendererRegistry&) = delete;
ElementRendererRegistry& operator=(ElementRendererRegistry&&) = delete;
private:
std::vector<std::unique_ptr<ElementRenderer>> m_elementRenderers;
};
}
#include <Nazara/Graphics/ElementRendererRegistry.inl>
#endif // NAZARA_GRAPHICS_ELEMENTRENDERERREGISTRY_HPP

View File

@@ -0,0 +1,84 @@
// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - Graphics module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Graphics/ElementRendererRegistry.hpp>
#include <Nazara/Utils/Algorithm.hpp>
#include <Nazara/Graphics/Debug.hpp>
namespace Nz
{
template<typename T, typename ...Args>
RenderElementOwner ElementRendererRegistry::AllocateElement(Args&&... args)
{
ElementRenderer& elementRenderer = GetElementRenderer(SafeCast<std::size_t>(T::ElementType));
RenderElementPool<T>& pool = SafeCast<RenderElementPool<T>&>(elementRenderer.GetPool());
return pool.Allocate(std::forward<Args>(args)...);
}
inline ElementRenderer& ElementRendererRegistry::GetElementRenderer(std::size_t elementIndex)
{
assert(elementIndex < m_elementRenderers.size());
return *m_elementRenderers[elementIndex];
}
inline std::size_t ElementRendererRegistry::GetElementRendererCount() const
{
return m_elementRenderers.size();
}
template<typename F>
void ElementRendererRegistry::ForEachElementRenderer(F&& callback)
{
for (std::size_t i = 0; i < m_elementRenderers.size(); ++i)
{
if (m_elementRenderers[i])
callback(i, *m_elementRenderers[i]);
}
}
template<typename F>
void ElementRendererRegistry::ProcessRenderQueue(const RenderQueue<const RenderElement*>& renderQueue, F&& callback)
{
if (renderQueue.empty())
return;
auto it = renderQueue.begin();
auto itEnd = renderQueue.end();
while (it != itEnd)
{
const RenderElement* element = *it;
UInt8 elementType = element->GetElementType();
const Pointer<const RenderElement>* first = it;
++it;
while (it != itEnd && (*it)->GetElementType() == elementType)
++it;
std::size_t count = it - first;
if (elementType >= m_elementRenderers.size() || !m_elementRenderers[elementType])
continue;
callback(elementType, first, count);
}
}
template<typename T>
inline void ElementRendererRegistry::RegisterElementRenderer(std::unique_ptr<ElementRenderer> renderer)
{
return RegisterElementRenderer(SafeCast<std::size_t>(T::ElementType), std::move(renderer));
}
inline void ElementRendererRegistry::RegisterElementRenderer(std::size_t elementIndex, std::unique_ptr<ElementRenderer> renderer)
{
if (elementIndex >= m_elementRenderers.size())
m_elementRenderers.resize(elementIndex + 1);
assert(!m_elementRenderers[elementIndex]);
m_elementRenderers[elementIndex] = std::move(renderer);
}
}
#include <Nazara/Graphics/DebugOff.hpp>

View File

@@ -37,7 +37,7 @@ namespace Nz
class NAZARA_GRAPHICS_API ForwardFramePipeline : public FramePipeline
{
public:
ForwardFramePipeline();
ForwardFramePipeline(ElementRendererRegistry& elementRegistry);
ForwardFramePipeline(const ForwardFramePipeline&) = delete;
ForwardFramePipeline(ForwardFramePipeline&&) = delete;
~ForwardFramePipeline();
@@ -137,6 +137,7 @@ namespace Nz
Bitset<UInt64> m_removedSkeletonInstances;
Bitset<UInt64> m_removedViewerInstances;
Bitset<UInt64> m_removedWorldInstances;
ElementRendererRegistry& m_elementRegistry;
MemoryPool<RenderableData> m_renderablePool;
MemoryPool<LightData> m_lightPool;
MemoryPool<SkeletonInstancePtr> m_skeletonInstances;

View File

@@ -14,6 +14,7 @@
#include <Nazara/Graphics/Light.hpp>
#include <Nazara/Graphics/MaterialPass.hpp>
#include <Nazara/Graphics/RenderElement.hpp>
#include <Nazara/Graphics/RenderElementOwner.hpp>
#include <Nazara/Graphics/RenderQueue.hpp>
#include <Nazara/Graphics/RenderQueueRegistry.hpp>
#include <Nazara/Math/Frustum.hpp>
@@ -22,6 +23,7 @@
namespace Nz
{
class AbstractViewer;
class ElementRendererRegistry;
class FrameGraph;
class FramePipeline;
class Light;
@@ -30,7 +32,7 @@ namespace Nz
class NAZARA_GRAPHICS_API ForwardPipelinePass : public FramePipelinePass
{
public:
ForwardPipelinePass(FramePipeline& owner, AbstractViewer* viewer);
ForwardPipelinePass(FramePipeline& owner, ElementRendererRegistry& elementRegistry, AbstractViewer* viewer);
ForwardPipelinePass(const ForwardPipelinePass&) = delete;
ForwardPipelinePass(ForwardPipelinePass&&) = delete;
~ForwardPipelinePass();
@@ -82,16 +84,17 @@ namespace Nz
std::size_t m_lastVisibilityHash;
std::shared_ptr<LightUboPool> m_lightUboPool;
std::vector<std::unique_ptr<ElementRendererData>> m_elementRendererData;
std::vector<std::unique_ptr<RenderElement>> m_renderElements;
std::vector<ElementRenderer::RenderStates> m_renderStates;
std::vector<RenderElementOwner> m_renderElements;
std::unordered_map<MaterialPass*, MaterialPassEntry> m_materialPasses;
std::unordered_map<const RenderElement*, RenderBufferView> m_lightPerRenderElement;
std::unordered_map<LightKey, RenderBufferView, LightKeyHasher> m_lightBufferPerLights;
std::vector<LightDataUbo> m_lightDataBuffers;
std::vector<const Light*> m_renderableLights;
RenderQueue<RenderElement*> m_renderQueue;
RenderQueue<const RenderElement*> m_renderQueue;
RenderQueueRegistry m_renderQueueRegistry;
AbstractViewer* m_viewer;
ElementRendererRegistry& m_elementRegistry;
FramePipeline& m_pipeline;
bool m_rebuildCommandBuffer;
bool m_rebuildElements;

View File

@@ -10,7 +10,6 @@
#include <Nazara/Prerequisites.hpp>
#include <Nazara/Graphics/Config.hpp>
#include <Nazara/Graphics/RenderElement.hpp>
#include <Nazara/Graphics/RenderQueue.hpp>
#include <Nazara/Graphics/SkeletonInstance.hpp>
#include <Nazara/Graphics/WorldInstance.hpp>
#include <Nazara/Renderer/DebugDrawer.hpp>
@@ -20,7 +19,6 @@
namespace Nz
{
class AbstractViewer;
class ElementRenderer;
class InstancedRenderable;
class Light;
class MaterialPass;
@@ -34,18 +32,12 @@ namespace Nz
FramePipeline(FramePipeline&&) noexcept = default;
virtual ~FramePipeline();
template<typename F> void ForEachElementRenderer(F&& callback);
inline DebugDrawer& GetDebugDrawer();
inline ElementRenderer& GetElementRenderer(std::size_t elementIndex);
inline std::size_t GetElementRendererCount() const;
virtual void InvalidateSkeletalInstance(std::size_t skeletalInstanceIndex) = 0;
virtual void InvalidateViewer(std::size_t viewerIndex) = 0;
virtual void InvalidateWorldInstance(std::size_t worldInstance) = 0;
template<typename F> void ProcessRenderQueue(const RenderQueue<RenderElement*>& renderQueue, F&& callback);
virtual std::size_t RegisterLight(std::shared_ptr<Light> light, UInt32 renderMask) = 0;
virtual void RegisterMaterialPass(MaterialPass* materialPass) = 0;
virtual std::size_t RegisterRenderable(std::size_t worldInstanceIndex, std::size_t skeletonInstanceIndex, const InstancedRenderable* instancedRenderable, UInt32 renderMask, const Recti& scissorBox) = 0;
@@ -75,7 +67,6 @@ namespace Nz
static constexpr std::size_t NoSkeletonInstance = std::numeric_limits<std::size_t>::max();
private:
std::vector<std::unique_ptr<ElementRenderer>> m_elementRenderers;
DebugDrawer m_debugDrawer;
};
}

View File

@@ -12,54 +12,6 @@ namespace Nz
{
return m_debugDrawer;
}
inline ElementRenderer& FramePipeline::GetElementRenderer(std::size_t elementIndex)
{
assert(elementIndex < m_elementRenderers.size());
return *m_elementRenderers[elementIndex];
}
inline std::size_t FramePipeline::GetElementRendererCount() const
{
return m_elementRenderers.size();
}
template<typename F>
void FramePipeline::ForEachElementRenderer(F&& callback)
{
for (std::size_t i = 0; i < m_elementRenderers.size(); ++i)
{
if (m_elementRenderers[i])
callback(i, *m_elementRenderers[i]);
}
}
template<typename F>
void FramePipeline::ProcessRenderQueue(const RenderQueue<RenderElement*>& renderQueue, F&& callback)
{
if (renderQueue.empty())
return;
auto it = renderQueue.begin();
auto itEnd = renderQueue.end();
while (it != itEnd)
{
const RenderElement* element = *it;
UInt8 elementType = element->GetElementType();
const Pointer<RenderElement>* first = it;
++it;
while (it != itEnd && (*it)->GetElementType() == elementType)
++it;
std::size_t count = it - first;
if (elementType >= m_elementRenderers.size() || !m_elementRenderers[elementType])
continue;
callback(elementType, first, count);
}
}
}
#include <Nazara/Graphics/DebugOff.hpp>

View File

@@ -9,6 +9,7 @@
#include <Nazara/Prerequisites.hpp>
#include <Nazara/Graphics/Config.hpp>
#include <Nazara/Graphics/RenderElementOwner.hpp>
#include <Nazara/Math/Box.hpp>
#include <Nazara/Utils/Signal.hpp>
#include <memory>
@@ -16,6 +17,7 @@
namespace Nz
{
class CommandBufferBuilder;
class ElementRendererRegistry;
class Material;
class RenderElement;
class SkeletonInstance;
@@ -24,12 +26,14 @@ namespace Nz
class NAZARA_GRAPHICS_API InstancedRenderable
{
public:
struct ElementData;
inline InstancedRenderable();
InstancedRenderable(const InstancedRenderable&) = delete;
InstancedRenderable(InstancedRenderable&&) noexcept = default;
~InstancedRenderable();
virtual void BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, const SkeletonInstance* skeletonInstance, std::vector<std::unique_ptr<RenderElement>>& elements, const Recti& scissorBox) const = 0;
virtual void BuildElement(ElementRendererRegistry& registry, const ElementData& elementData, std::size_t passIndex, std::vector<RenderElementOwner>& elements) const = 0;
inline const Boxf& GetAABB() const;
virtual const std::shared_ptr<Material>& GetMaterial(std::size_t i) const = 0;
@@ -45,6 +49,13 @@ namespace Nz
NazaraSignal(OnElementInvalidated, InstancedRenderable* /*instancedRenderable*/);
NazaraSignal(OnMaterialInvalidated, InstancedRenderable* /*instancedRenderable*/, std::size_t /*materialIndex*/, const std::shared_ptr<Material>& /*newMaterial*/);
struct ElementData
{
const Recti* scissorBox;
const SkeletonInstance* skeletonInstance;
const WorldInstance* worldInstance;
};
protected:
inline void UpdateAABB(Boxf aabb);

View File

@@ -30,7 +30,7 @@ namespace Nz
inline void AddSection(float size, float textureCoord);
void BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, const SkeletonInstance* skeletonInstance, std::vector<std::unique_ptr<RenderElement>>& elements, const Recti& scissorBox) const override;
void BuildElement(ElementRendererRegistry& registry, const ElementData& elementData, std::size_t passIndex, std::vector<RenderElementOwner>& elements) const override;
inline void Clear();

View File

@@ -28,7 +28,7 @@ namespace Nz
Model(Model&&) noexcept = default;
~Model() = default;
void BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, const SkeletonInstance* skeletonInstance, std::vector<std::unique_ptr<RenderElement>>& elements, const Recti& scissorBox) const override;
void BuildElement(ElementRendererRegistry& registry, const ElementData& elementData, std::size_t passIndex, std::vector<RenderElementOwner>& elements) const override;
const std::shared_ptr<RenderBuffer>& GetIndexBuffer(std::size_t subMeshIndex) const;
std::size_t GetIndexCount(std::size_t subMeshIndex) const;

View File

@@ -0,0 +1,45 @@
// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - Graphics module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#pragma once
#ifndef NAZARA_GRAPHICS_RENDERELEMENTOWNER_HPP
#define NAZARA_GRAPHICS_RENDERELEMENTOWNER_HPP
#include <Nazara/Prerequisites.hpp>
#include <Nazara/Graphics/Config.hpp>
#include <Nazara/Utils/MovablePtr.hpp>
namespace Nz
{
class RenderElement;
class RenderElementPoolBase;
class NAZARA_GRAPHICS_API RenderElementOwner
{
public:
inline RenderElementOwner(RenderElementPoolBase* pool, std::size_t poolIndex, RenderElement* element);
RenderElementOwner(const RenderElementOwner&) = delete;
RenderElementOwner(RenderElementOwner&&) noexcept = default;
~RenderElementOwner();
inline RenderElement* GetElement();
inline const RenderElement* GetElement() const;
inline RenderElement* operator->();
inline const RenderElement* operator->() const;
RenderElementOwner& operator=(const RenderElementOwner&) = delete;
RenderElementOwner& operator=(RenderElementOwner&&) noexcept = default;
private:
std::size_t m_poolIndex;
MovablePtr<RenderElement> m_element;
MovablePtr<RenderElementPoolBase> m_pool;
};
}
#include <Nazara/Graphics/RenderElementOwner.inl>
#endif // NAZARA_GRAPHICS_RENDERELEMENTOWNER_HPP

View File

@@ -0,0 +1,39 @@
// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - Graphics module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Graphics/RenderElementOwner.hpp>
#include <Nazara/Graphics/Debug.hpp>
namespace Nz
{
inline RenderElementOwner::RenderElementOwner(RenderElementPoolBase* pool, std::size_t poolIndex, RenderElement* element) :
m_poolIndex(poolIndex),
m_element(element),
m_pool(pool)
{
}
inline RenderElement* RenderElementOwner::GetElement()
{
return m_element;
}
inline const RenderElement* RenderElementOwner::GetElement() const
{
return m_element;
}
inline RenderElement* RenderElementOwner::operator->()
{
// FIXME: Element pointer could also be retrieved from memory pool using poolIndex at the cost of a division
return m_element;
}
inline const RenderElement* RenderElementOwner::operator->() const
{
return m_element;
}
}
#include <Nazara/Graphics/DebugOff.hpp>

View File

@@ -0,0 +1,60 @@
// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - Graphics module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#pragma once
#ifndef NAZARA_GRAPHICS_RENDERELEMENTPOOL_HPP
#define NAZARA_GRAPHICS_RENDERELEMENTPOOL_HPP
#include <Nazara/Prerequisites.hpp>
#include <Nazara/Graphics/Config.hpp>
#include <Nazara/Graphics/RenderElementOwner.hpp>
#include <Nazara/Utils/MemoryPool.hpp>
namespace Nz
{
class RenderElementOwner;
class NAZARA_GRAPHICS_API RenderElementPoolBase
{
public:
RenderElementPoolBase() = default;
RenderElementPoolBase(const RenderElementPoolBase&) = delete;
RenderElementPoolBase(RenderElementPoolBase&&) = delete;
virtual ~RenderElementPoolBase();
virtual void Clear() = 0;
virtual void Free(std::size_t index) = 0;
RenderElementPoolBase& operator=(const RenderElementPoolBase&) = delete;
RenderElementPoolBase& operator=(RenderElementPoolBase&&) = delete;
};
template<typename T>
class RenderElementPool final : public RenderElementPoolBase
{
public:
RenderElementPool();
RenderElementPool(const RenderElementPool&) = delete;
RenderElementPool(RenderElementPool&&) = delete;
~RenderElementPool() = default;
template<typename... Args> RenderElementOwner Allocate(Args&&... args);
void Clear() override;
void Free(std::size_t index) override;
RenderElementPool& operator=(const RenderElementPool&) = delete;
RenderElementPool& operator=(RenderElementPool&&) = delete;
private:
MemoryPool<T> m_pool;
};
}
#include <Nazara/Graphics/RenderElementPool.inl>
#endif // NAZARA_GRAPHICS_RENDERELEMENTPOOL_HPP

View File

@@ -0,0 +1,39 @@
// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - Graphics module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Graphics/RenderElementPool.hpp>
#include <Nazara/Graphics/Debug.hpp>
namespace Nz
{
template<typename T>
template<typename... Args>
RenderElementOwner RenderElementPool<T>::Allocate(Args&&... args)
{
std::size_t poolIndex;
T* element = m_pool.Allocate(poolIndex, std::forward<Args>(args)...);
return RenderElementOwner(this, poolIndex, element);
}
template<typename T>
RenderElementPool<T>::RenderElementPool() :
m_pool(4096) //< TODO: Allow to adjust pool count
{
}
template<typename T>
void RenderElementPool<T>::Clear()
{
m_pool.Clear();
}
template<typename T>
void RenderElementPool<T>::Free(std::size_t index)
{
m_pool.Free(index);
}
}
#include <Nazara/Graphics/DebugOff.hpp>

View File

@@ -39,6 +39,8 @@ namespace Nz
inline void Register(RenderQueueRegistry& registry) const override;
static constexpr BasicRenderElement ElementType = BasicRenderElement::SpriteChain;
private:
std::shared_ptr<MaterialPass> m_materialPass;
std::shared_ptr<RenderPipeline> m_renderPipeline;

View File

@@ -41,6 +41,8 @@ namespace Nz
inline void Register(RenderQueueRegistry& registry) const override;
static constexpr BasicRenderElement ElementType = BasicRenderElement::Submesh;
private:
std::shared_ptr<RenderBuffer> m_indexBuffer;
std::shared_ptr<RenderBuffer> m_vertexBuffer;

View File

@@ -27,7 +27,7 @@ namespace Nz
SlicedSprite(SlicedSprite&&) noexcept = default;
~SlicedSprite() = default;
void BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, const SkeletonInstance* skeletonInstance, std::vector<std::unique_ptr<RenderElement>>& elements, const Recti& scissorBox) const override;
void BuildElement(ElementRendererRegistry& registry, const ElementData& elementData, std::size_t passIndex, std::vector<RenderElementOwner>& elements) const override;
inline const Color& GetColor() const;
inline const Corner& GetBottomRightCorner() const;

View File

@@ -25,7 +25,7 @@ namespace Nz
Sprite(Sprite&&) noexcept = default;
~Sprite() = default;
void BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, const SkeletonInstance* skeletonInstance, std::vector<std::unique_ptr<RenderElement>>& elements, const Recti& scissorBox) const override;
void BuildElement(ElementRendererRegistry& registry, const ElementData& elementData, std::size_t passIndex, std::vector<RenderElementOwner>& elements) const override;
inline const Color& GetColor() const;
inline const Color& GetCornerColor(RectCorner corner) const;

View File

@@ -9,6 +9,7 @@
#include <Nazara/Prerequisites.hpp>
#include <Nazara/Graphics/ElementRenderer.hpp>
#include <Nazara/Graphics/RenderSpriteChain.hpp>
#include <Nazara/Math/Rect.hpp>
#include <Nazara/Renderer/ShaderBinding.hpp>
#include <Nazara/Renderer/UploadPool.hpp>
@@ -21,7 +22,6 @@ namespace Nz
class MaterialPass;
class RenderDevice;
class RenderPipeline;
class RenderSpriteChain;
class ShaderBinding;
class Texture;
class VertexDeclaration;
@@ -57,6 +57,8 @@ namespace Nz
SpriteChainRenderer(RenderDevice& device, std::size_t maxVertexBufferSize = 32 * 1024);
~SpriteChainRenderer() = default;
RenderElementPool<RenderSpriteChain>& GetPool() override;
std::unique_ptr<ElementRendererData> InstanciateData() override;
void Prepare(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, RenderFrame& currentFrame, std::size_t elementCount, const Pointer<const RenderElement>* elements, const RenderStates* renderStates) override;
void PrepareEnd(RenderFrame& currentFrame, ElementRendererData& rendererData) override;
@@ -103,6 +105,7 @@ namespace Nz
std::size_t m_maxVertexCount;
std::vector<BufferCopy> m_pendingCopies;
std::vector<ShaderBinding::Binding> m_bindingCache;
RenderElementPool<RenderSpriteChain> m_spriteChainPool;
PendingData m_pendingData;
RenderDevice& m_device;
};

View File

@@ -9,21 +9,23 @@
#include <Nazara/Prerequisites.hpp>
#include <Nazara/Graphics/ElementRenderer.hpp>
#include <Nazara/Graphics/RenderSubmesh.hpp>
#include <Nazara/Math/Rect.hpp>
#include <Nazara/Renderer/ShaderBinding.hpp>
namespace Nz
{
class RenderPipeline;
class RenderSubmesh;
class ShaderBinding;
class NAZARA_GRAPHICS_API SubmeshRenderer : public ElementRenderer
class NAZARA_GRAPHICS_API SubmeshRenderer final : public ElementRenderer
{
public:
SubmeshRenderer() = default;
~SubmeshRenderer() = default;
RenderElementPool<RenderSubmesh>& GetPool() override;
std::unique_ptr<ElementRendererData> InstanciateData() override;
void Prepare(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, RenderFrame& currentFrame, std::size_t elementCount, const Pointer<const RenderElement>* elements, const RenderStates* renderStates) override;
void Render(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, CommandBufferBuilder& commandBuffer, std::size_t elementCount, const Pointer<const RenderElement>* elements) override;
@@ -31,6 +33,7 @@ namespace Nz
private:
std::vector<ShaderBinding::Binding> m_bindingCache;
RenderElementPool<RenderSubmesh> m_submeshPool;
};
struct SubmeshRendererData : public ElementRendererData

View File

@@ -8,6 +8,7 @@
#define NAZARA_GRAPHICS_SYSTEMS_RENDERSYSTEM_HPP
#include <Nazara/Prerequisites.hpp>
#include <Nazara/Graphics/ElementRendererRegistry.hpp>
#include <Nazara/Graphics/Graphics.hpp>
#include <Nazara/Graphics/Components/GraphicsComponent.hpp>
#include <Nazara/Graphics/Components/LightComponent.hpp>
@@ -132,6 +133,7 @@ namespace Nz
std::unordered_set<LightEntity*> m_newlyHiddenLightEntities;
std::unordered_set<LightEntity*> m_newlyVisibleLightEntities;
std::vector<std::unique_ptr<RenderWindow>> m_renderWindows;
ElementRendererRegistry m_elementRegistry;
MemoryPool<CameraEntity> m_cameraEntityPool;
MemoryPool<GraphicsEntity> m_graphicsEntityPool;
MemoryPool<LightEntity> m_lightEntityPool;

View File

@@ -28,7 +28,7 @@ namespace Nz
TextSprite(TextSprite&&) noexcept = default;
~TextSprite() = default;
void BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, const SkeletonInstance* skeletonInstance, std::vector<std::unique_ptr<RenderElement>>& elements, const Recti& scissorBox) const override;
void BuildElement(ElementRendererRegistry& registry, const ElementData& elementData, std::size_t passIndex, std::vector<RenderElementOwner>& elements) const override;
inline void Clear();