// 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_SPRITECHAINRENDERER_HPP #define NAZARA_GRAPHICS_SPRITECHAINRENDERER_HPP #include #include #include #include #include #include #include #include namespace Nz { class AbstractBuffer; class RenderDevice; class RenderPipeline; class RenderSpriteChain; class ShaderBinding; class NAZARA_GRAPHICS_API SpriteChainRenderer : public ElementRenderer { public: SpriteChainRenderer(RenderDevice& device, std::size_t maxVertexBufferSize = 32 * 1024); ~SpriteChainRenderer() = default; std::unique_ptr InstanciateData() override; void Prepare(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, RenderFrame& currentFrame, const RenderStates& renderStates, const Pointer* elements, std::size_t elementCount) override; void Render(const ViewerInstance& viewerInstance, ElementRendererData& rendererData, CommandBufferBuilder& commandBuffer, const Pointer* elements, std::size_t elementCount) override; void Reset(ElementRendererData& rendererData, RenderFrame& currentFrame) override; private: struct BufferCopy { AbstractBuffer* targetBuffer; UploadPool::Allocation* allocation; std::size_t size; }; struct VertexBufferPool { std::vector> vertexBuffers; }; std::shared_ptr m_indexBuffer; std::shared_ptr m_vertexBufferPool; std::size_t m_maxVertexBufferSize; std::size_t m_maxVertexCount; std::vector m_pendingCopies; std::vector m_bindingCache; RenderDevice& m_device; }; struct SpriteChainRendererData : public ElementRendererData { struct DrawCall { const AbstractBuffer* vertexBuffer; const RenderPipeline* renderPipeline; const ShaderBinding* shaderBinding; std::size_t firstIndex; std::size_t quadCount; Recti scissorBox; }; struct DrawCallIndices { std::size_t start; std::size_t count; }; std::unordered_map drawCallPerElement; std::vector drawCalls; std::vector> vertexBuffers; std::vector shaderBindings; }; } #include #endif // NAZARA_GRAPHICS_SPRITECHAINRENDERER_HPP