Added RenderStates

Former-commit-id: c742cf2fc1cac807b9e2bcbd88c2b3d77327c106
This commit is contained in:
Lynix 2013-06-17 23:58:45 +02:00
parent 84cb7cb731
commit 7a45ff4884
8 changed files with 284 additions and 192 deletions

View File

@ -14,6 +14,7 @@
#include <Nazara/Core/ResourceRef.hpp> #include <Nazara/Core/ResourceRef.hpp>
#include <Nazara/Core/String.hpp> #include <Nazara/Core/String.hpp>
#include <Nazara/Renderer/Enums.hpp> #include <Nazara/Renderer/Enums.hpp>
#include <Nazara/Renderer/RenderStates.hpp>
#include <Nazara/Renderer/Shader.hpp> #include <Nazara/Renderer/Shader.hpp>
#include <Nazara/Renderer/Texture.hpp> #include <Nazara/Renderer/Texture.hpp>
#include <Nazara/Renderer/TextureSampler.hpp> #include <Nazara/Renderer/TextureSampler.hpp>
@ -44,16 +45,16 @@ class NAZARA_API NzMaterial : public NzResource
void Apply(const NzShader* shader) const; void Apply(const NzShader* shader) const;
void EnableAlphaBlending(bool alphaBlending); void EnableAlphaBlending(bool blending);
void EnableFaceCulling(bool faceCulling); void EnableFaceCulling(bool faceCulling);
void EnableLighting(bool lighting); void EnableLighting(bool lighting);
void EnableZBuffer(bool zBuffer); void EnableZBuffer(bool zBuffer);
void EnableZWrite(bool zWrite); void EnableZWrite(bool zWrite);
NzColor GetAmbientColor() const; NzColor GetAmbientColor() const;
NzTexture* GetAlphaMap() const;
const NzShader* GetCustomShader() const; const NzShader* GetCustomShader() const;
NzColor GetDiffuseColor() const; NzColor GetDiffuseColor() const;
NzTexture* GetAlphaMap() const;
NzTexture* GetDiffuseMap() const; NzTexture* GetDiffuseMap() const;
NzTextureSampler& GetDiffuseSampler(); NzTextureSampler& GetDiffuseSampler();
const NzTextureSampler& GetDiffuseSampler() const; const NzTextureSampler& GetDiffuseSampler() const;
@ -119,15 +120,11 @@ class NAZARA_API NzMaterial : public NzResource
private: private:
void Copy(const NzMaterial& material); void Copy(const NzMaterial& material);
nzBlendFunc m_dstBlend;
nzBlendFunc m_srcBlend;
nzFaceCulling m_faceCulling;
nzFaceFilling m_faceFilling;
nzRendererComparison m_zTestCompareFunc;
nzUInt32 m_shaderFlags; nzUInt32 m_shaderFlags;
NzColor m_ambientColor; NzColor m_ambientColor;
NzColor m_diffuseColor; NzColor m_diffuseColor;
NzColor m_specularColor; NzColor m_specularColor;
NzRenderStates m_states;
NzTextureSampler m_diffuseSampler; NzTextureSampler m_diffuseSampler;
NzTextureSampler m_specularSampler; NzTextureSampler m_specularSampler;
mutable NzShaderConstRef m_customShader; mutable NzShaderConstRef m_customShader;
@ -137,11 +134,7 @@ class NAZARA_API NzMaterial : public NzResource
NzTextureRef m_heightMap; NzTextureRef m_heightMap;
NzTextureRef m_normalMap; NzTextureRef m_normalMap;
NzTextureRef m_specularMap; NzTextureRef m_specularMap;
bool m_alphaBlendingEnabled;
bool m_faceCullingEnabled;
bool m_lightingEnabled; bool m_lightingEnabled;
bool m_zBufferEnabled;
bool m_zWriteEnabled;
float m_shininess; float m_shininess;
static NzMaterialLoader::LoaderList s_loaders; static NzMaterialLoader::LoaderList s_loaders;

View File

@ -15,6 +15,7 @@
#include <Nazara/Core/String.hpp> #include <Nazara/Core/String.hpp>
#include <Nazara/Utility/Enums.hpp> #include <Nazara/Utility/Enums.hpp>
#include <Nazara/Renderer/Enums.hpp> #include <Nazara/Renderer/Enums.hpp>
#include <Nazara/Renderer/RenderStates.hpp>
// Inclusion des extensions // Inclusion des extensions
#include <GL3/glext.h> #include <GL3/glext.h>
@ -65,6 +66,8 @@ class NAZARA_API NzOpenGL
NzOpenGL() = delete; NzOpenGL() = delete;
~NzOpenGL() = delete; ~NzOpenGL() = delete;
static void ApplyStates(const NzRenderStates& states);
static void BindBuffer(nzBufferType type, GLuint id); static void BindBuffer(nzBufferType type, GLuint id);
static void BindProgram(GLuint id); static void BindProgram(GLuint id);
static void BindTexture(nzImageType type, GLuint id); static void BindTexture(nzImageType type, GLuint id);

View File

@ -0,0 +1,38 @@
// Copyright (C) 2013 Jérôme Leclercq
// This file is part of the "Nazara Engine - Renderer module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#pragma once
#ifndef NAZARA_RENDERSTATES_HPP
#define NAZARA_RENDERSTATES_HPP
#include <Nazara/Renderer/Enums.hpp>
struct NzRenderStates
{
NzRenderStates();
NzRenderStates(const NzRenderStates& states);
~NzRenderStates() = default;
NzRenderStates& operator=(const NzRenderStates& states);
nzBlendFunc dstBlend;
nzBlendFunc srcBlend;
nzFaceCulling faceCulling;
nzFaceFilling faceFilling;
nzRendererComparison depthFunc;
nzRendererComparison stencilCompare;
nzStencilOperation stencilFail;
nzStencilOperation stencilPass;
nzStencilOperation stencilZFail;
nzUInt32 stencilMask;
bool parameters[nzRendererParameter_Max+1];
float lineWidth;
float pointSize;
unsigned int stencilReference;
};
#include <Nazara/Renderer/RenderStates.inl>
#endif // NAZARA_RENDERSTATES_HPP

View File

@ -0,0 +1,44 @@
// Copyright (C) 2013 Jérôme Leclercq
// This file is part of the "Nazara Engine - Renderer module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <cstring>
#include <Nazara/Renderer/Debug.hpp>
inline NzRenderStates::NzRenderStates() :
dstBlend(nzBlendFunc_Zero),
srcBlend(nzBlendFunc_One),
faceCulling(nzFaceCulling_Back),
faceFilling(nzFaceFilling_Fill),
depthFunc(nzRendererComparison_Less),
stencilCompare(nzRendererComparison_Always),
stencilFail(nzStencilOperation_Keep),
stencilPass(nzStencilOperation_Keep),
stencilZFail(nzStencilOperation_Keep),
stencilMask(0xFFFFFFFF),
lineWidth(1.f),
pointSize(1.f),
stencilReference(0)
{
parameters[nzRendererParameter_Blend] = false;
parameters[nzRendererParameter_ColorWrite] = true;
parameters[nzRendererParameter_DepthBuffer] = false;
parameters[nzRendererParameter_DepthWrite] = true;
parameters[nzRendererParameter_FaceCulling] = false;
parameters[nzRendererParameter_ScissorTest] = false;
parameters[nzRendererParameter_StencilTest] = false;
}
inline NzRenderStates::NzRenderStates(const NzRenderStates& states)
{
std::memcpy(this, &states, sizeof(NzRenderStates));
}
inline NzRenderStates& NzRenderStates::operator=(const NzRenderStates& states)
{
std::memcpy(this, &states, sizeof(NzRenderStates));
return *this;
}
#include <Nazara/Renderer/DebugOff.hpp>

View File

@ -12,6 +12,7 @@
#include <Nazara/Math/Matrix4.hpp> #include <Nazara/Math/Matrix4.hpp>
#include <Nazara/Math/Rect.hpp> #include <Nazara/Math/Rect.hpp>
#include <Nazara/Renderer/Enums.hpp> #include <Nazara/Renderer/Enums.hpp>
#include <Nazara/Renderer/RenderStates.hpp>
#include <Nazara/Renderer/TextureSampler.hpp> #include <Nazara/Renderer/TextureSampler.hpp>
#include <Nazara/Utility/Enums.hpp> #include <Nazara/Utility/Enums.hpp>
@ -53,6 +54,7 @@ class NAZARA_API NzRenderer
static unsigned int GetMaxRenderTargets(); static unsigned int GetMaxRenderTargets();
static unsigned int GetMaxTextureUnits(); static unsigned int GetMaxTextureUnits();
static float GetPointSize(); static float GetPointSize();
static const NzRenderStates& GetRenderStates();
static NzRectui GetScissorRect(); static NzRectui GetScissorRect();
static const NzShader* GetShader(); static const NzShader* GetShader();
static const NzRenderTarget* GetTarget(); static const NzRenderTarget* GetTarget();
@ -65,7 +67,7 @@ class NAZARA_API NzRenderer
static bool IsEnabled(nzRendererParameter parameter); static bool IsEnabled(nzRendererParameter parameter);
static bool IsInitialized(); static bool IsInitialized();
static void SetBlendFunc(nzBlendFunc srcBlend, nzBlendFunc destBlend); static void SetBlendFunc(nzBlendFunc srcBlend, nzBlendFunc dstBlend);
static void SetClearColor(const NzColor& color); static void SetClearColor(const NzColor& color);
static void SetClearColor(nzUInt8 r, nzUInt8 g, nzUInt8 b, nzUInt8 a = 255); static void SetClearColor(nzUInt8 r, nzUInt8 g, nzUInt8 b, nzUInt8 a = 255);
static void SetClearDepth(double depth); static void SetClearDepth(double depth);
@ -78,6 +80,7 @@ class NAZARA_API NzRenderer
static void SetLineWidth(float size); static void SetLineWidth(float size);
static void SetMatrix(nzMatrixType type, const NzMatrix4f& matrix); static void SetMatrix(nzMatrixType type, const NzMatrix4f& matrix);
static void SetPointSize(float size); static void SetPointSize(float size);
static void SetRenderStates(const NzRenderStates& states);
static void SetScissorRect(const NzRectui& viewport); static void SetScissorRect(const NzRectui& viewport);
static void SetShader(const NzShader* shader); static void SetShader(const NzShader* shader);
static void SetStencilCompareFunction(nzRendererComparison compareFunc); static void SetStencilCompareFunction(nzRendererComparison compareFunc);

View File

@ -137,42 +137,17 @@ void NzMaterial::Apply(const NzShader* shader) const
} }
} }
if (m_alphaBlendingEnabled) NzRenderer::SetRenderStates(m_states);
{
NzRenderer::Enable(nzRendererParameter_Blend, true);
NzRenderer::SetBlendFunc(m_srcBlend, m_dstBlend);
}
else
NzRenderer::Enable(nzRendererParameter_Blend, false);
if (m_faceCullingEnabled)
{
NzRenderer::Enable(nzRendererParameter_FaceCulling, true);
NzRenderer::SetFaceCulling(m_faceCulling);
}
else
NzRenderer::Enable(nzRendererParameter_FaceCulling, false);
NzRenderer::SetFaceFilling(m_faceFilling);
if (m_zBufferEnabled)
{
NzRenderer::Enable(nzRendererParameter_DepthBuffer, true);
NzRenderer::Enable(nzRendererParameter_DepthWrite, m_zWriteEnabled);
NzRenderer::SetDepthFunc(m_zTestCompareFunc);
}
else
NzRenderer::Enable(nzRendererParameter_DepthBuffer, false);
} }
void NzMaterial::EnableAlphaBlending(bool alphaBlending) void NzMaterial::EnableAlphaBlending(bool blending)
{ {
m_alphaBlendingEnabled = alphaBlending; m_states.parameters[nzRendererParameter_Blend] = blending;
} }
void NzMaterial::EnableFaceCulling(bool faceCulling) void NzMaterial::EnableFaceCulling(bool faceCulling)
{ {
m_faceCullingEnabled = faceCulling; m_states.parameters[nzRendererParameter_FaceCulling] = faceCulling;
} }
void NzMaterial::EnableLighting(bool lighting) void NzMaterial::EnableLighting(bool lighting)
@ -186,12 +161,12 @@ void NzMaterial::EnableLighting(bool lighting)
void NzMaterial::EnableZBuffer(bool zBuffer) void NzMaterial::EnableZBuffer(bool zBuffer)
{ {
m_zBufferEnabled = zBuffer; m_states.parameters[nzRendererParameter_DepthBuffer] = zBuffer;
} }
void NzMaterial::EnableZWrite(bool zWrite) void NzMaterial::EnableZWrite(bool zWrite)
{ {
m_zWriteEnabled = zWrite; m_states.parameters[nzRendererParameter_DepthWrite] = zWrite;
} }
NzColor NzMaterial::GetAmbientColor() const NzColor NzMaterial::GetAmbientColor() const
@ -199,6 +174,16 @@ NzColor NzMaterial::GetAmbientColor() const
return m_ambientColor; return m_ambientColor;
} }
NzTexture* NzMaterial::GetAlphaMap() const
{
return m_alphaMap;
}
const NzShader* NzMaterial::GetCustomShader() const
{
return m_customShader;
}
NzColor NzMaterial::GetDiffuseColor() const NzColor NzMaterial::GetDiffuseColor() const
{ {
return m_diffuseColor; return m_diffuseColor;
@ -221,7 +206,7 @@ NzTexture* NzMaterial::GetDiffuseMap() const
nzBlendFunc NzMaterial::GetDstBlend() const nzBlendFunc NzMaterial::GetDstBlend() const
{ {
return m_dstBlend; return m_states.dstBlend;
} }
NzTexture* NzMaterial::GetEmissiveMap() const NzTexture* NzMaterial::GetEmissiveMap() const
@ -231,12 +216,12 @@ NzTexture* NzMaterial::GetEmissiveMap() const
nzFaceCulling NzMaterial::GetFaceCulling() const nzFaceCulling NzMaterial::GetFaceCulling() const
{ {
return m_faceCulling; return m_states.faceCulling;
} }
nzFaceFilling NzMaterial::GetFaceFilling() const nzFaceFilling NzMaterial::GetFaceFilling() const
{ {
return m_faceFilling; return m_states.faceFilling;
} }
NzTexture* NzMaterial::GetHeightMap() const NzTexture* NzMaterial::GetHeightMap() const
@ -249,11 +234,6 @@ NzTexture* NzMaterial::GetNormalMap() const
return m_normalMap; return m_normalMap;
} }
const NzShader* NzMaterial::GetCustomShader() const
{
return m_customShader;
}
nzUInt32 NzMaterial::GetShaderFlags() const nzUInt32 NzMaterial::GetShaderFlags() const
{ {
return m_shaderFlags; return m_shaderFlags;
@ -286,12 +266,12 @@ const NzTextureSampler& NzMaterial::GetSpecularSampler() const
nzBlendFunc NzMaterial::GetSrcBlend() const nzBlendFunc NzMaterial::GetSrcBlend() const
{ {
return m_srcBlend; return m_states.srcBlend;
} }
nzRendererComparison NzMaterial::GetZTestCompare() const nzRendererComparison NzMaterial::GetZTestCompare() const
{ {
return m_zTestCompareFunc; return m_states.depthFunc;
} }
bool NzMaterial::HasCustomShader() const bool NzMaterial::HasCustomShader() const
@ -301,12 +281,12 @@ bool NzMaterial::HasCustomShader() const
bool NzMaterial::IsAlphaBlendingEnabled() const bool NzMaterial::IsAlphaBlendingEnabled() const
{ {
return m_alphaBlendingEnabled; return m_states.parameters[nzRendererParameter_Blend];
} }
bool NzMaterial::IsFaceCullingEnabled() const bool NzMaterial::IsFaceCullingEnabled() const
{ {
return m_faceCullingEnabled; return m_states.parameters[nzRendererParameter_FaceCulling];
} }
bool NzMaterial::IsLightingEnabled() const bool NzMaterial::IsLightingEnabled() const
@ -316,12 +296,12 @@ bool NzMaterial::IsLightingEnabled() const
bool NzMaterial::IsZBufferEnabled() const bool NzMaterial::IsZBufferEnabled() const
{ {
return m_zBufferEnabled; return m_states.parameters[nzRendererParameter_DepthBuffer];
} }
bool NzMaterial::IsZWriteEnabled() const bool NzMaterial::IsZWriteEnabled() const
{ {
return m_zWriteEnabled; return m_states.parameters[nzRendererParameter_DepthWrite];
} }
bool NzMaterial::LoadFromFile(const NzString& filePath, const NzMaterialParams& params) bool NzMaterial::LoadFromFile(const NzString& filePath, const NzMaterialParams& params)
@ -349,23 +329,17 @@ void NzMaterial::Reset()
m_normalMap.Reset(); m_normalMap.Reset();
m_specularMap.Reset(); m_specularMap.Reset();
m_alphaBlendingEnabled = false;
m_ambientColor = NzColor(128, 128, 128); m_ambientColor = NzColor(128, 128, 128);
m_diffuseColor = NzColor::White; m_diffuseColor = NzColor::White;
m_diffuseSampler = NzTextureSampler(); m_diffuseSampler = NzTextureSampler();
m_dstBlend = nzBlendFunc_Zero;
m_faceCulling = nzFaceCulling_Back;
m_faceCullingEnabled = true;
m_faceFilling = nzFaceFilling_Fill;
m_lightingEnabled = true; m_lightingEnabled = true;
m_shaderFlags = nzShaderFlags_Lighting; m_shaderFlags = nzShaderFlags_Lighting;
m_shininess = 50.f; m_shininess = 50.f;
m_specularColor = NzColor::White; m_specularColor = NzColor::White;
m_specularSampler = NzTextureSampler(); m_specularSampler = NzTextureSampler();
m_srcBlend = nzBlendFunc_One; m_states = NzRenderStates();
m_zBufferEnabled = true; m_states.parameters[nzRendererParameter_DepthBuffer] = true;
m_zTestCompareFunc = nzRendererComparison_LessOrEqual; m_states.parameters[nzRendererParameter_FaceCulling] = true;
m_zWriteEnabled = true;
} }
bool NzMaterial::SetAlphaMap(const NzString& texturePath) bool NzMaterial::SetAlphaMap(const NzString& texturePath)
@ -442,7 +416,7 @@ void NzMaterial::SetDiffuseSampler(const NzTextureSampler& sampler)
void NzMaterial::SetDstBlend(nzBlendFunc func) void NzMaterial::SetDstBlend(nzBlendFunc func)
{ {
m_dstBlend = func; m_states.dstBlend = func;
} }
bool NzMaterial::SetEmissiveMap(const NzString& texturePath) bool NzMaterial::SetEmissiveMap(const NzString& texturePath)
@ -473,12 +447,12 @@ void NzMaterial::SetEmissiveMap(NzTexture* map)
void NzMaterial::SetFaceCulling(nzFaceCulling culling) void NzMaterial::SetFaceCulling(nzFaceCulling culling)
{ {
m_faceCulling = culling; m_states.faceCulling = culling;
} }
void NzMaterial::SetFaceFilling(nzFaceFilling filling) void NzMaterial::SetFaceFilling(nzFaceFilling filling)
{ {
m_faceFilling = filling; m_states.faceFilling = filling;
} }
bool NzMaterial::SetHeightMap(const NzString& texturePath) bool NzMaterial::SetHeightMap(const NzString& texturePath)
@ -572,12 +546,12 @@ void NzMaterial::SetSpecularSampler(const NzTextureSampler& sampler)
void NzMaterial::SetSrcBlend(nzBlendFunc func) void NzMaterial::SetSrcBlend(nzBlendFunc func)
{ {
m_srcBlend = func; m_states.srcBlend = func;
} }
void NzMaterial::SetZTestCompare(nzRendererComparison compareFunc) void NzMaterial::SetZTestCompare(nzRendererComparison compareFunc)
{ {
m_zTestCompareFunc = compareFunc; m_states.depthFunc = compareFunc;
} }
NzMaterial& NzMaterial::operator=(const NzMaterial& material) NzMaterial& NzMaterial::operator=(const NzMaterial& material)

View File

@ -4,6 +4,7 @@
#include <Nazara/Renderer/OpenGL.hpp> #include <Nazara/Renderer/OpenGL.hpp>
#include <Nazara/Core/Error.hpp> #include <Nazara/Core/Error.hpp>
#include <Nazara/Math/Basic.hpp>
#include <Nazara/Renderer/Context.hpp> #include <Nazara/Renderer/Context.hpp>
#include <cstring> #include <cstring>
#include <set> #include <set>
@ -62,6 +63,7 @@ namespace
GLuint s_buffersBinding[nzBufferType_Max+1]; GLuint s_buffersBinding[nzBufferType_Max+1];
GLuint s_currentProgram; GLuint s_currentProgram;
GLuint s_texturesBinding[32]; // 32 est pour l'instant la plus haute limite (GL_TEXTURE31) GLuint s_texturesBinding[32]; // 32 est pour l'instant la plus haute limite (GL_TEXTURE31)
NzRenderStates s_states; // Toujours synchronisé avec OpenGL
const char* s_rendererName = nullptr; const char* s_rendererName = nullptr;
const char* s_vendorName = nullptr; const char* s_vendorName = nullptr;
bool s_initialized = false; bool s_initialized = false;
@ -114,6 +116,126 @@ namespace
} }
} }
void NzOpenGL::ApplyStates(const NzRenderStates& states)
{
if (states.dstBlend != states.dstBlend || s_states.srcBlend != states.srcBlend)
{
glBlendFunc(BlendFunc[states.srcBlend], BlendFunc[states.dstBlend]);
s_states.dstBlend = states.dstBlend;
}
if (s_states.depthFunc != states.depthFunc)
{
glDepthFunc(RendererComparison[states.depthFunc]);
s_states.depthFunc = states.depthFunc;
}
if (s_states.faceCulling != states.faceCulling)
{
glCullFace(FaceCulling[states.faceCulling]);
s_states.faceCulling = states.faceCulling;
}
if (s_states.faceFilling != states.faceFilling)
{
glPolygonMode(GL_FRONT_AND_BACK, FaceFilling[states.faceFilling]);
s_states.faceFilling = states.faceFilling;
}
if (s_states.stencilCompare != states.stencilCompare || s_states.stencilMask != states.stencilMask || s_states.stencilReference != states.stencilReference)
{
glStencilFunc(RendererComparison[states.stencilCompare], states.stencilReference, states.stencilMask);
s_states.stencilCompare = states.stencilCompare;
s_states.stencilMask = states.stencilMask;
s_states.stencilReference = states.stencilReference;
}
if (s_states.stencilFail != states.stencilFail || s_states.stencilPass != states.stencilPass || s_states.stencilZFail != states.stencilZFail)
{
glStencilOp(StencilOperation[states.stencilFail], StencilOperation[states.stencilZFail], StencilOperation[states.stencilPass]);
s_states.stencilFail = states.stencilFail;
s_states.stencilPass = states.stencilPass;
s_states.stencilZFail = states.stencilZFail;
}
if (NzNumberEquals(s_states.lineWidth, states.lineWidth, 0.001f))
{
glLineWidth(states.lineWidth);
s_states.lineWidth = states.lineWidth;
}
if (NzNumberEquals(s_states.pointSize, states.pointSize, 0.001f))
{
glPointSize(states.pointSize);
s_states.pointSize = states.pointSize;
}
// Paramètres de rendu
if (s_states.parameters[nzRendererParameter_Blend] != states.parameters[nzRendererParameter_Blend])
{
if (states.parameters[nzRendererParameter_Blend])
glEnable(GL_BLEND);
else
glDisable(GL_BLEND);
s_states.parameters[nzRendererParameter_Blend] = states.parameters[nzRendererParameter_Blend];
}
if (s_states.parameters[nzRendererParameter_ColorWrite] != states.parameters[nzRendererParameter_ColorWrite])
{
GLboolean param = (states.parameters[nzRendererParameter_ColorWrite]) ? GL_TRUE : GL_FALSE;
glColorMask(param, param, param, param);
s_states.parameters[nzRendererParameter_ColorWrite] = states.parameters[nzRendererParameter_ColorWrite];
}
if (s_states.parameters[nzRendererParameter_DepthBuffer] != states.parameters[nzRendererParameter_DepthBuffer])
{
if (states.parameters[nzRendererParameter_DepthBuffer])
glEnable(GL_DEPTH_TEST);
else
glDisable(GL_DEPTH_TEST);
s_states.parameters[nzRendererParameter_DepthBuffer] = states.parameters[nzRendererParameter_DepthBuffer];
}
if (s_states.parameters[nzRendererParameter_DepthWrite] != states.parameters[nzRendererParameter_DepthWrite])
{
glDepthMask((states.parameters[nzRendererParameter_DepthWrite]) ? GL_TRUE : GL_FALSE);
s_states.parameters[nzRendererParameter_DepthWrite] = states.parameters[nzRendererParameter_DepthWrite];
}
if (s_states.parameters[nzRendererParameter_FaceCulling] != states.parameters[nzRendererParameter_FaceCulling])
{
if (states.parameters[nzRendererParameter_FaceCulling])
glEnable(GL_CULL_FACE);
else
glDisable(GL_CULL_FACE);
s_states.parameters[nzRendererParameter_FaceCulling] = states.parameters[nzRendererParameter_FaceCulling];
}
if (s_states.parameters[nzRendererParameter_ScissorTest] != states.parameters[nzRendererParameter_ScissorTest])
{
if (states.parameters[nzRendererParameter_ScissorTest])
glEnable(GL_SCISSOR_TEST);
else
glDisable(GL_SCISSOR_TEST);
s_states.parameters[nzRendererParameter_ScissorTest] = states.parameters[nzRendererParameter_ScissorTest];
}
if (s_states.parameters[nzRendererParameter_StencilTest] != states.parameters[nzRendererParameter_StencilTest])
{
if (states.parameters[nzRendererParameter_StencilTest])
glEnable(GL_STENCIL_TEST);
else
glDisable(GL_STENCIL_TEST);
s_states.parameters[nzRendererParameter_StencilTest] = states.parameters[nzRendererParameter_StencilTest];
}
}
void NzOpenGL::BindBuffer(nzBufferType type, GLuint id) void NzOpenGL::BindBuffer(nzBufferType type, GLuint id)
{ {
if (s_buffersBinding[type] != id) if (s_buffersBinding[type] != id)

View File

@ -48,10 +48,8 @@ namespace
Update_Matrices = 0x01, Update_Matrices = 0x01,
Update_Shader = 0x02, Update_Shader = 0x02,
Update_StencilFunc = 0x04, Update_Textures = 0x04,
Update_StencilOp = 0x08, Update_VAO = 0x08,
Update_Textures = 0x10,
Update_VAO = 0x20,
}; };
struct TextureUnit struct TextureUnit
@ -77,18 +75,9 @@ namespace
NzBuffer* s_instancingBuffer = nullptr; NzBuffer* s_instancingBuffer = nullptr;
NzVertexBuffer* s_quadBuffer = nullptr; NzVertexBuffer* s_quadBuffer = nullptr;
NzMatrix4f s_matrix[totalMatrixCount]; NzMatrix4f s_matrix[totalMatrixCount];
NzRenderStates s_states;
NzVector2ui s_targetSize; NzVector2ui s_targetSize;
nzBlendFunc s_srcBlend;
nzBlendFunc s_dstBlend;
nzFaceCulling s_faceCulling;
nzFaceFilling s_faceFilling;
nzRendererComparison s_depthFunc;
nzRendererComparison s_stencilCompare;
nzStencilOperation s_stencilFail;
nzStencilOperation s_stencilPass;
nzStencilOperation s_stencilZFail;
nzUInt8 s_maxAnisotropyLevel; nzUInt8 s_maxAnisotropyLevel;
nzUInt32 s_stencilMask;
nzUInt32 s_updateFlags; nzUInt32 s_updateFlags;
const NzIndexBuffer* s_indexBuffer; const NzIndexBuffer* s_indexBuffer;
const NzRenderTarget* s_target; const NzRenderTarget* s_target;
@ -102,7 +91,6 @@ namespace
int s_matrixLocation[totalMatrixCount]; int s_matrixLocation[totalMatrixCount];
unsigned int s_maxRenderTarget; unsigned int s_maxRenderTarget;
unsigned int s_maxTextureUnit; unsigned int s_maxTextureUnit;
unsigned int s_stencilReference;
} }
void NzRenderer::Clear(unsigned long flags) void NzRenderer::Clear(unsigned long flags)
@ -468,7 +456,8 @@ void NzRenderer::Enable(nzRendererParameter parameter, bool enable)
} }
#endif #endif
switch (parameter) s_states.parameters[parameter] = enable;
/*switch (parameter)
{ {
case nzRendererParameter_ColorWrite: case nzRendererParameter_ColorWrite:
glColorMask(enable, enable, enable, enable); glColorMask(enable, enable, enable, enable);
@ -485,7 +474,7 @@ void NzRenderer::Enable(nzRendererParameter parameter, bool enable)
glDisable(NzOpenGL::RendererParameter[parameter]); glDisable(NzOpenGL::RendererParameter[parameter]);
break; break;
} }*/
} }
void NzRenderer::Flush() void NzRenderer::Flush()
@ -511,10 +500,7 @@ float NzRenderer::GetLineWidth()
} }
#endif #endif
float lineWidth; return s_states.lineWidth;
glGetFloatv(GL_LINE_WIDTH, &lineWidth);
return lineWidth;
} }
/* /*
NzMatrix4f NzRenderer::GetMatrix(nzMatrixCombination combination) NzMatrix4f NzRenderer::GetMatrix(nzMatrixCombination combination)
@ -588,10 +574,12 @@ float NzRenderer::GetPointSize()
} }
#endif #endif
float pointSize; return s_states.pointSize;
glGetFloatv(GL_POINT_SIZE, &pointSize); }
return pointSize; const NzRenderStates& NzRenderer::GetRenderStates()
{
return s_states;
} }
NzRectui NzRenderer::GetScissorRect() NzRectui NzRenderer::GetScissorRect()
@ -744,18 +732,10 @@ bool NzRenderer::Initialize()
else else
s_maxTextureUnit = 1; s_maxTextureUnit = 1;
s_dstBlend = nzBlendFunc_Zero; s_states = NzRenderStates();
s_faceCulling = nzFaceCulling_Back;
s_faceFilling = nzFaceFilling_Fill;
s_indexBuffer = nullptr; s_indexBuffer = nullptr;
s_shader = nullptr; s_shader = nullptr;
s_srcBlend = nzBlendFunc_One;
s_stencilCompare = nzRendererComparison_Always;
s_stencilFail = nzStencilOperation_Keep;
s_stencilMask = 0xFFFFFFFF;
s_stencilPass = nzStencilOperation_Keep;
s_stencilReference = 0;
s_stencilZFail = nzStencilOperation_Keep;
s_target = nullptr; s_target = nullptr;
s_textureUnits.resize(s_maxTextureUnit); s_textureUnits.resize(s_maxTextureUnit);
s_useSamplerObjects = NzOpenGL::IsSupported(nzOpenGLExtension_SamplerObjects); s_useSamplerObjects = NzOpenGL::IsSupported(nzOpenGLExtension_SamplerObjects);
@ -826,27 +806,7 @@ bool NzRenderer::IsEnabled(nzRendererParameter parameter)
} }
#endif #endif
switch (parameter) return s_states.parameters[parameter];
{
case nzRendererParameter_ColorWrite:
{
GLboolean enabled;
glGetBooleanv(GL_COLOR_WRITEMASK, &enabled);
return enabled;
}
case nzRendererParameter_DepthWrite:
{
GLboolean enabled;
glGetBooleanv(GL_DEPTH_WRITEMASK, &enabled);
return enabled;
}
default:
return glIsEnabled(NzOpenGL::RendererParameter[parameter]);
}
} }
bool NzRenderer::IsInitialized() bool NzRenderer::IsInitialized()
@ -854,7 +814,7 @@ bool NzRenderer::IsInitialized()
return s_moduleReferenceCounter != 0; return s_moduleReferenceCounter != 0;
} }
void NzRenderer::SetBlendFunc(nzBlendFunc srcBlend, nzBlendFunc destBlend) void NzRenderer::SetBlendFunc(nzBlendFunc srcBlend, nzBlendFunc dstBlend)
{ {
#ifdef NAZARA_DEBUG #ifdef NAZARA_DEBUG
if (NzContext::GetCurrent() == nullptr) if (NzContext::GetCurrent() == nullptr)
@ -864,12 +824,8 @@ void NzRenderer::SetBlendFunc(nzBlendFunc srcBlend, nzBlendFunc destBlend)
} }
#endif #endif
if (s_srcBlend != srcBlend || s_dstBlend != destBlend) s_states.srcBlend = srcBlend;
{ s_states.dstBlend = dstBlend;
glBlendFunc(NzOpenGL::BlendFunc[srcBlend], NzOpenGL::BlendFunc[destBlend]);
s_srcBlend = srcBlend;
s_dstBlend = destBlend;
}
} }
void NzRenderer::SetClearColor(const NzColor& color) void NzRenderer::SetClearColor(const NzColor& color)
@ -934,11 +890,7 @@ void NzRenderer::SetDepthFunc(nzRendererComparison compareFunc)
} }
#endif #endif
if (s_depthFunc != compareFunc) s_states.depthFunc = compareFunc;
{
glDepthFunc(NzOpenGL::RendererComparison[compareFunc]);
s_depthFunc = compareFunc;
}
} }
void NzRenderer::SetFaceCulling(nzFaceCulling cullingMode) void NzRenderer::SetFaceCulling(nzFaceCulling cullingMode)
@ -951,11 +903,7 @@ void NzRenderer::SetFaceCulling(nzFaceCulling cullingMode)
} }
#endif #endif
if (s_faceCulling != cullingMode) s_states.faceCulling = cullingMode;
{
glCullFace(NzOpenGL::FaceCulling[cullingMode]);
s_faceCulling = cullingMode;
}
} }
void NzRenderer::SetFaceFilling(nzFaceFilling fillingMode) void NzRenderer::SetFaceFilling(nzFaceFilling fillingMode)
@ -968,11 +916,7 @@ void NzRenderer::SetFaceFilling(nzFaceFilling fillingMode)
} }
#endif #endif
if (s_faceFilling != fillingMode) s_states.faceFilling = fillingMode;
{
glPolygonMode(GL_FRONT_AND_BACK, NzOpenGL::FaceFilling[fillingMode]);
s_faceFilling = fillingMode;
}
} }
void NzRenderer::SetIndexBuffer(const NzIndexBuffer* indexBuffer) void NzRenderer::SetIndexBuffer(const NzIndexBuffer* indexBuffer)
@ -1042,7 +986,7 @@ void NzRenderer::SetLineWidth(float width)
} }
#endif #endif
glLineWidth(width); s_states.lineWidth = width;
} }
void NzRenderer::SetMatrix(nzMatrixType type, const NzMatrix4f& matrix) void NzRenderer::SetMatrix(nzMatrixType type, const NzMatrix4f& matrix)
@ -1092,7 +1036,12 @@ void NzRenderer::SetPointSize(float size)
} }
#endif #endif
glPointSize(size); s_states.pointSize = size;
}
void NzRenderer::SetRenderStates(const NzRenderStates& states)
{
s_states = states;
} }
void NzRenderer::SetScissorRect(const NzRectui& rect) void NzRenderer::SetScissorRect(const NzRectui& rect)
@ -1152,11 +1101,7 @@ void NzRenderer::SetStencilCompareFunction(nzRendererComparison compareFunc)
} }
#endif #endif
if (compareFunc != s_stencilCompare) s_states.stencilCompare = compareFunc;
{
s_stencilCompare = compareFunc;
s_updateFlags |= Update_StencilFunc;
}
} }
void NzRenderer::SetStencilFailOperation(nzStencilOperation failOperation) void NzRenderer::SetStencilFailOperation(nzStencilOperation failOperation)
@ -1169,20 +1114,12 @@ void NzRenderer::SetStencilFailOperation(nzStencilOperation failOperation)
} }
#endif #endif
if (failOperation != s_stencilFail) s_states.stencilFail = failOperation;
{
s_stencilFail = failOperation;
s_updateFlags |= Update_StencilOp;
}
} }
void NzRenderer::SetStencilMask(nzUInt32 mask) void NzRenderer::SetStencilMask(nzUInt32 mask)
{ {
if (mask != s_stencilMask) s_states.stencilMask = mask;
{
s_stencilMask = mask;
s_updateFlags |= Update_StencilFunc;
}
} }
void NzRenderer::SetStencilPassOperation(nzStencilOperation passOperation) void NzRenderer::SetStencilPassOperation(nzStencilOperation passOperation)
@ -1195,20 +1132,12 @@ void NzRenderer::SetStencilPassOperation(nzStencilOperation passOperation)
} }
#endif #endif
if (passOperation != s_stencilPass) s_states.stencilPass = passOperation;
{
s_stencilPass = passOperation;
s_updateFlags |= Update_StencilOp;
}
} }
void NzRenderer::SetStencilReferenceValue(unsigned int refValue) void NzRenderer::SetStencilReferenceValue(unsigned int refValue)
{ {
if (refValue != s_stencilReference) s_states.stencilReference = refValue;
{
s_stencilReference = refValue;
s_updateFlags |= Update_StencilFunc;
}
} }
void NzRenderer::SetStencilZFailOperation(nzStencilOperation zfailOperation) void NzRenderer::SetStencilZFailOperation(nzStencilOperation zfailOperation)
@ -1221,11 +1150,7 @@ void NzRenderer::SetStencilZFailOperation(nzStencilOperation zfailOperation)
} }
#endif #endif
if (zfailOperation != s_stencilZFail) s_states.stencilZFail = zfailOperation;
{
s_stencilZFail = zfailOperation;
s_updateFlags |= Update_StencilOp;
}
} }
bool NzRenderer::SetTarget(const NzRenderTarget* target) bool NzRenderer::SetTarget(const NzRenderTarget* target)
@ -1552,18 +1477,6 @@ bool NzRenderer::EnsureStateUpdate()
s_updateFlags &= ~Update_Matrices; s_updateFlags &= ~Update_Matrices;
} }
if (s_updateFlags & Update_StencilFunc)
{
glStencilFunc(NzOpenGL::RendererComparison[s_stencilCompare], s_stencilReference, s_stencilMask);
s_updateFlags &= ~Update_StencilFunc;
}
if (s_updateFlags & Update_StencilOp)
{
glStencilOp(NzOpenGL::StencilOperation[s_stencilFail], NzOpenGL::StencilOperation[s_stencilZFail], NzOpenGL::StencilOperation[s_stencilPass]);
s_updateFlags &= ~Update_StencilOp;
}
if (s_updateFlags & Update_VAO) if (s_updateFlags & Update_VAO)
{ {
#if NAZARA_RENDERER_SAFE #if NAZARA_RENDERER_SAFE
@ -1691,6 +1604,8 @@ bool NzRenderer::EnsureStateUpdate()
NzOpenGL::BindTexture(i, texture->GetType(), texture->GetOpenGLID()); NzOpenGL::BindTexture(i, texture->GetType(), texture->GetOpenGLID());
} }
NzOpenGL::ApplyStates(s_states);
return true; return true;
} }