From 6f2f8d63907453373e5b53bcba25546b801ec92c Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 9 Jun 2015 00:26:13 +0200 Subject: [PATCH] Graphics: Make Background/RenderTechnique independent from Scene Former-commit-id: d588a3bb74b08d79990a278ad2e399e9797755b4 --- SDK/src/NDK/Systems/RenderSystem.cpp | 13 +++-- .../Nazara/Graphics/AbstractBackground.hpp | 4 +- .../Graphics/AbstractRenderTechnique.hpp | 7 ++- include/Nazara/Graphics/ColorBackground.hpp | 2 +- include/Nazara/Graphics/DeferredBloomPass.hpp | 2 +- include/Nazara/Graphics/DeferredDOFPass.hpp | 2 +- include/Nazara/Graphics/DeferredFXAAPass.hpp | 2 +- include/Nazara/Graphics/DeferredFinalPass.hpp | 2 +- include/Nazara/Graphics/DeferredFogPass.hpp | 2 +- .../Nazara/Graphics/DeferredForwardPass.hpp | 2 +- .../Nazara/Graphics/DeferredGeometryPass.hpp | 2 +- .../Graphics/DeferredPhongLightingPass.hpp | 2 +- .../Nazara/Graphics/DeferredRenderPass.hpp | 4 +- .../Graphics/DeferredRenderTechnique.hpp | 2 +- .../Graphics/ForwardRenderTechnique.hpp | 10 ++-- include/Nazara/Graphics/SceneData.hpp | 20 ++++++++ include/Nazara/Graphics/SkyboxBackground.hpp | 2 +- include/Nazara/Graphics/TextureBackground.hpp | 2 +- src/Nazara/Graphics/ColorBackground.cpp | 4 +- src/Nazara/Graphics/DeferredBloomPass.cpp | 5 +- src/Nazara/Graphics/DeferredDOFPass.cpp | 5 +- src/Nazara/Graphics/DeferredFXAAPass.cpp | 5 +- src/Nazara/Graphics/DeferredFinalPass.cpp | 6 ++- src/Nazara/Graphics/DeferredFogPass.cpp | 6 ++- src/Nazara/Graphics/DeferredForwardPass.cpp | 12 ++--- src/Nazara/Graphics/DeferredGeometryPass.cpp | 5 +- .../Graphics/DeferredPhongLightingPass.cpp | 10 ++-- .../Graphics/DeferredRenderTechnique.cpp | 6 +-- .../Graphics/ForwardRenderTechnique.cpp | 50 ++++++++++--------- src/Nazara/Graphics/Scene.cpp | 6 ++- src/Nazara/Graphics/SkyboxBackground.cpp | 4 +- src/Nazara/Graphics/TextureBackground.cpp | 4 +- 32 files changed, 124 insertions(+), 86 deletions(-) create mode 100644 include/Nazara/Graphics/SceneData.hpp diff --git a/SDK/src/NDK/Systems/RenderSystem.cpp b/SDK/src/NDK/Systems/RenderSystem.cpp index adda8cabf..3cb48f4bb 100644 --- a/SDK/src/NDK/Systems/RenderSystem.cpp +++ b/SDK/src/NDK/Systems/RenderSystem.cpp @@ -3,7 +3,7 @@ // For conditions of distribution and use, see copyright notice in Prerequesites.hpp #include -#include +#include #include #include #include @@ -21,9 +21,6 @@ namespace Ndk CameraComponent& camComponent = camera->GetComponent(); camComponent.ApplyView(); - NzScene dummyScene; - dummyScene.SetViewer(camComponent); - NzAbstractRenderQueue* renderQueue = m_renderTechnique.GetRenderQueue(); renderQueue->Clear(); @@ -35,7 +32,13 @@ namespace Ndk graphicsComponent.AddToRenderQueue(renderQueue, drawableNode.GetTransformMatrix()); } - m_renderTechnique.Draw(&dummyScene); + NzColorBackground background; + + NzSceneData sceneData; + sceneData.ambientColor = NzColor(25, 25, 25); + sceneData.background = &background; + + m_renderTechnique.Draw(&camComponent, sceneData); } } diff --git a/include/Nazara/Graphics/AbstractBackground.hpp b/include/Nazara/Graphics/AbstractBackground.hpp index 42471d504..e400719ee 100644 --- a/include/Nazara/Graphics/AbstractBackground.hpp +++ b/include/Nazara/Graphics/AbstractBackground.hpp @@ -10,7 +10,7 @@ #include #include -class NzScene; +class NzAbstractViewer; class NAZARA_API NzAbstractBackground { @@ -18,7 +18,7 @@ class NAZARA_API NzAbstractBackground NzAbstractBackground() = default; virtual ~NzAbstractBackground(); - virtual void Draw(const NzScene* scene) const = 0; + virtual void Draw(const NzAbstractViewer* viewer) const = 0; virtual nzBackgroundType GetBackgroundType() const = 0; }; diff --git a/include/Nazara/Graphics/AbstractRenderTechnique.hpp b/include/Nazara/Graphics/AbstractRenderTechnique.hpp index 9409cbc16..646e713f9 100644 --- a/include/Nazara/Graphics/AbstractRenderTechnique.hpp +++ b/include/Nazara/Graphics/AbstractRenderTechnique.hpp @@ -8,13 +8,16 @@ #define NAZARA_ABSTRACTRENDERTECHNIQUE_HPP #include +#include #include #include #include #include +#include +class NzAbstractViewer; class NzBackground; -class NzScene; +struct SceneData; class NAZARA_API NzAbstractRenderTechnique : NzNonCopyable { @@ -22,7 +25,7 @@ class NAZARA_API NzAbstractRenderTechnique : NzNonCopyable NzAbstractRenderTechnique(); virtual ~NzAbstractRenderTechnique(); - virtual bool Draw(const NzScene* scene) const = 0; + virtual bool Draw(const NzAbstractViewer* viewer, const NzSceneData& sceneData) const = 0; virtual void EnableInstancing(bool instancing); diff --git a/include/Nazara/Graphics/ColorBackground.hpp b/include/Nazara/Graphics/ColorBackground.hpp index d2418289a..acb3c5c32 100644 --- a/include/Nazara/Graphics/ColorBackground.hpp +++ b/include/Nazara/Graphics/ColorBackground.hpp @@ -17,7 +17,7 @@ class NAZARA_API NzColorBackground : public NzAbstractBackground public: NzColorBackground(const NzColor& color = NzColor::Black); - void Draw(const NzScene* scene) const; + void Draw(const NzAbstractViewer* viewer) const; nzBackgroundType GetBackgroundType() const; NzColor GetColor() const; diff --git a/include/Nazara/Graphics/DeferredBloomPass.hpp b/include/Nazara/Graphics/DeferredBloomPass.hpp index ae6b2ff65..f2539421f 100644 --- a/include/Nazara/Graphics/DeferredBloomPass.hpp +++ b/include/Nazara/Graphics/DeferredBloomPass.hpp @@ -27,7 +27,7 @@ class NAZARA_API NzDeferredBloomPass : public NzDeferredRenderPass float GetBrightThreshold() const; NzTexture* GetTexture(unsigned int i) const; - bool Process(const NzScene* scene, unsigned int firstWorkTexture, unsigned secondWorkTexture) const; + bool Process(const NzAbstractViewer* viewer, const NzSceneData& sceneData, unsigned int firstWorkTexture, unsigned secondWorkTexture) const; bool Resize(const NzVector2ui& dimensions); void SetBlurPassCount(unsigned int passCount); diff --git a/include/Nazara/Graphics/DeferredDOFPass.hpp b/include/Nazara/Graphics/DeferredDOFPass.hpp index d5c7bd298..bbcae2275 100644 --- a/include/Nazara/Graphics/DeferredDOFPass.hpp +++ b/include/Nazara/Graphics/DeferredDOFPass.hpp @@ -21,7 +21,7 @@ class NAZARA_API NzDeferredDOFPass : public NzDeferredRenderPass NzDeferredDOFPass(); virtual ~NzDeferredDOFPass(); - bool Process(const NzScene* scene, unsigned int firstWorkTexture, unsigned secondWorkTexture) const; + bool Process(const NzAbstractViewer* viewer, const NzSceneData& sceneData, unsigned int firstWorkTexture, unsigned secondWorkTexture) const; bool Resize(const NzVector2ui& dimensions); protected: diff --git a/include/Nazara/Graphics/DeferredFXAAPass.hpp b/include/Nazara/Graphics/DeferredFXAAPass.hpp index 662d89d5b..043518ba6 100644 --- a/include/Nazara/Graphics/DeferredFXAAPass.hpp +++ b/include/Nazara/Graphics/DeferredFXAAPass.hpp @@ -19,7 +19,7 @@ class NAZARA_API NzDeferredFXAAPass : public NzDeferredRenderPass NzDeferredFXAAPass(); virtual ~NzDeferredFXAAPass(); - bool Process(const NzScene* scene, unsigned int firstWorkTexture, unsigned secondWorkTexture) const; + bool Process(const NzAbstractViewer* viewer, const NzSceneData& sceneData, unsigned int firstWorkTexture, unsigned secondWorkTexture) const; protected: NzRenderStates m_states; diff --git a/include/Nazara/Graphics/DeferredFinalPass.hpp b/include/Nazara/Graphics/DeferredFinalPass.hpp index fb0990feb..1514a5c04 100644 --- a/include/Nazara/Graphics/DeferredFinalPass.hpp +++ b/include/Nazara/Graphics/DeferredFinalPass.hpp @@ -19,7 +19,7 @@ class NAZARA_API NzDeferredFinalPass : public NzDeferredRenderPass NzDeferredFinalPass(); virtual ~NzDeferredFinalPass(); - bool Process(const NzScene* scene, unsigned int firstWorkTexture, unsigned secondWorkTexture) const; + bool Process(const NzAbstractViewer* viewer, const NzSceneData& sceneData, unsigned int firstWorkTexture, unsigned secondWorkTexture) const; protected: NzRenderStates m_states; diff --git a/include/Nazara/Graphics/DeferredFogPass.hpp b/include/Nazara/Graphics/DeferredFogPass.hpp index fd4e831e2..1c03fe8d2 100644 --- a/include/Nazara/Graphics/DeferredFogPass.hpp +++ b/include/Nazara/Graphics/DeferredFogPass.hpp @@ -19,7 +19,7 @@ class NAZARA_API NzDeferredFogPass : public NzDeferredRenderPass NzDeferredFogPass(); virtual ~NzDeferredFogPass(); - bool Process(const NzScene* scene, unsigned int firstWorkTexture, unsigned secondWorkTexture) const; + bool Process(const NzAbstractViewer* viewer, const NzSceneData& sceneData, unsigned int firstWorkTexture, unsigned secondWorkTexture) const; protected: NzRenderStates m_states; diff --git a/include/Nazara/Graphics/DeferredForwardPass.hpp b/include/Nazara/Graphics/DeferredForwardPass.hpp index b0c561c93..824313d87 100644 --- a/include/Nazara/Graphics/DeferredForwardPass.hpp +++ b/include/Nazara/Graphics/DeferredForwardPass.hpp @@ -19,7 +19,7 @@ class NAZARA_API NzDeferredForwardPass : public NzDeferredRenderPass virtual ~NzDeferredForwardPass(); void Initialize(NzDeferredRenderTechnique* technique); - bool Process(const NzScene* scene, unsigned int workTexture, unsigned sceneTexture) const; + bool Process(const NzAbstractViewer* viewer, const NzSceneData& sceneData, unsigned int workTexture, unsigned sceneTexture) const; protected: const NzForwardRenderTechnique* m_forwardTechnique; diff --git a/include/Nazara/Graphics/DeferredGeometryPass.hpp b/include/Nazara/Graphics/DeferredGeometryPass.hpp index 40890cffb..bef3746e2 100644 --- a/include/Nazara/Graphics/DeferredGeometryPass.hpp +++ b/include/Nazara/Graphics/DeferredGeometryPass.hpp @@ -18,7 +18,7 @@ class NAZARA_API NzDeferredGeometryPass : public NzDeferredRenderPass NzDeferredGeometryPass(); virtual ~NzDeferredGeometryPass(); - bool Process(const NzScene* scene, unsigned int firstWorkTexture, unsigned secondWorkTexture) const; + bool Process(const NzAbstractViewer* viewer, const NzSceneData& sceneData, unsigned int firstWorkTexture, unsigned secondWorkTexture) const; bool Resize(const NzVector2ui& dimensions); protected: diff --git a/include/Nazara/Graphics/DeferredPhongLightingPass.hpp b/include/Nazara/Graphics/DeferredPhongLightingPass.hpp index 94f53ec2a..9da871fea 100644 --- a/include/Nazara/Graphics/DeferredPhongLightingPass.hpp +++ b/include/Nazara/Graphics/DeferredPhongLightingPass.hpp @@ -26,7 +26,7 @@ class NAZARA_API NzDeferredPhongLightingPass : public NzDeferredRenderPass bool IsLightMeshesDrawingEnabled() const; - bool Process(const NzScene* scene, unsigned int firstWorkTexture, unsigned secondWorkTexture) const; + bool Process(const NzAbstractViewer* viewer, const NzSceneData& sceneData, unsigned int firstWorkTexture, unsigned secondWorkTexture) const; protected: NzLightUniforms m_directionalLightUniforms; diff --git a/include/Nazara/Graphics/DeferredRenderPass.hpp b/include/Nazara/Graphics/DeferredRenderPass.hpp index a4dd5eaa5..24ca198a3 100644 --- a/include/Nazara/Graphics/DeferredRenderPass.hpp +++ b/include/Nazara/Graphics/DeferredRenderPass.hpp @@ -9,8 +9,10 @@ #include #include +#include #include +class NzAbstractViewer; class NzDeferredRenderTechnique; class NzDeferredRenderQueue; class NzRenderBuffer; @@ -32,7 +34,7 @@ class NAZARA_API NzDeferredRenderPass bool IsEnabled() const; - virtual bool Process(const NzScene* scene, unsigned int workTexture, unsigned sceneTexture) const = 0; + virtual bool Process(const NzAbstractViewer* viewer, const NzSceneData& sceneData, unsigned int workTexture, unsigned sceneTexture) const = 0; virtual bool Resize(const NzVector2ui& GBufferSize); protected: diff --git a/include/Nazara/Graphics/DeferredRenderTechnique.hpp b/include/Nazara/Graphics/DeferredRenderTechnique.hpp index 303486603..637dac881 100644 --- a/include/Nazara/Graphics/DeferredRenderTechnique.hpp +++ b/include/Nazara/Graphics/DeferredRenderTechnique.hpp @@ -30,7 +30,7 @@ class NAZARA_API NzDeferredRenderTechnique : public NzAbstractRenderTechnique NzDeferredRenderTechnique(); ~NzDeferredRenderTechnique(); - bool Draw(const NzScene* scene) const override; + bool Draw(const NzAbstractViewer* viewer, const NzSceneData& sceneData) const override; void EnablePass(nzRenderPassType renderPass, int position, bool enable); diff --git a/include/Nazara/Graphics/ForwardRenderTechnique.hpp b/include/Nazara/Graphics/ForwardRenderTechnique.hpp index 939d5138d..869b34583 100644 --- a/include/Nazara/Graphics/ForwardRenderTechnique.hpp +++ b/include/Nazara/Graphics/ForwardRenderTechnique.hpp @@ -21,7 +21,7 @@ class NAZARA_API NzForwardRenderTechnique : public NzAbstractRenderTechnique NzForwardRenderTechnique(); ~NzForwardRenderTechnique() = default; - bool Draw(const NzScene* scene) const override; + bool Draw(const NzAbstractViewer* viewer, const NzSceneData& sceneData) const override; unsigned int GetMaxLightPassPerObject() const; NzAbstractRenderQueue* GetRenderQueue() override; @@ -36,10 +36,10 @@ class NAZARA_API NzForwardRenderTechnique : public NzAbstractRenderTechnique struct ShaderUniforms; bool ChooseLights(const NzSpheref& object, bool includeDirectionalLights = true) const; - void DrawBasicSprites(const NzScene* scene) const; - void DrawBillboards(const NzScene* scene) const; - void DrawOpaqueModels(const NzScene* scene) const; - void DrawTransparentModels(const NzScene* scene) const; + void DrawBasicSprites(const NzAbstractViewer* viewer, const NzSceneData& sceneData) const; + void DrawBillboards(const NzAbstractViewer* viewer, const NzSceneData& sceneData) const; + void DrawOpaqueModels(const NzAbstractViewer* viewer, const NzSceneData& sceneData) const; + void DrawTransparentModels(const NzAbstractViewer* viewer, const NzSceneData& sceneData) const; const ShaderUniforms* GetShaderUniforms(const NzShader* shader) const; void OnShaderInvalidated(const NzShader* shader) const; void SendLightUniforms(const NzShader* shader, const NzLightUniforms& uniforms, unsigned int uniformOffset, unsigned int index) const; diff --git a/include/Nazara/Graphics/SceneData.hpp b/include/Nazara/Graphics/SceneData.hpp new file mode 100644 index 000000000..d13207fae --- /dev/null +++ b/include/Nazara/Graphics/SceneData.hpp @@ -0,0 +1,20 @@ +// Copyright (C) 2015 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_SCENEDATA_HPP +#define NAZARA_SCENEDATA_HPP + +#include + +class NzAbstractBackground; + +struct NzSceneData +{ + NzColor ambientColor; + NzAbstractBackground* background; +}; + +#endif // NAZARA_SCENEDATA_HPP diff --git a/include/Nazara/Graphics/SkyboxBackground.hpp b/include/Nazara/Graphics/SkyboxBackground.hpp index 97bc164c9..978aa3c51 100644 --- a/include/Nazara/Graphics/SkyboxBackground.hpp +++ b/include/Nazara/Graphics/SkyboxBackground.hpp @@ -22,7 +22,7 @@ class NAZARA_API NzSkyboxBackground : public NzAbstractBackground NzSkyboxBackground(NzTexture* cubemapTexture); ~NzSkyboxBackground(); - void Draw(const NzScene* scene) const; + void Draw(const NzAbstractViewer* viewer) const; nzBackgroundType GetBackgroundType() const; NzTexture* GetTexture() const; diff --git a/include/Nazara/Graphics/TextureBackground.hpp b/include/Nazara/Graphics/TextureBackground.hpp index e20ac25a2..6f0d6eea4 100644 --- a/include/Nazara/Graphics/TextureBackground.hpp +++ b/include/Nazara/Graphics/TextureBackground.hpp @@ -18,7 +18,7 @@ class NAZARA_API NzTextureBackground : public NzAbstractBackground NzTextureBackground(); NzTextureBackground(NzTexture* texture); - void Draw(const NzScene* scene) const; + void Draw(const NzAbstractViewer* viewer) const; nzBackgroundType GetBackgroundType() const; NzTexture* GetTexture() const; diff --git a/src/Nazara/Graphics/ColorBackground.cpp b/src/Nazara/Graphics/ColorBackground.cpp index 55c270a63..9b980e739 100644 --- a/src/Nazara/Graphics/ColorBackground.cpp +++ b/src/Nazara/Graphics/ColorBackground.cpp @@ -36,9 +36,9 @@ m_color(color) m_vertexDepthUniform = shader->GetUniformLocation("VertexDepth"); } -void NzColorBackground::Draw(const NzScene* scene) const +void NzColorBackground::Draw(const NzAbstractViewer* viewer) const { - NazaraUnused(scene); + NazaraUnused(viewer); static NzRenderStates states(BuildRenderStates()); diff --git a/src/Nazara/Graphics/DeferredBloomPass.cpp b/src/Nazara/Graphics/DeferredBloomPass.cpp index 045a58094..1883a3346 100644 --- a/src/Nazara/Graphics/DeferredBloomPass.cpp +++ b/src/Nazara/Graphics/DeferredBloomPass.cpp @@ -63,9 +63,10 @@ NzTexture* NzDeferredBloomPass::GetTexture(unsigned int i) const return m_bloomTextures[i]; } -bool NzDeferredBloomPass::Process(const NzScene* scene, unsigned int firstWorkTexture, unsigned secondWorkTexture) const +bool NzDeferredBloomPass::Process(const NzAbstractViewer* viewer, const NzSceneData& sceneData, unsigned int firstWorkTexture, unsigned secondWorkTexture) const { - NazaraUnused(scene); + NazaraUnused(viewer); + NazaraUnused(sceneData); NzRenderer::SetRenderStates(m_bloomStates); NzRenderer::SetTextureSampler(0, m_bilinearSampler); diff --git a/src/Nazara/Graphics/DeferredDOFPass.cpp b/src/Nazara/Graphics/DeferredDOFPass.cpp index bdc438820..06de07dfb 100644 --- a/src/Nazara/Graphics/DeferredDOFPass.cpp +++ b/src/Nazara/Graphics/DeferredDOFPass.cpp @@ -117,9 +117,10 @@ NzDeferredDOFPass::NzDeferredDOFPass() NzDeferredDOFPass::~NzDeferredDOFPass() = default; -bool NzDeferredDOFPass::Process(const NzScene* scene, unsigned int firstWorkTexture, unsigned secondWorkTexture) const +bool NzDeferredDOFPass::Process(const NzAbstractViewer* viewer, const NzSceneData& sceneData, unsigned int firstWorkTexture, unsigned secondWorkTexture) const { - NazaraUnused(scene); + NazaraUnused(viewer); + NazaraUnused(sceneData); NzRenderer::SetTextureSampler(0, m_pointSampler); NzRenderer::SetTextureSampler(1, m_bilinearSampler); diff --git a/src/Nazara/Graphics/DeferredFXAAPass.cpp b/src/Nazara/Graphics/DeferredFXAAPass.cpp index 0dac6fe16..09f8150c7 100644 --- a/src/Nazara/Graphics/DeferredFXAAPass.cpp +++ b/src/Nazara/Graphics/DeferredFXAAPass.cpp @@ -21,9 +21,10 @@ NzDeferredFXAAPass::NzDeferredFXAAPass() NzDeferredFXAAPass::~NzDeferredFXAAPass() = default; -bool NzDeferredFXAAPass::Process(const NzScene* scene, unsigned int firstWorkTexture, unsigned secondWorkTexture) const +bool NzDeferredFXAAPass::Process(const NzAbstractViewer* viewer, const NzSceneData& sceneData, unsigned int firstWorkTexture, unsigned secondWorkTexture) const { - NazaraUnused(scene); + NazaraUnused(viewer); + NazaraUnused(sceneData); m_workRTT->SetColorTarget(firstWorkTexture); NzRenderer::SetTarget(m_workRTT); diff --git a/src/Nazara/Graphics/DeferredFinalPass.cpp b/src/Nazara/Graphics/DeferredFinalPass.cpp index bbf73309f..d97058ffb 100644 --- a/src/Nazara/Graphics/DeferredFinalPass.cpp +++ b/src/Nazara/Graphics/DeferredFinalPass.cpp @@ -33,11 +33,13 @@ NzDeferredFinalPass::NzDeferredFinalPass() NzDeferredFinalPass::~NzDeferredFinalPass() = default; -bool NzDeferredFinalPass::Process(const NzScene* scene, unsigned int firstWorkTexture, unsigned secondWorkTexture) const +bool NzDeferredFinalPass::Process(const NzAbstractViewer* viewer, const NzSceneData& sceneData, unsigned int firstWorkTexture, unsigned secondWorkTexture) const { + NazaraUnused(viewer); + NazaraUnused(sceneData); NazaraUnused(firstWorkTexture); - scene->GetViewer()->ApplyView(); + viewer->ApplyView(); NzRenderer::SetRenderStates(m_states); NzRenderer::SetTexture(0, m_workTextures[secondWorkTexture]); diff --git a/src/Nazara/Graphics/DeferredFogPass.cpp b/src/Nazara/Graphics/DeferredFogPass.cpp index 143c05248..e2838e4f5 100644 --- a/src/Nazara/Graphics/DeferredFogPass.cpp +++ b/src/Nazara/Graphics/DeferredFogPass.cpp @@ -130,14 +130,16 @@ NzDeferredFogPass::NzDeferredFogPass() NzDeferredFogPass::~NzDeferredFogPass() = default; -bool NzDeferredFogPass::Process(const NzScene* scene, unsigned int firstWorkTexture, unsigned secondWorkTexture) const +bool NzDeferredFogPass::Process(const NzAbstractViewer* viewer, const NzSceneData& sceneData, unsigned int firstWorkTexture, unsigned secondWorkTexture) const { + NazaraUnused(sceneData); + m_workRTT->SetColorTarget(firstWorkTexture); NzRenderer::SetTarget(m_workRTT); NzRenderer::SetViewport(NzRecti(0, 0, m_dimensions.x, m_dimensions.y)); NzRenderer::SetShader(m_shader); - m_shader->SendVector(m_shaderEyePositionLocation, scene->GetViewer()->GetEyePosition()); + m_shader->SendVector(m_shaderEyePositionLocation, viewer->GetEyePosition()); NzRenderer::SetRenderStates(m_states); NzRenderer::SetTexture(0, m_workTextures[secondWorkTexture]); diff --git a/src/Nazara/Graphics/DeferredForwardPass.cpp b/src/Nazara/Graphics/DeferredForwardPass.cpp index b6c16971b..f17ec3ea0 100644 --- a/src/Nazara/Graphics/DeferredForwardPass.cpp +++ b/src/Nazara/Graphics/DeferredForwardPass.cpp @@ -21,24 +21,22 @@ void NzDeferredForwardPass::Initialize(NzDeferredRenderTechnique* technique) m_forwardTechnique = technique->GetForwardTechnique(); } -bool NzDeferredForwardPass::Process(const NzScene* scene, unsigned int workTexture, unsigned sceneTexture) const +bool NzDeferredForwardPass::Process(const NzAbstractViewer* viewer, const NzSceneData& sceneData, unsigned int workTexture, unsigned sceneTexture) const { + NazaraUnused(sceneData); NazaraUnused(workTexture); m_workRTT->SetColorTarget(sceneTexture); NzRenderer::SetTarget(m_workRTT); NzRenderer::SetViewport(NzRecti(0, 0, m_dimensions.x, m_dimensions.y)); - NzAbstractBackground* background = (scene->IsBackgroundEnabled()) ? scene->GetBackground() : nullptr; - if (background) - background->Draw(scene); - - NzAbstractViewer* viewer = scene->GetViewer(); + if (sceneData.background) + sceneData.background->Draw(viewer); NzRenderer::SetMatrix(nzMatrixType_Projection, viewer->GetProjectionMatrix()); NzRenderer::SetMatrix(nzMatrixType_View, viewer->GetViewMatrix()); - m_forwardTechnique->Draw(scene); + m_forwardTechnique->Draw(viewer, sceneData); return false; } diff --git a/src/Nazara/Graphics/DeferredGeometryPass.cpp b/src/Nazara/Graphics/DeferredGeometryPass.cpp index b5c3f2f81..7d6e44fef 100644 --- a/src/Nazara/Graphics/DeferredGeometryPass.cpp +++ b/src/Nazara/Graphics/DeferredGeometryPass.cpp @@ -29,12 +29,11 @@ NzDeferredGeometryPass::NzDeferredGeometryPass() NzDeferredGeometryPass::~NzDeferredGeometryPass() = default; -bool NzDeferredGeometryPass::Process(const NzScene* scene, unsigned int firstWorkTexture, unsigned secondWorkTexture) const +bool NzDeferredGeometryPass::Process(const NzAbstractViewer* viewer, const NzSceneData& sceneData, unsigned int firstWorkTexture, unsigned secondWorkTexture) const { NazaraUnused(firstWorkTexture); NazaraUnused(secondWorkTexture); - NzAbstractViewer* viewer = scene->GetViewer(); bool instancingEnabled = m_deferredTechnique->IsInstancingEnabled(); m_GBufferRTT->SetColorTargets({0, 1, 2}); // G-Buffer @@ -80,7 +79,7 @@ bool NzDeferredGeometryPass::Process(const NzScene* scene, unsigned int firstWor shaderUniforms = GetShaderUniforms(shader); // Couleur ambiante de la scène - shader->SendColor(shaderUniforms->sceneAmbient, scene->GetAmbientColor()); + shader->SendColor(shaderUniforms->sceneAmbient, sceneData.ambientColor); // Position de la caméra shader->SendVector(shaderUniforms->eyePosition, viewer->GetEyePosition()); diff --git a/src/Nazara/Graphics/DeferredPhongLightingPass.cpp b/src/Nazara/Graphics/DeferredPhongLightingPass.cpp index 8b9f55a9f..ea273b275 100644 --- a/src/Nazara/Graphics/DeferredPhongLightingPass.cpp +++ b/src/Nazara/Graphics/DeferredPhongLightingPass.cpp @@ -65,7 +65,7 @@ bool NzDeferredPhongLightingPass::IsLightMeshesDrawingEnabled() const return m_lightMeshesDrawing; } -bool NzDeferredPhongLightingPass::Process(const NzScene* scene, unsigned int firstWorkTexture, unsigned secondWorkTexture) const +bool NzDeferredPhongLightingPass::Process(const NzAbstractViewer* viewer, const NzSceneData& sceneData, unsigned int firstWorkTexture, unsigned secondWorkTexture) const { NazaraUnused(secondWorkTexture); @@ -97,8 +97,8 @@ bool NzDeferredPhongLightingPass::Process(const NzScene* scene, unsigned int fir { NzRenderer::SetRenderStates(lightStates); NzRenderer::SetShader(m_directionalLightShader); - m_directionalLightShader->SendColor(m_directionalLightShaderSceneAmbientLocation, scene->GetAmbientColor()); - m_directionalLightShader->SendVector(m_directionalLightShaderEyePositionLocation, scene->GetViewer()->GetEyePosition()); + m_directionalLightShader->SendColor(m_directionalLightShaderSceneAmbientLocation, sceneData.ambientColor); + m_directionalLightShader->SendVector(m_directionalLightShaderEyePositionLocation, viewer->GetEyePosition()); for (auto& light : m_renderQueue->directionalLights) { @@ -130,8 +130,8 @@ bool NzDeferredPhongLightingPass::Process(const NzScene* scene, unsigned int fir NzRenderer::SetRenderStates(lightStates); NzRenderer::SetShader(m_pointSpotLightShader); - m_pointSpotLightShader->SendColor(m_pointSpotLightShaderSceneAmbientLocation, scene->GetAmbientColor()); - m_pointSpotLightShader->SendVector(m_pointSpotLightShaderEyePositionLocation, scene->GetViewer()->GetEyePosition()); + m_pointSpotLightShader->SendColor(m_pointSpotLightShaderSceneAmbientLocation, sceneData.ambientColor); + m_pointSpotLightShader->SendVector(m_pointSpotLightShaderEyePositionLocation, viewer->GetEyePosition()); NzMatrix4f lightMatrix; lightMatrix.MakeIdentity(); diff --git a/src/Nazara/Graphics/DeferredRenderTechnique.cpp b/src/Nazara/Graphics/DeferredRenderTechnique.cpp index e44bb82a8..610317392 100644 --- a/src/Nazara/Graphics/DeferredRenderTechnique.cpp +++ b/src/Nazara/Graphics/DeferredRenderTechnique.cpp @@ -203,9 +203,9 @@ m_GBufferSize(0U) NzDeferredRenderTechnique::~NzDeferredRenderTechnique() = default; -bool NzDeferredRenderTechnique::Draw(const NzScene* scene) const +bool NzDeferredRenderTechnique::Draw(const NzAbstractViewer* viewer, const NzSceneData& sceneData) const { - NzRecti viewerViewport = scene->GetViewer()->GetViewport(); + NzRecti viewerViewport = viewer->GetViewport(); NzVector2ui viewportDimensions(viewerViewport.width, viewerViewport.height); if (viewportDimensions != m_GBufferSize) @@ -226,7 +226,7 @@ bool NzDeferredRenderTechnique::Draw(const NzScene* scene) const const NzDeferredRenderPass* pass = passIt2.second.get(); if (pass->IsEnabled()) { - if (pass->Process(scene, workTexture, sceneTexture)) + if (pass->Process(viewer, sceneData, workTexture, sceneTexture)) std::swap(workTexture, sceneTexture); } } diff --git a/src/Nazara/Graphics/ForwardRenderTechnique.cpp b/src/Nazara/Graphics/ForwardRenderTechnique.cpp index 35c379ba3..1d966abb7 100644 --- a/src/Nazara/Graphics/ForwardRenderTechnique.cpp +++ b/src/Nazara/Graphics/ForwardRenderTechnique.cpp @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -48,29 +47,30 @@ m_maxLightPassPerObject(3) m_spriteBuffer.Reset(NzVertexDeclaration::Get(nzVertexLayout_XYZ_Color_UV), &m_vertexBuffer); } -bool NzForwardRenderTechnique::Draw(const NzScene* scene) const +bool NzForwardRenderTechnique::Draw(const NzAbstractViewer* viewer, const NzSceneData& sceneData) const { - m_renderQueue.Sort(scene->GetViewer()); + NazaraAssert(viewer, "Invalid viewer"); + + m_renderQueue.Sort(viewer); NzRenderer::Enable(nzRendererParameter_DepthBuffer, true); NzRenderer::Enable(nzRendererParameter_DepthWrite, true); NzRenderer::Clear(nzRendererBuffer_Depth); - NzAbstractBackground* background = (scene->IsBackgroundEnabled()) ? scene->GetBackground() : nullptr; - if (background) - background->Draw(scene); + if (sceneData.background) + sceneData.background->Draw(viewer); if (!m_renderQueue.opaqueModels.empty()) - DrawOpaqueModels(scene); + DrawOpaqueModels(viewer, sceneData); if (!m_renderQueue.transparentModels.empty()) - DrawTransparentModels(scene); + DrawTransparentModels(viewer, sceneData); if (!m_renderQueue.basicSprites.empty()) - DrawBasicSprites(scene); + DrawBasicSprites(viewer, sceneData); if (!m_renderQueue.billboards.empty()) - DrawBillboards(scene); + DrawBillboards(viewer, sceneData); // Les autres drawables (Exemple: Terrain) for (const NzDrawable* drawable : m_renderQueue.otherDrawables) @@ -201,9 +201,10 @@ bool NzForwardRenderTechnique::ChooseLights(const NzSpheref& object, bool includ }); } -void NzForwardRenderTechnique::DrawBasicSprites(const NzScene* scene) const +void NzForwardRenderTechnique::DrawBasicSprites(const NzAbstractViewer* viewer, const NzSceneData& sceneData) const { - NzAbstractViewer* viewer = scene->GetViewer(); + NazaraAssert(viewer, "Invalid viewer"); + const NzShader* lastShader = nullptr; const ShaderUniforms* shaderUniforms = nullptr; @@ -249,7 +250,7 @@ void NzForwardRenderTechnique::DrawBasicSprites(const NzScene* scene) const shaderUniforms = GetShaderUniforms(shader); // Couleur ambiante de la scène - shader->SendColor(shaderUniforms->sceneAmbient, scene->GetAmbientColor()); + shader->SendColor(shaderUniforms->sceneAmbient, sceneData.ambientColor); // Overlay shader->SendInteger(shaderUniforms->textureOverlay, overlayUnit); // Position de la caméra @@ -306,9 +307,10 @@ void NzForwardRenderTechnique::DrawBasicSprites(const NzScene* scene) const } } -void NzForwardRenderTechnique::DrawBillboards(const NzScene* scene) const +void NzForwardRenderTechnique::DrawBillboards(const NzAbstractViewer* viewer, const NzSceneData& sceneData) const { - NzAbstractViewer* viewer = scene->GetViewer(); + NazaraAssert(viewer, "Invalid viewer"); + const NzShader* lastShader = nullptr; const ShaderUniforms* shaderUniforms = nullptr; @@ -338,7 +340,7 @@ void NzForwardRenderTechnique::DrawBillboards(const NzScene* scene) const shaderUniforms = GetShaderUniforms(shader); // Couleur ambiante de la scène - shader->SendColor(shaderUniforms->sceneAmbient, scene->GetAmbientColor()); + shader->SendColor(shaderUniforms->sceneAmbient, sceneData.ambientColor); // Position de la caméra shader->SendVector(shaderUniforms->eyePosition, viewer->GetEyePosition()); @@ -384,7 +386,7 @@ void NzForwardRenderTechnique::DrawBillboards(const NzScene* scene) const if (shader != lastShader) { // Couleur ambiante de la scène - shader->SendColor(shaderUniforms->sceneAmbient, scene->GetAmbientColor()); + shader->SendColor(shaderUniforms->sceneAmbient, sceneData.ambientColor); // Position de la caméra shader->SendVector(shaderUniforms->eyePosition, viewer->GetEyePosition()); @@ -447,9 +449,10 @@ void NzForwardRenderTechnique::DrawBillboards(const NzScene* scene) const } } -void NzForwardRenderTechnique::DrawOpaqueModels(const NzScene* scene) const +void NzForwardRenderTechnique::DrawOpaqueModels(const NzAbstractViewer* viewer, const NzSceneData& sceneData) const { - NzAbstractViewer* viewer = scene->GetViewer(); + NazaraAssert(viewer, "Invalid viewer"); + const NzShader* lastShader = nullptr; const ShaderUniforms* shaderUniforms = nullptr; @@ -481,7 +484,7 @@ void NzForwardRenderTechnique::DrawOpaqueModels(const NzScene* scene) const shaderUniforms = GetShaderUniforms(shader); // Couleur ambiante de la scène - shader->SendColor(shaderUniforms->sceneAmbient, scene->GetAmbientColor()); + shader->SendColor(shaderUniforms->sceneAmbient, sceneData.ambientColor); // Position de la caméra shader->SendVector(shaderUniforms->eyePosition, viewer->GetEyePosition()); @@ -649,9 +652,10 @@ void NzForwardRenderTechnique::DrawOpaqueModels(const NzScene* scene) const } } -void NzForwardRenderTechnique::DrawTransparentModels(const NzScene* scene) const +void NzForwardRenderTechnique::DrawTransparentModels(const NzAbstractViewer* viewer, const NzSceneData& sceneData) const { - NzAbstractViewer* viewer = scene->GetViewer(); + NazaraAssert(viewer, "Invalid viewer"); + const NzShader* lastShader = nullptr; const ShaderUniforms* shaderUniforms = nullptr; unsigned int lightCount = 0; @@ -673,7 +677,7 @@ void NzForwardRenderTechnique::DrawTransparentModels(const NzScene* scene) const shaderUniforms = GetShaderUniforms(shader); // Couleur ambiante de la scène - shader->SendColor(shaderUniforms->sceneAmbient, scene->GetAmbientColor()); + shader->SendColor(shaderUniforms->sceneAmbient, sceneData.ambientColor); // Position de la caméra shader->SendVector(shaderUniforms->eyePosition, viewer->GetEyePosition()); diff --git a/src/Nazara/Graphics/Scene.cpp b/src/Nazara/Graphics/Scene.cpp index 344cf863c..48e8dd9a6 100644 --- a/src/Nazara/Graphics/Scene.cpp +++ b/src/Nazara/Graphics/Scene.cpp @@ -70,8 +70,12 @@ void NzScene::Draw() try { + NzSceneData sceneData; + sceneData.ambientColor = m_ambientColor; + sceneData.background = (m_backgroundEnabled) ? m_background.get() : nullptr; + NzErrorFlags errFlags(nzErrorFlag_ThrowException, true); - m_renderTechnique->Draw(this); + m_renderTechnique->Draw(m_viewer, sceneData); } catch (const std::exception& e) { diff --git a/src/Nazara/Graphics/SkyboxBackground.cpp b/src/Nazara/Graphics/SkyboxBackground.cpp index ba806d76b..e9e14ba56 100644 --- a/src/Nazara/Graphics/SkyboxBackground.cpp +++ b/src/Nazara/Graphics/SkyboxBackground.cpp @@ -219,12 +219,10 @@ NzSkyboxBackground::~NzSkyboxBackground() s_vertexBuffer = nullptr; } -void NzSkyboxBackground::Draw(const NzScene* scene) const +void NzSkyboxBackground::Draw(const NzAbstractViewer* viewer) const { static NzRenderStates states(BuildRenderStates()); - NzAbstractViewer* viewer = scene->GetViewer(); - NzMatrix4f skyboxMatrix(viewer->GetViewMatrix()); skyboxMatrix.SetTranslation(NzVector3f::Zero()); diff --git a/src/Nazara/Graphics/TextureBackground.cpp b/src/Nazara/Graphics/TextureBackground.cpp index 8db2a379a..3d5664a18 100644 --- a/src/Nazara/Graphics/TextureBackground.cpp +++ b/src/Nazara/Graphics/TextureBackground.cpp @@ -45,9 +45,9 @@ NzTextureBackground() m_texture = texture; } -void NzTextureBackground::Draw(const NzScene* scene) const +void NzTextureBackground::Draw(const NzAbstractViewer* viewer) const { - NazaraUnused(scene); + NazaraUnused(viewer); static NzRenderStates states(BuildRenderStates());