|
@@ -81,6 +81,14 @@ DisplayState Graphics::saveState()
|
|
|
glGetFloatv(GL_POINT_SIZE, &s.pointSize);
|
|
|
//get point style
|
|
|
s.pointStyle = (glIsEnabled(GL_POINT_SMOOTH) == GL_TRUE) ? Graphics::POINT_SMOOTH : Graphics::POINT_ROUGH;
|
|
|
+ // get alpha test status
|
|
|
+ s.alphaTest = isAlphaTestEnabled();
|
|
|
+ if (s.alphaTest)
|
|
|
+ {
|
|
|
+ // if alpha testing is enabled, store mode and reference alpha
|
|
|
+ s.alphaTestMode = getAlphaTestMode();
|
|
|
+ s.alphaTestRef = getAlphaTestRef();
|
|
|
+ }
|
|
|
//get scissor status
|
|
|
s.scissor = (glIsEnabled(GL_SCISSOR_TEST) == GL_TRUE);
|
|
|
//do we have scissor, if so, store the box
|
|
@@ -100,6 +108,10 @@ void Graphics::restoreState(const DisplayState &s)
|
|
|
setBlendMode(s.blendMode);
|
|
|
setLine(lineWidth, s.lineStyle);
|
|
|
setPoint(s.pointSize, s.pointStyle);
|
|
|
+ if (s.alphaTest)
|
|
|
+ setAlphaTest(s.alphaTestMode, s.alphaTestRef);
|
|
|
+ else
|
|
|
+ setAlphaTest();
|
|
|
if (s.scissor)
|
|
|
setScissor(s.scissorBox[0], s.scissorBox[1], s.scissorBox[2], s.scissorBox[3]);
|
|
|
else
|
|
@@ -152,6 +164,10 @@ bool Graphics::setMode(int width, int height, WindowFlags *flags)
|
|
|
if (GLEE_VERSION_1_4 || GLEE_SGIS_generate_mipmap)
|
|
|
glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
|
|
|
|
|
|
+ // Set default alpha test mode and value
|
|
|
+ glAlphaFunc(GL_GREATER, 0.0f);
|
|
|
+ setAlphaTest();
|
|
|
+
|
|
|
// Enable textures
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
setActiveTextureUnit(0);
|
|
@@ -356,6 +372,80 @@ void Graphics::discardStencil()
|
|
|
glDisable(GL_STENCIL_TEST);
|
|
|
}
|
|
|
|
|
|
+void Graphics::setAlphaTest(Graphics::AlphaTestMode mode, unsigned char refalpha)
|
|
|
+{
|
|
|
+ GLclampf ref = refalpha / 255.0f;
|
|
|
+
|
|
|
+ glEnable(GL_ALPHA_TEST);
|
|
|
+
|
|
|
+ switch (mode)
|
|
|
+ {
|
|
|
+ case ALPHATEST_LESS:
|
|
|
+ glAlphaFunc(GL_LESS, ref);
|
|
|
+ break;
|
|
|
+ case ALPHATEST_LEQUAL:
|
|
|
+ glAlphaFunc(GL_LEQUAL, ref);
|
|
|
+ break;
|
|
|
+ case ALPHATEST_EQUAL:
|
|
|
+ glAlphaFunc(GL_EQUAL, ref);
|
|
|
+ break;
|
|
|
+ case ALPHATEST_NOTEQUAL:
|
|
|
+ glAlphaFunc(GL_NOTEQUAL, ref);
|
|
|
+ break;
|
|
|
+ case ALPHATEST_GEQUAL:
|
|
|
+ glAlphaFunc(GL_GEQUAL, ref);
|
|
|
+ break;
|
|
|
+ case ALPHATEST_GREATER:
|
|
|
+ glAlphaFunc(GL_GREATER, ref);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ glDisable(GL_ALPHA_TEST);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void Graphics::setAlphaTest()
|
|
|
+{
|
|
|
+ glDisable(GL_ALPHA_TEST);
|
|
|
+}
|
|
|
+
|
|
|
+bool Graphics::isAlphaTestEnabled()
|
|
|
+{
|
|
|
+ return glIsEnabled(GL_ALPHA_TEST) == GL_TRUE;
|
|
|
+}
|
|
|
+
|
|
|
+Graphics::AlphaTestMode Graphics::getAlphaTestMode()
|
|
|
+{
|
|
|
+ GLint func;
|
|
|
+ glGetIntegerv(GL_ALPHA_TEST_FUNC, &func);
|
|
|
+
|
|
|
+ switch (func)
|
|
|
+ {
|
|
|
+ case GL_LESS:
|
|
|
+ return ALPHATEST_LESS;
|
|
|
+ case GL_LEQUAL:
|
|
|
+ return ALPHATEST_LEQUAL;
|
|
|
+ case GL_EQUAL:
|
|
|
+ return ALPHATEST_EQUAL;
|
|
|
+ case GL_NOTEQUAL:
|
|
|
+ return ALPHATEST_NOTEQUAL;
|
|
|
+ case GL_GEQUAL:
|
|
|
+ return ALPHATEST_GEQUAL;
|
|
|
+ case GL_GREATER:
|
|
|
+ return ALPHATEST_GREATER;
|
|
|
+ default:
|
|
|
+ return ALPHATEST_MAX_ENUM;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+unsigned char Graphics::getAlphaTestRef()
|
|
|
+{
|
|
|
+ GLfloat ref;
|
|
|
+ glGetFloatv(GL_ALPHA_TEST_REF, &ref);
|
|
|
+
|
|
|
+ return ref * 255;
|
|
|
+}
|
|
|
+
|
|
|
Image *Graphics::newImage(love::image::ImageData *data)
|
|
|
{
|
|
|
// Create the image.
|