Merge pull request #16 from teamfisk/Editor

Added BlendEquation and BlendFunc to RenderState ...
This commit is contained in:
Viktor Ljung
2015-12-14 20:25:10 +01:00
4 changed files with 80 additions and 87 deletions
+11 -7
View File
@@ -1,6 +1,7 @@
#ifndef RenderState_h__
#define RenderState_h__
#include <functional>
#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<GLenum> m_Enables;
float m_preClearColor[4];
int m_preBuffer;
std::vector<std::function<void(void)>> m_ResetFunctions;
};
#endif
+1 -1
View File
@@ -4,7 +4,7 @@
DrawScenePassState::DrawScenePassState()
{
GLERROR("---");
BindBuffer(0);
BindFramebuffer(0);
GLERROR("---");
Enable(GL_DEPTH_TEST);
Enable(GL_CULL_FACE);
+1 -1
View File
@@ -4,7 +4,7 @@
PickingPassState::PickingPassState(GLuint frameBuffer)
{
GLERROR("---2");
BindBuffer(frameBuffer);
BindFramebuffer(frameBuffer);
GLERROR("---3");
Enable(GL_DEPTH_TEST);
Enable(GL_CULL_FACE);
+67 -78
View File
@@ -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");
}