// 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 #include #include #include #include namespace Nz { class PointLight; class RenderFrame; class RenderTarget; class NAZARA_GRAPHICS_API ForwardFramePipeline : public FramePipeline { public: ForwardFramePipeline(); ForwardFramePipeline(const ForwardFramePipeline&) = delete; ForwardFramePipeline(ForwardFramePipeline&&) = delete; ~ForwardFramePipeline(); void InvalidateViewer(AbstractViewer* viewerInstance) override; void InvalidateWorldInstance(WorldInstance* worldInstance) override; void RegisterInstancedDrawable(WorldInstancePtr worldInstance, const InstancedRenderable* instancedRenderable, UInt32 renderMask) override; void RegisterLight(std::shared_ptr light, UInt32 renderMask) override; void RegisterMaterialPass(MaterialPass* materialPass) override; void RegisterViewer(AbstractViewer* viewerInstance, Int32 renderOrder) override; void Render(RenderFrame& renderFrame) override; void UnregisterInstancedDrawable(const WorldInstancePtr& worldInstance, const InstancedRenderable* instancedRenderable) override; void UnregisterLight(Light* light) override; void UnregisterMaterialPass(MaterialPass* material) override; void UnregisterViewer(AbstractViewer* viewerInstance) override; ForwardFramePipeline& operator=(const ForwardFramePipeline&) = delete; ForwardFramePipeline& operator=(ForwardFramePipeline&&) = delete; private: BakedFrameGraph BuildFrameGraph(); struct ViewerData; struct LightData { std::shared_ptr light; UInt32 renderMask; NazaraSlot(Light, OnLightDataInvalided, onLightInvalidated); }; struct MaterialPassData { std::size_t usedCount = 0; NazaraSlot(MaterialPass, OnMaterialPassInvalidated, onMaterialPassInvalided); }; 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 ViewerData { std::size_t colorAttachment; std::size_t depthStencilAttachment; std::unique_ptr depthPrepass; std::unique_ptr forwardPass; Int32 renderOrder = 0; RenderQueueRegistry forwardRegistry; RenderQueue forwardRenderQueue; ShaderBindingPtr blitShaderBinding; }; std::size_t m_forwardPassIndex; std::unordered_map m_viewers; std::unordered_map m_lights; std::unordered_map m_activeMaterialPasses; std::unordered_map> m_renderables; std::unordered_map m_renderTargets; std::unordered_set m_invalidatedViewerInstances; std::unordered_set m_invalidatedMaterialPasses; std::unordered_set m_invalidatedWorldInstances; std::unordered_set m_removedWorldInstances; std::vector m_renderStates; std::vector m_visibleRenderables; std::vector m_visibleLights; BakedFrameGraph m_bakedFrameGraph; RenderFrame* m_currentRenderFrame; bool m_rebuildFrameGraph; }; } #include #endif // NAZARA_GRAPHICS_FORWARDFRAMEPIPELINE_HPP