From 522679b14cffcd0ef3a1ce43a51570e22f8d6932 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Mon, 14 Dec 2015 20:13:45 +0100 Subject: [PATCH] Added BlendEquation and BlendFunc to RenderState, and cleaned it up A LOT --- include/Engine/Rendering/RenderState.h | 18 ++- src/Engine/Rendering/DrawScenePassState.cpp | 2 +- src/Engine/Rendering/PickingPassState.cpp | 2 +- src/Engine/Rendering/RenderState.cpp | 145 +++++++++----------- 4 files changed, 80 insertions(+), 87 deletions(-) diff --git a/include/Engine/Rendering/RenderState.h b/include/Engine/Rendering/RenderState.h index e7ba2f80..c6eb8775 100644 --- a/include/Engine/Rendering/RenderState.h +++ b/include/Engine/Rendering/RenderState.h @@ -1,6 +1,7 @@ #ifndef RenderState_h__ #define RenderState_h__ +#include #include "../Common.h" #include "../OpenGL.h" #include "../GLM.h" @@ -8,16 +9,19 @@ class RenderState { public: - RenderState(); + RenderState() = default; ~RenderState(); - bool Enable(GLenum GLEnable); - bool CullFace(GLenum GlFaceToCull); + + bool Enable(GLenum cap); + bool Disable(GLenum cap); + bool CullFace(GLenum mode); bool ClearColor(glm::vec4 color); bool Clear(GLbitfield mask); - bool BindBuffer(GLint buffer); + bool BindFramebuffer(GLint framebuffer); + bool BlendEquation(GLenum mode); + bool BlendFunc(GLenum sfactor, GLenum dfactor); + private: - std::vector m_Enables; - float m_preClearColor[4]; - int m_preBuffer; + std::vector> m_ResetFunctions; }; #endif \ No newline at end of file diff --git a/src/Engine/Rendering/DrawScenePassState.cpp b/src/Engine/Rendering/DrawScenePassState.cpp index 59654775..9e7497a3 100644 --- a/src/Engine/Rendering/DrawScenePassState.cpp +++ b/src/Engine/Rendering/DrawScenePassState.cpp @@ -4,7 +4,7 @@ DrawScenePassState::DrawScenePassState() { GLERROR("---"); - BindBuffer(0); + BindFramebuffer(0); GLERROR("---"); Enable(GL_DEPTH_TEST); Enable(GL_CULL_FACE); diff --git a/src/Engine/Rendering/PickingPassState.cpp b/src/Engine/Rendering/PickingPassState.cpp index a52fa546..1e28ea66 100644 --- a/src/Engine/Rendering/PickingPassState.cpp +++ b/src/Engine/Rendering/PickingPassState.cpp @@ -4,7 +4,7 @@ PickingPassState::PickingPassState(GLuint frameBuffer) { GLERROR("---2"); - BindBuffer(frameBuffer); + BindFramebuffer(frameBuffer); GLERROR("---3"); Enable(GL_DEPTH_TEST); Enable(GL_CULL_FACE); diff --git a/src/Engine/Rendering/RenderState.cpp b/src/Engine/Rendering/RenderState.cpp index 34c88ece..631e7ff5 100644 --- a/src/Engine/Rendering/RenderState.cpp +++ b/src/Engine/Rendering/RenderState.cpp @@ -1,110 +1,99 @@ #include "Rendering/RenderState.h" -RenderState::RenderState() +bool RenderState::Enable(GLenum cap) { - -} - -bool RenderState::Enable(GLenum GLEnable) -{ - if(glIsEnabled(GLEnable)) - { + if (glIsEnabled(cap)) { return false; } - m_Enables.push_back(GLEnable); - glEnable(GLEnable); - if (GLERROR("RenderState::Enable")) - { - return false; - } - return true; + m_ResetFunctions.push_back(std::bind(glDisable, cap)); + glEnable(cap); + return !GLERROR("RenderState::Enable"); } -bool RenderState::CullFace(GLenum GLCullFace) +bool RenderState::Disable(GLenum cap) { - if(!glIsEnabled(GL_CULL_FACE)) - { + if (!glIsEnabled(cap)) { + return false; + } + m_ResetFunctions.push_back(std::bind(glEnable, cap)); + glDisable(cap); + return !GLERROR("RenderState::Disable"); +} + +bool RenderState::CullFace(GLenum mode) +{ + if (!glIsEnabled(GL_CULL_FACE)) { LOG_ERROR("Setting GL_CULL_FACE without enabling it."); return false; } - GLint a; - glGetIntegerv(GL_CULL_FACE_MODE, &a); - if(a != GL_BACK) - { - //LOG_INFO("Setting Cullface to back, unessesary since this is already default."); - glCullFace(GLCullFace); - } - if (GLERROR("RenderState::CullFace")) - { - return false; - } - return true; + GLint original; + glGetIntegerv(GL_CULL_FACE_MODE, &original); + m_ResetFunctions.push_back(std::bind(glCullFace, original)); + glCullFace(mode); + return !GLERROR("RenderState::CullFace"); } bool RenderState::ClearColor(glm::vec4 color) { - glGetFloatv(GL_COLOR_CLEAR_VALUE, &m_preClearColor[0]); + GLfloat original[4]; + glGetFloatv(GL_COLOR_CLEAR_VALUE, &original[0]); + m_ResetFunctions.push_back(std::bind(glClearColor, original[0], original[1], original[2], original[3])); glClearColor(color.r, color.g, color.b, color.a); - if (GLERROR("RenderState::ClearColor")) { - return false; - } - return true; + return !GLERROR("RenderState::ClearColor"); } bool RenderState::Clear(GLbitfield mask) { glClear(mask); - if (GLERROR("RenderState::Clear")) { - return false; - } - return true; + return !GLERROR("RenderState::Clear"); } -bool RenderState::BindBuffer(GLint buffer) +bool RenderState::BindFramebuffer(GLint framebuffer) { - glGetIntegerv(GL_FRAMEBUFFER_BINDING, &m_preBuffer); - if (buffer == m_preBuffer) - { - return true; - } - glBindFramebuffer(GL_FRAMEBUFFER, buffer); - if (GLERROR("RenderState::BindBuffer")) - { - printf("BufferID: %i\npreBufferID: %i\n", buffer, m_preBuffer); - return false; - } - return true; + GLint originalRead; + glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &originalRead); + GLint originalDraw; + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &originalDraw); + m_ResetFunctions.push_back([originalRead, originalDraw]() { + glBindFramebuffer(GL_READ_FRAMEBUFFER, originalRead); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, originalDraw); + }); + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + return !GLERROR("RenderState::BindBuffer"); +} + + +bool RenderState::BlendEquation(GLenum mode) +{ + GLint originalRGB; + glGetIntegerv(GL_BLEND_EQUATION_RGB, &originalRGB); + GLint originalAlpha; + glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &originalAlpha); + m_ResetFunctions.push_back(std::bind(glBlendEquationSeparate, originalRGB, originalAlpha)); + glBlendEquation(mode); + return !GLERROR("RenderState::BlendEquation"); +} + +bool RenderState::BlendFunc(GLenum sfactor, GLenum dfactor) +{ + GLint originalSrcRGB; + glGetIntegerv(GL_BLEND_SRC_RGB, &originalSrcRGB); + GLint originalSrcAlpha; + glGetIntegerv(GL_BLEND_SRC_ALPHA, &originalSrcAlpha); + GLint originalDestRGB; + glGetIntegerv(GL_BLEND_DST_RGB, &originalDestRGB); + GLint originalDestAlpha; + glGetIntegerv(GL_BLEND_DST_ALPHA, &originalDestAlpha); + m_ResetFunctions.push_back(std::bind(glBlendFuncSeparate, originalSrcRGB, originalSrcAlpha, originalDestRGB, originalDestAlpha)); + glBlendFunc(sfactor, dfactor); + return !GLERROR("RenderState::BlendFunc"); } RenderState::~RenderState() { - GLERROR("RenderState::~RenderState Pre"); - GLint n_buffer = -1; - glGetIntegerv(GL_FRAMEBUFFER_BINDING, &n_buffer); - - //Set cullface to default - if (glIsEnabled(GL_CULL_FACE)) { - glCullFace(GL_BACK); + for (auto& f : m_ResetFunctions) { + f(); } - GLERROR("RenderState::~RenderState glCullFace"); - - //Set color to default - glClearColor(m_preClearColor[0], m_preClearColor[1], m_preClearColor[2], m_preClearColor[3]); - GLERROR("RenderState::~RenderState glClearColor"); - - //Disable Enables - for (auto i : m_Enables) - { - glDisable(i); - } - GLERROR("RenderState::~RenderState glDisable"); - - if(m_preBuffer != 0) - { - glBindFramebuffer(GL_FRAMEBUFFER, 0); - } - m_Enables.clear(); - GLERROR("RenderState::~RenderState glBindFramebuffer"); }