diff --git a/include/Nazara/Graphics/Camera.hpp b/include/Nazara/Graphics/Camera.hpp index 4b0590a76..268f2ffc5 100644 --- a/include/Nazara/Graphics/Camera.hpp +++ b/include/Nazara/Graphics/Camera.hpp @@ -45,7 +45,7 @@ namespace Nz inline float GetZFar() const; inline float GetZNear() const; - std::size_t RegisterPasses(const std::vector>& passes, FrameGraph& frameGraph) const override; + std::size_t RegisterPasses(const std::vector>& passes, FrameGraph& frameGraph, const FunctionRef& passCallback = nullptr) const override; inline void UpdateClearColor(Color color); inline void UpdateFOV(DegreeAnglef fov); diff --git a/include/Nazara/Graphics/DebugDrawPipelinePass.hpp b/include/Nazara/Graphics/DebugDrawPipelinePass.hpp index a25aac0eb..06bb55b71 100644 --- a/include/Nazara/Graphics/DebugDrawPipelinePass.hpp +++ b/include/Nazara/Graphics/DebugDrawPipelinePass.hpp @@ -8,6 +8,7 @@ #define NAZARA_GRAPHICS_DEBUGDRAWPIPELINEPASS_HPP #include +#include #include #include #include @@ -18,7 +19,6 @@ namespace Nz class FrameGraph; class FramePass; class FramePipeline; - class ParameterList; class RenderFrame; class NAZARA_GRAPHICS_API DebugDrawPipelinePass : public FramePipelinePass diff --git a/include/Nazara/Graphics/DepthPipelinePass.hpp b/include/Nazara/Graphics/DepthPipelinePass.hpp index dd9e6cca0..8904fc834 100644 --- a/include/Nazara/Graphics/DepthPipelinePass.hpp +++ b/include/Nazara/Graphics/DepthPipelinePass.hpp @@ -8,6 +8,7 @@ #define NAZARA_GRAPHICS_DEPTHPIPELINEPASS_HPP #include +#include #include #include #include diff --git a/include/Nazara/Graphics/Enums.hpp b/include/Nazara/Graphics/Enums.hpp index 66970f2fe..794ccf219 100644 --- a/include/Nazara/Graphics/Enums.hpp +++ b/include/Nazara/Graphics/Enums.hpp @@ -41,6 +41,20 @@ namespace Nz Volume }; + enum class EngineShaderBinding + { + InstanceDataUbo, + LightDataUbo, + OverlayTexture, + ShadowmapDirectional, + ShadowmapPoint, + ShadowmapSpot, + SkeletalDataUbo, + ViewerDataUbo, + + Max = ViewerDataUbo + }; + enum class FramePipelineNotification { ElementInvalidation, @@ -57,6 +71,21 @@ namespace Nz using FramePipelineNotificationFlags = Flags; + enum class FramePipelinePassFlag + { + LightShadowing, + + Max = LightShadowing + }; + + template<> + struct EnumAsFlags + { + static constexpr FramePipelinePassFlag max = FramePipelinePassFlag::Max; + }; + + using FramePipelinePassFlags = Flags; + enum class MaterialPropertyType { Bool, @@ -116,20 +145,6 @@ namespace Nz Orthographic, Perspective }; - - enum class EngineShaderBinding - { - InstanceDataUbo, - LightDataUbo, - OverlayTexture, - ShadowmapDirectional, - ShadowmapPoint, - ShadowmapSpot, - SkeletalDataUbo, - ViewerDataUbo, - - Max = ViewerDataUbo - }; } #endif // NAZARA_GRAPHICS_ENUMS_HPP diff --git a/include/Nazara/Graphics/ForwardPipelinePass.hpp b/include/Nazara/Graphics/ForwardPipelinePass.hpp index 14d3043c1..edb09260d 100644 --- a/include/Nazara/Graphics/ForwardPipelinePass.hpp +++ b/include/Nazara/Graphics/ForwardPipelinePass.hpp @@ -8,6 +8,7 @@ #define NAZARA_GRAPHICS_FORWARDPIPELINEPASS_HPP #include +#include #include #include #include diff --git a/include/Nazara/Graphics/PipelinePassList.hpp b/include/Nazara/Graphics/PipelinePassList.hpp index af8d24b4c..19c89b44b 100644 --- a/include/Nazara/Graphics/PipelinePassList.hpp +++ b/include/Nazara/Graphics/PipelinePassList.hpp @@ -10,9 +10,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -34,13 +36,16 @@ namespace Nz std::vector> BuildPasses(FramePipelinePass::PassData& passData) const; - std::size_t RegisterPasses(const std::vector>& passes, FrameGraph& frameGraph) const; + inline void EnablePassFlags(std::size_t passIndex, FramePipelinePassFlags flags); + + std::size_t RegisterPasses(const std::vector>& passes, FrameGraph& frameGraph, const FunctionRef& passCallback = nullptr) const; inline void SetFinalOutput(std::size_t attachmentIndex); - inline void SetPassInput(std::size_t passIndex, std::size_t inputIndex, std::size_t attachmentIndex); - inline void SetPassOutput(std::size_t passIndex, std::size_t outputIndex, std::size_t attachmentIndex); + inline void SetPassDepthStencilInput(std::size_t passIndex, std::size_t attachmentIndex); inline void SetPassDepthStencilOutput(std::size_t passIndex, std::size_t attachmentIndex); + inline void SetPassInput(std::size_t passIndex, std::size_t inputIndex, std::size_t attachmentIndex); + inline void SetPassOutput(std::size_t passIndex, std::size_t outputIndex, std::size_t attachmentIndex); PipelinePassList& operator=(const PipelinePassList&) = delete; PipelinePassList& operator=(PipelinePassList&&) = delete; @@ -52,12 +57,13 @@ namespace Nz struct Pass { - FixedVector inputs; - FixedVector outputs; std::size_t depthStencilInput = NoAttachment; std::size_t depthStencilOutput = NoAttachment; std::size_t implIndex; std::string name; + FixedVector inputs; + FixedVector outputs; + FramePipelinePassFlags flags; ParameterList parameterList; }; diff --git a/include/Nazara/Graphics/PipelinePassList.inl b/include/Nazara/Graphics/PipelinePassList.inl index 8af962078..5f0d5d5ff 100644 --- a/include/Nazara/Graphics/PipelinePassList.inl +++ b/include/Nazara/Graphics/PipelinePassList.inl @@ -26,6 +26,13 @@ namespace Nz return index; } + inline void PipelinePassList::EnablePassFlags(std::size_t passIndex, FramePipelinePassFlags flags) + { + assert(passIndex < m_passes.size()); + auto& pass = m_passes[passIndex]; + pass.flags = flags; + } + inline void PipelinePassList::SetFinalOutput(std::size_t attachmentIndex) { m_finalOutputAttachment = attachmentIndex; diff --git a/include/Nazara/Graphics/PipelineViewer.hpp b/include/Nazara/Graphics/PipelineViewer.hpp index f74bc5bbf..ca8e3349c 100644 --- a/include/Nazara/Graphics/PipelineViewer.hpp +++ b/include/Nazara/Graphics/PipelineViewer.hpp @@ -9,11 +9,15 @@ #include #include +#include #include +#include #include namespace Nz { + class FramePass; + class NAZARA_GRAPHICS_API PipelineViewer : public AbstractViewer { public: @@ -24,7 +28,7 @@ namespace Nz virtual std::vector> BuildPasses(FramePipelinePass::PassData& passData) const = 0; - virtual std::size_t RegisterPasses(const std::vector>& passes, FrameGraph& frameGraph) const = 0; + virtual std::size_t RegisterPasses(const std::vector>& passes, FrameGraph& frameGraph, const FunctionRef& passCallback = nullptr) const = 0; PipelineViewer& operator=(const PipelineViewer&) = delete; PipelineViewer& operator=(PipelineViewer&&) = delete; diff --git a/include/Nazara/Graphics/PostProcessPipelinePass.hpp b/include/Nazara/Graphics/PostProcessPipelinePass.hpp index 1d3a6f455..7e7d53bbe 100644 --- a/include/Nazara/Graphics/PostProcessPipelinePass.hpp +++ b/include/Nazara/Graphics/PostProcessPipelinePass.hpp @@ -8,6 +8,7 @@ #define NAZARA_GRAPHICS_POSTPROCESSPIPELINEPASS_HPP #include +#include #include #include #include @@ -17,7 +18,6 @@ namespace Nz class FrameGraph; class FramePass; class FramePipeline; - class ParameterList; class RenderFrame; class RenderPipeline; class ShaderBinding; diff --git a/src/Nazara/Graphics/Camera.cpp b/src/Nazara/Graphics/Camera.cpp index 056c77c8f..5ed16dbd4 100644 --- a/src/Nazara/Graphics/Camera.cpp +++ b/src/Nazara/Graphics/Camera.cpp @@ -55,10 +55,10 @@ namespace Nz return m_viewport; } - std::size_t Camera::RegisterPasses(const std::vector>& passes, FrameGraph& frameGraph) const + std::size_t Camera::RegisterPasses(const std::vector>& passes, FrameGraph& frameGraph, const FunctionRef& passCallback) const { assert(m_framePipelinePasses); - return m_framePipelinePasses->RegisterPasses(passes, frameGraph); + return m_framePipelinePasses->RegisterPasses(passes, frameGraph, passCallback); } void Camera::UpdateTarget(const RenderTarget* renderTarget) diff --git a/src/Nazara/Graphics/ForwardFramePipeline.cpp b/src/Nazara/Graphics/ForwardFramePipeline.cpp index e10f0b628..49eea9c0e 100644 --- a/src/Nazara/Graphics/ForwardFramePipeline.cpp +++ b/src/Nazara/Graphics/ForwardFramePipeline.cpp @@ -713,7 +713,20 @@ namespace Nz lightData->shadowData->RegisterToFrameGraph(frameGraph, viewerData.viewer); } - viewerData.finalColorAttachment = viewerData.viewer->RegisterPasses(viewerData.passes, frameGraph); + auto framePassCallback = [this, &viewerData, renderMask](std::size_t /*passIndex*/, FramePass& framePass, FramePipelinePassFlags flags) + { + if (flags.Test(FramePipelinePassFlag::LightShadowing)) + { + for (std::size_t i : m_shadowCastingLights.IterBits()) + { + LightData* lightData = m_lightPool.RetrieveFromIndex(i); + if ((renderMask & lightData->renderMask) != 0) + lightData->shadowData->RegisterPassInputs(framePass, (lightData->shadowData->IsPerViewer()) ? viewerData.viewer : nullptr); + } + } + }; + + viewerData.finalColorAttachment = viewerData.viewer->RegisterPasses(viewerData.passes, frameGraph, framePassCallback); } using ViewerPair = std::pair; diff --git a/src/Nazara/Graphics/Graphics.cpp b/src/Nazara/Graphics/Graphics.cpp index d65a75b06..8f0f8b231 100644 --- a/src/Nazara/Graphics/Graphics.cpp +++ b/src/Nazara/Graphics/Graphics.cpp @@ -390,6 +390,8 @@ namespace Nz m_defaultPipelinePasses->SetPassOutput(forwardPass, 0, forwardColorOutput); m_defaultPipelinePasses->SetPassDepthStencilOutput(forwardPass, forwardDepthOutput); + m_defaultPipelinePasses->EnablePassFlags(forwardPass, FramePipelinePassFlag::LightShadowing); + // Gamma correction std::size_t gammaCorrectionOutput = m_defaultPipelinePasses->AddAttachment({ "Gamma-corrected output", diff --git a/src/Nazara/Graphics/PipelinePassList.cpp b/src/Nazara/Graphics/PipelinePassList.cpp index 564ecc1b5..53277d7b3 100644 --- a/src/Nazara/Graphics/PipelinePassList.cpp +++ b/src/Nazara/Graphics/PipelinePassList.cpp @@ -22,7 +22,7 @@ namespace Nz return passes; } - std::size_t PipelinePassList::RegisterPasses(const std::vector>& passes, FrameGraph& frameGraph) const + std::size_t PipelinePassList::RegisterPasses(const std::vector>& passes, FrameGraph& frameGraph, const FunctionRef& passCallback) const { NazaraAssert(m_passes.size() == passes.size(), "pass vector size doesn't match passlist size"); @@ -39,17 +39,17 @@ namespace Nz return attachmentIndices[attachmentIndex]; }; - for (std::size_t i = 0; i < passes.size(); ++i) + for (std::size_t passIndex = 0; passIndex < passes.size(); ++passIndex) { - const Pass& passData = m_passes[i]; + const Pass& passData = m_passes[passIndex]; std::array inputs; - for (std::size_t j = 0; j < passData.inputs.size(); ++j) - inputs[j] = GetAttachmentIndex(passData.inputs[j]); + for (std::size_t i = 0; i < passData.inputs.size(); ++i) + inputs[i] = GetAttachmentIndex(passData.inputs[i]); std::array outputs; - for (std::size_t j = 0; j < passData.outputs.size(); ++j) - outputs[j] = GetAttachmentIndex(passData.outputs[j]); + for (std::size_t i = 0; i < passData.outputs.size(); ++i) + outputs[i] = GetAttachmentIndex(passData.outputs[i]); FramePipelinePass::PassInputOuputs passInputOuputs; passInputOuputs.depthStencilInput = GetAttachmentIndex(passData.depthStencilInput); @@ -59,7 +59,9 @@ namespace Nz passInputOuputs.outputAttachments = outputs.data(); passInputOuputs.outputCount = passData.outputs.size(); - passes[i]->RegisterToFrameGraph(frameGraph, passInputOuputs); + FramePass& framePass = passes[passIndex]->RegisterToFrameGraph(frameGraph, passInputOuputs); + if (passCallback) + passCallback(passIndex, framePass, passData.flags); } return GetAttachmentIndex(m_finalOutputAttachment);