Graphics: Make Background/RenderTechnique independent from Scene
Former-commit-id: d588a3bb74b08d79990a278ad2e399e9797755b4
This commit is contained in:
@@ -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());
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
#include <Nazara/Graphics/Drawable.hpp>
|
||||
#include <Nazara/Graphics/Light.hpp>
|
||||
#include <Nazara/Graphics/Material.hpp>
|
||||
#include <Nazara/Graphics/Scene.hpp>
|
||||
#include <Nazara/Graphics/Sprite.hpp>
|
||||
#include <Nazara/Renderer/Config.hpp>
|
||||
#include <Nazara/Renderer/Renderer.hpp>
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user