diff --git a/SDK/include/NDK/Systems/RenderSystem.hpp b/SDK/include/NDK/Systems/RenderSystem.hpp index ff077278d..4b65de11d 100644 --- a/SDK/include/NDK/Systems/RenderSystem.hpp +++ b/SDK/include/NDK/Systems/RenderSystem.hpp @@ -8,7 +8,7 @@ #define NDK_SYSTEMS_RENDERSYSTEM_HPP #include -#include +#include #include #include #include @@ -25,11 +25,15 @@ namespace Ndk inline RenderSystem(const RenderSystem& renderSystem); ~RenderSystem() = default; + template void ChangeRenderTechnique(); + inline void ChangeRenderTechnique(std::unique_ptr&& renderTechnique); + inline const Nz::BackgroundRef& GetDefaultBackground() const; inline const Nz::Matrix4f& GetCoordinateSystemMatrix() const; inline Nz::Vector3f GetGlobalForward() const; inline Nz::Vector3f GetGlobalRight() const; inline Nz::Vector3f GetGlobalUp() const; + inline Nz::AbstractRenderTechnique& GetRenderTechnique() const; inline void SetDefaultBackground(Nz::BackgroundRef background); inline void SetGlobalForward(const Nz::Vector3f& direction); @@ -45,11 +49,11 @@ namespace Ndk void OnEntityValidation(Entity* entity, bool justAdded) override; void OnUpdate(float elapsedTime) override; + std::unique_ptr m_renderTechnique; EntityList m_cameras; EntityList m_drawables; EntityList m_lights; Nz::BackgroundRef m_background; - Nz::ForwardRenderTechnique m_renderTechnique; Nz::Matrix4f m_coordinateSystemMatrix; bool m_coordinateSystemInvalidated; }; diff --git a/SDK/include/NDK/Systems/RenderSystem.inl b/SDK/include/NDK/Systems/RenderSystem.inl index d0cb0af47..b85ace59f 100644 --- a/SDK/include/NDK/Systems/RenderSystem.inl +++ b/SDK/include/NDK/Systems/RenderSystem.inl @@ -9,6 +9,17 @@ namespace Ndk { } + template + inline void RenderSystem::ChangeRenderTechnique() + { + ChangeRenderTechnique(std::make_unique()); + } + + inline void RenderSystem::ChangeRenderTechnique(std::unique_ptr&& renderTechnique) + { + m_renderTechnique = std::move(renderTechnique); + } + inline const Nz::BackgroundRef& RenderSystem::GetDefaultBackground() const { return m_background; @@ -34,6 +45,11 @@ namespace Ndk return Nz::Vector3f(m_coordinateSystemMatrix.m12, m_coordinateSystemMatrix.m22, m_coordinateSystemMatrix.m32); } + inline Nz::AbstractRenderTechnique& RenderSystem::GetRenderTechnique() const + { + return *m_renderTechnique.get(); + } + inline void RenderSystem::SetDefaultBackground(Nz::BackgroundRef background) { m_background = std::move(background); diff --git a/SDK/src/NDK/Systems/RenderSystem.cpp b/SDK/src/NDK/Systems/RenderSystem.cpp index 7d7956a12..3237bbe52 100644 --- a/SDK/src/NDK/Systems/RenderSystem.cpp +++ b/SDK/src/NDK/Systems/RenderSystem.cpp @@ -15,6 +15,7 @@ namespace Ndk m_coordinateSystemMatrix(Nz::Matrix4f::Identity()), m_coordinateSystemInvalidated(true) { + ChangeRenderTechnique(); SetDefaultBackground(Nz::ColorBackground::New()); SetUpdateRate(0.f); } @@ -73,7 +74,7 @@ namespace Ndk CameraComponent& camComponent = camera->GetComponent(); camComponent.ApplyView(); - Nz::AbstractRenderQueue* renderQueue = m_renderTechnique.GetRenderQueue(); + Nz::AbstractRenderQueue* renderQueue = m_renderTechnique->GetRenderQueue(); renderQueue->Clear(); //TODO: Culling @@ -99,7 +100,8 @@ namespace Ndk sceneData.background = m_background; sceneData.viewer = &camComponent; - m_renderTechnique.Draw(sceneData); + m_renderTechnique->Clear(sceneData); + m_renderTechnique->Draw(sceneData); } } diff --git a/include/Nazara/Graphics/AbstractRenderTechnique.hpp b/include/Nazara/Graphics/AbstractRenderTechnique.hpp index 5f268275e..d13ac88ee 100644 --- a/include/Nazara/Graphics/AbstractRenderTechnique.hpp +++ b/include/Nazara/Graphics/AbstractRenderTechnique.hpp @@ -28,6 +28,7 @@ namespace Nz AbstractRenderTechnique(AbstractRenderTechnique&&) = default; virtual ~AbstractRenderTechnique(); + virtual void Clear(const SceneData& sceneData) const = 0; virtual bool Draw(const SceneData& sceneData) const = 0; virtual void EnableInstancing(bool instancing); diff --git a/include/Nazara/Graphics/DeferredRenderTechnique.hpp b/include/Nazara/Graphics/DeferredRenderTechnique.hpp index 5d371b94f..99d1fc813 100644 --- a/include/Nazara/Graphics/DeferredRenderTechnique.hpp +++ b/include/Nazara/Graphics/DeferredRenderTechnique.hpp @@ -32,6 +32,7 @@ namespace Nz DeferredRenderTechnique(); ~DeferredRenderTechnique(); + void Clear(const SceneData& sceneData) const override; bool Draw(const SceneData& sceneData) const override; void EnablePass(RenderPassType renderPass, int position, bool enable); diff --git a/include/Nazara/Graphics/ForwardRenderTechnique.hpp b/include/Nazara/Graphics/ForwardRenderTechnique.hpp index 920a6c0bd..6881ac2d7 100644 --- a/include/Nazara/Graphics/ForwardRenderTechnique.hpp +++ b/include/Nazara/Graphics/ForwardRenderTechnique.hpp @@ -24,6 +24,7 @@ namespace Nz ForwardRenderTechnique(); ~ForwardRenderTechnique() = default; + void Clear(const SceneData& sceneData) const override; bool Draw(const SceneData& sceneData) const override; unsigned int GetMaxLightPassPerObject() const; diff --git a/src/Nazara/Graphics/DeferredRenderTechnique.cpp b/src/Nazara/Graphics/DeferredRenderTechnique.cpp index 63342363c..88335d92b 100644 --- a/src/Nazara/Graphics/DeferredRenderTechnique.cpp +++ b/src/Nazara/Graphics/DeferredRenderTechnique.cpp @@ -120,7 +120,7 @@ namespace Nz for (unsigned int i = 0; i < 3; ++i) m_GBuffer[i] = Texture::New(); - + try { ErrorFlags errFlags(ErrorFlag_ThrowException); @@ -204,6 +204,11 @@ namespace Nz DeferredRenderTechnique::~DeferredRenderTechnique() = default; + void DeferredRenderTechnique::Clear(const SceneData& sceneData) const + { + NazaraUnused(sceneData); + } + bool DeferredRenderTechnique::Draw(const SceneData& sceneData) const { NazaraAssert(sceneData.viewer, "Invalid viewer"); diff --git a/src/Nazara/Graphics/ForwardRenderTechnique.cpp b/src/Nazara/Graphics/ForwardRenderTechnique.cpp index 36f6918fa..21423fdc8 100644 --- a/src/Nazara/Graphics/ForwardRenderTechnique.cpp +++ b/src/Nazara/Graphics/ForwardRenderTechnique.cpp @@ -49,18 +49,21 @@ namespace Nz m_spriteBuffer.Reset(VertexDeclaration::Get(VertexLayout_XYZ_Color_UV), &m_vertexBuffer); } - bool ForwardRenderTechnique::Draw(const SceneData& sceneData) const + void ForwardRenderTechnique::Clear(const SceneData& sceneData) const { - NazaraAssert(sceneData.viewer, "Invalid viewer"); - - m_renderQueue.Sort(sceneData.viewer); - Renderer::Enable(RendererParameter_DepthBuffer, true); Renderer::Enable(RendererParameter_DepthWrite, true); Renderer::Clear(RendererBuffer_Depth); if (sceneData.background) sceneData.background->Draw(sceneData.viewer); + } + + bool ForwardRenderTechnique::Draw(const SceneData& sceneData) const + { + NazaraAssert(sceneData.viewer, "Invalid viewer"); + + m_renderQueue.Sort(sceneData.viewer); for (auto& pair : m_renderQueue.layers) {