summaryrefslogtreecommitdiff
path: root/indra/llrender/llglstates.h
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llrender/llglstates.h')
-rw-r--r--indra/llrender/llglstates.h281
1 files changed, 281 insertions, 0 deletions
diff --git a/indra/llrender/llglstates.h b/indra/llrender/llglstates.h
new file mode 100644
index 0000000000..d5a29dcd0c
--- /dev/null
+++ b/indra/llrender/llglstates.h
@@ -0,0 +1,281 @@
+/**
+ * @file llglstates.h
+ * @brief LLGL states definitions
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+//THIS HEADER SHOULD ONLY BE INCLUDED FROM llgl.h
+#ifndef LL_LLGLSTATES_H
+#define LL_LLGLSTATES_H
+
+#include "llimagegl.h"
+
+//----------------------------------------------------------------------------
+
+class LLGLDepthTest
+{
+ // Enabled by default
+public:
+ LLGLDepthTest(GLboolean depth_enabled, GLboolean write_enabled = GL_TRUE, GLenum depth_func = GL_LEQUAL);
+
+ ~LLGLDepthTest();
+
+ void checkState();
+
+ GLboolean mPrevDepthEnabled;
+ GLenum mPrevDepthFunc;
+ GLboolean mPrevWriteEnabled;
+private:
+ static GLboolean sDepthEnabled; // defaults to GL_FALSE
+ static GLenum sDepthFunc; // defaults to GL_LESS
+ static GLboolean sWriteEnabled; // defaults to GL_TRUE
+};
+
+//----------------------------------------------------------------------------
+
+class LLGLSDefault
+{
+protected:
+ LLGLEnable mColorMaterial;
+ LLGLDisable mAlphaTest, mBlend, mCullFace, mDither, mFog,
+ mLineSmooth, mLineStipple, mNormalize, mPolygonSmooth,
+ mTextureGenQ, mTextureGenR, mTextureGenS, mTextureGenT,
+ mGLMultisample;
+public:
+ LLGLSDefault()
+ :
+ // Enable
+ mColorMaterial(GL_COLOR_MATERIAL),
+ // Disable
+ mAlphaTest(GL_ALPHA_TEST),
+ mBlend(GL_BLEND),
+ mCullFace(GL_CULL_FACE),
+ mDither(GL_DITHER),
+ mFog(GL_FOG),
+ mLineSmooth(GL_LINE_SMOOTH),
+ mLineStipple(GL_LINE_STIPPLE),
+ mNormalize(GL_NORMALIZE),
+ mPolygonSmooth(GL_POLYGON_SMOOTH),
+ mTextureGenQ(GL_TEXTURE_GEN_Q),
+ mTextureGenR(GL_TEXTURE_GEN_R),
+ mTextureGenS(GL_TEXTURE_GEN_S),
+ mTextureGenT(GL_TEXTURE_GEN_T),
+ mGLMultisample(GL_MULTISAMPLE_ARB)
+ { }
+};
+
+class LLGLSObjectSelect
+{
+protected:
+ LLGLDisable mBlend, mFog, mAlphaTest;
+ LLGLEnable mCullFace;
+public:
+ LLGLSObjectSelect()
+ : mBlend(GL_BLEND), mFog(GL_FOG),
+ mAlphaTest(GL_ALPHA_TEST),
+ mCullFace(GL_CULL_FACE)
+ { }
+};
+
+class LLGLSObjectSelectAlpha
+{
+protected:
+ LLGLEnable mAlphaTest;
+public:
+ LLGLSObjectSelectAlpha()
+ : mAlphaTest(GL_ALPHA_TEST)
+ {}
+};
+
+//----------------------------------------------------------------------------
+
+class LLGLSUIDefault
+{
+protected:
+ LLGLEnable mBlend, mAlphaTest;
+ LLGLDisable mCullFace;
+ LLGLDepthTest mDepthTest;
+public:
+ LLGLSUIDefault()
+ : mBlend(GL_BLEND), mAlphaTest(GL_ALPHA_TEST),
+ mCullFace(GL_CULL_FACE),
+ mDepthTest(GL_FALSE, GL_TRUE, GL_LEQUAL)
+ {}
+};
+
+class LLGLSNoAlphaTest // : public LLGLSUIDefault
+{
+protected:
+ LLGLDisable mAlphaTest;
+public:
+ LLGLSNoAlphaTest()
+ : mAlphaTest(GL_ALPHA_TEST)
+ {}
+};
+
+//----------------------------------------------------------------------------
+
+class LLGLSFog
+{
+protected:
+ LLGLEnable mFog;
+public:
+ LLGLSFog()
+ : mFog(GL_FOG)
+ {}
+};
+
+class LLGLSNoFog
+{
+protected:
+ LLGLDisable mFog;
+public:
+ LLGLSNoFog()
+ : mFog(GL_FOG)
+ {}
+};
+
+//----------------------------------------------------------------------------
+
+class LLGLSPipeline
+{
+protected:
+ LLGLEnable mCullFace;
+ LLGLDepthTest mDepthTest;
+public:
+ LLGLSPipeline()
+ : mCullFace(GL_CULL_FACE),
+ mDepthTest(GL_TRUE, GL_TRUE, GL_LEQUAL)
+ { }
+};
+
+class LLGLSPipelineAlpha // : public LLGLSPipeline
+{
+protected:
+ LLGLEnable mBlend, mAlphaTest;
+public:
+ LLGLSPipelineAlpha()
+ : mBlend(GL_BLEND),
+ mAlphaTest(GL_ALPHA_TEST)
+ { }
+};
+
+class LLGLSPipelineEmbossBump
+{
+protected:
+ LLGLDisable mFog;
+public:
+ LLGLSPipelineEmbossBump()
+ : mFog(GL_FOG)
+ { }
+};
+
+class LLGLSPipelineSelection
+{
+protected:
+ LLGLDisable mCullFace;
+public:
+ LLGLSPipelineSelection()
+ : mCullFace(GL_CULL_FACE)
+ {}
+};
+
+class LLGLSPipelineAvatar
+{
+protected:
+ LLGLEnable mNormalize;
+public:
+ LLGLSPipelineAvatar()
+ : mNormalize(GL_NORMALIZE)
+ {}
+};
+
+class LLGLSPipelineSkyBox
+{
+protected:
+ LLGLDisable mAlphaTest, mCullFace, mFog;
+public:
+ LLGLSPipelineSkyBox()
+ : mAlphaTest(GL_ALPHA_TEST), mCullFace(GL_CULL_FACE), mFog(GL_FOG)
+ { }
+};
+
+class LLGLSTracker
+{
+protected:
+ LLGLEnable mCullFace, mBlend, mAlphaTest;
+public:
+ LLGLSTracker() :
+ mCullFace(GL_CULL_FACE),
+ mBlend(GL_BLEND),
+ mAlphaTest(GL_ALPHA_TEST)
+
+ { }
+};
+
+//----------------------------------------------------------------------------
+
+class LLGLSSpecular
+{
+public:
+ LLGLSSpecular(const LLColor4& color, F32 shininess)
+ {
+ if (shininess > 0.0f)
+ {
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, color.mV);
+ S32 shiny = (S32)(shininess*128.f);
+ shiny = llclamp(shiny,0,128);
+ glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, shiny);
+ }
+ }
+ ~LLGLSSpecular()
+ {
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, LLColor4(0.f,0.f,0.f,0.f).mV);
+ glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 0);
+ }
+};
+
+//----------------------------------------------------------------------------
+
+
+class LLGLSBlendFunc : public LLGLSPipeline {
+protected:
+ GLint mSavedSrc, mSavedDst;
+ LLGLEnable mBlend;
+
+public:
+ LLGLSBlendFunc(GLenum srcFunc, GLenum dstFunc) :
+ mBlend(GL_BLEND)
+ {
+ glGetIntegerv(GL_BLEND_SRC, &mSavedSrc);
+ glGetIntegerv(GL_BLEND_DST, &mSavedDst);
+ glBlendFunc(srcFunc, dstFunc);
+ }
+
+ ~LLGLSBlendFunc(void) {
+ glBlendFunc(mSavedSrc, mSavedDst);
+ }
+};
+
+
+#endif