// Copyright (C) 2017 Jérôme Leclercq // 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_FORWARDFRAMEPIPELINE_HPP #define NAZARA_FORWARDFRAMEPIPELINE_HPP #include #include #include #include #include #include #include #include #include #include namespace Nz { 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(WorldInstance* worldInstance, const InstancedRenderable* instancedRenderable) override; void RegisterViewer(AbstractViewer* viewerInstance) override; void Render(RenderFrame& renderFrame) override; void UnregisterInstancedDrawable(WorldInstance* worldInstance, const InstancedRenderable* instancedRenderable) override; void UnregisterViewer(AbstractViewer* viewerInstance) override; ForwardFramePipeline& operator=(const ForwardFramePipeline&) = delete; ForwardFramePipeline& operator=(ForwardFramePipeline&&) = delete; private: BakedFrameGraph BuildFrameGraph(); void RegisterMaterial(Material* material); void UnregisterMaterial(Material* material); struct MaterialData { std::size_t usedCount = 0; NazaraSlot(Material, OnMaterialInvalidated, onMaterialInvalided); }; struct RenderableData { NazaraSlot(InstancedRenderable, OnMaterialInvalidated, onMaterialInvalidated); }; struct ViewerData { std::size_t colorAttachment; std::size_t depthStencilAttachment; ShaderBindingPtr blitShaderBinding; }; std::size_t m_forwardPass; std::unordered_map m_viewers; std::unordered_map m_materials; std::unordered_map> m_renderables; std::unordered_set m_invalidatedViewerInstances; std::unordered_set m_invalidatedMaterials; std::unordered_set m_invalidatedWorldInstances; BakedFrameGraph m_bakedFrameGraph; bool m_rebuildFrameGraph; bool m_rebuildForwardPass; }; } #include #endif