Răsfoiți Sursa

Fix disabling blending,

--HG--
branch : minor
Alex Szpakowski 5 ani în urmă
părinte
comite
6c662ade41

+ 15 - 9
src/modules/graphics/opengl/Graphics.cpp

@@ -206,7 +206,7 @@ bool Graphics::setMode(int width, int height, int pixelwidth, int pixelheight, b
 	setViewportSize(width, height, pixelwidth, pixelheight);
 
 	// Enable blending
-	glEnable(GL_BLEND);
+	gl.setEnableState(OpenGL::ENABLE_BLEND, true);
 
 	// Auto-generated mipmaps should be the best quality possible
 	if (!gl.isCoreProfile())
@@ -1280,15 +1280,21 @@ void Graphics::setBlendState(const BlendState &blend)
 			throw love::Exception("The 'min' and 'max' blend operations are not supported on this system.");
 	}
 
-	GLenum opRGB  = getGLBlendOperation(blend.operationRGB);
-	GLenum opA    = getGLBlendOperation(blend.operationA);
-	GLenum srcRGB = getGLBlendFactor(blend.srcFactorRGB);
-	GLenum srcA   = getGLBlendFactor(blend.srcFactorA);
-	GLenum dstRGB = getGLBlendFactor(blend.dstFactorRGB);
-	GLenum dstA   = getGLBlendFactor(blend.dstFactorA);
+	if (blend.enable != gl.isStateEnabled(OpenGL::ENABLE_BLEND))
+		gl.setEnableState(OpenGL::ENABLE_BLEND, blend.enable);
 
-	glBlendEquationSeparate(opRGB, opA);
-	glBlendFuncSeparate(srcRGB, dstRGB, srcA, dstA);
+	if (blend.enable)
+	{
+		GLenum opRGB  = getGLBlendOperation(blend.operationRGB);
+		GLenum opA    = getGLBlendOperation(blend.operationA);
+		GLenum srcRGB = getGLBlendFactor(blend.srcFactorRGB);
+		GLenum srcA   = getGLBlendFactor(blend.srcFactorA);
+		GLenum dstRGB = getGLBlendFactor(blend.dstFactorRGB);
+		GLenum dstA   = getGLBlendFactor(blend.dstFactorA);
+
+		glBlendEquationSeparate(opRGB, opA);
+		glBlendFuncSeparate(srcRGB, dstRGB, srcA, dstA);
+	}
 
 	states.back().blend = blend;
 }

+ 4 - 0
src/modules/graphics/opengl/OpenGL.cpp

@@ -205,6 +205,7 @@ void OpenGL::setupContext()
 		state.boundFramebuffers[i] = std::numeric_limits<GLuint>::max();
 	bindFramebuffer(FRAMEBUFFER_ALL, getDefaultFBO());
 
+	setEnableState(ENABLE_BLEND, state.enableState[ENABLE_BLEND]);
 	setEnableState(ENABLE_DEPTH_TEST, state.enableState[ENABLE_DEPTH_TEST]);
 	setEnableState(ENABLE_STENCIL_TEST, state.enableState[ENABLE_STENCIL_TEST]);
 	setEnableState(ENABLE_SCISSOR_TEST, state.enableState[ENABLE_SCISSOR_TEST]);
@@ -810,6 +811,9 @@ void OpenGL::setEnableState(EnableState enablestate, bool enable)
 
 	switch (enablestate)
 	{
+	case ENABLE_BLEND:
+		glstate = GL_BLEND;
+		break;
 	case ENABLE_DEPTH_TEST:
 		glstate = GL_DEPTH_TEST;
 		break;

+ 1 - 0
src/modules/graphics/opengl/OpenGL.h

@@ -94,6 +94,7 @@ public:
 
 	enum EnableState
 	{
+		ENABLE_BLEND,
 		ENABLE_DEPTH_TEST,
 		ENABLE_STENCIL_TEST,
 		ENABLE_SCISSOR_TEST,