// 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_FORWARDFRAMEPIPELINE_HPP #define NAZARA_GRAPHICS_FORWARDFRAMEPIPELINE_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Nz { class RenderFrame; class RenderTarget; class NAZARA_GRAPHICS_API ForwardFramePipeline : public FramePipeline { public: ForwardFramePipeline(); ForwardFramePipeline(const ForwardFramePipeline&) = delete; ForwardFramePipeline(ForwardFramePipeline&&) = delete; ~ForwardFramePipeline() = default; void InvalidateViewer(AbstractViewer* viewerInstance) override; void InvalidateWorldInstance(WorldInstance* worldInstance) override; void RegisterInstancedDrawable(WorldInstancePtr worldInstance, const InstancedRenderable* instancedRenderable, UInt32 renderMask) override; void RegisterViewer(AbstractViewer* viewerInstance, Int32 renderOrder) override; void Render(RenderFrame& renderFrame) override; void UnregisterInstancedDrawable(const WorldInstancePtr& worldInstance, const InstancedRenderable* instancedRenderable) override; void UnregisterViewer(AbstractViewer* viewerInstance) override; ForwardFramePipeline& operator=(const ForwardFramePipeline&) = delete; ForwardFramePipeline& operator=(ForwardFramePipeline&&) = delete; private: BakedFrameGraph BuildFrameGraph(); void RegisterMaterialPass(MaterialPass* material); template void ProcessRenderQueue(const RenderQueue& renderQueue, F&& callback); void UnregisterMaterialPass(MaterialPass* material); struct ViewerData; struct MaterialData { std::size_t usedCount = 0; NazaraSlot(MaterialPass, OnMaterialInvalidated, onMaterialInvalided); }; struct RenderableData { UInt32 renderMask = 0; NazaraSlot(InstancedRenderable, OnElementInvalidated, onElementInvalidated); NazaraSlot(InstancedRenderable, OnMaterialInvalidated, onMaterialInvalidated); }; struct RenderTargetData { std::size_t finalAttachment; std::vector viewers; ShaderBindingPtr blitShaderBinding; }; struct VisibleRenderable { const InstancedRenderable* instancedRenderable; const WorldInstance* worldInstance; }; struct ViewerData { std::size_t colorAttachment; std::size_t depthStencilAttachment; std::size_t visibilityHash = 0; std::vector> depthPrepassRenderElements; std::vector> forwardRenderElements; std::vector> elementRendererData; Int32 renderOrder = 0; RenderQueueRegistry depthPrepassRegistry; RenderQueueRegistry forwardRegistry; RenderQueue depthPrepassRenderQueue; RenderQueue forwardRenderQueue; ShaderBindingPtr blitShaderBinding; bool prepare = true; bool rebuildDepthPrepass = true; bool rebuildForwardPass = true; }; std::size_t m_depthPassIndex; std::size_t m_forwardPassIndex; std::shared_ptr m_lightDataBuffer; std::unordered_map m_viewers; std::unordered_map m_materials; std::unordered_map> m_renderables; std::unordered_map m_renderTargets; std::unordered_set m_invalidatedViewerInstances; std::unordered_set m_invalidatedMaterials; std::unordered_set m_invalidatedWorldInstances; std::unordered_set m_removedWorldInstances; std::vector> m_elementRenderers; std::vector m_visibleRenderables; BakedFrameGraph m_bakedFrameGraph; RenderFrame* m_currentRenderFrame; bool m_rebuildFrameGraph; }; } #include #endif // NAZARA_GRAPHICS_FORWARDFRAMEPIPELINE_HPP