00001
00032
00033 #ifndef LL_LLGLSTATES_H
00034 #define LL_LLGLSTATES_H
00035
00036 #include "llimagegl.h"
00037
00038
00039
00040 class LLGLDepthTest
00041 {
00042
00043 public:
00044 LLGLDepthTest(GLboolean depth_enabled, GLboolean write_enabled = GL_TRUE, GLenum depth_func = GL_LEQUAL);
00045
00046 ~LLGLDepthTest();
00047
00048 GLboolean mPrevDepthEnabled;
00049 GLenum mPrevDepthFunc;
00050 GLboolean mPrevWriteEnabled;
00051 private:
00052 static GLboolean sDepthEnabled;
00053 static GLenum sDepthFunc;
00054 static GLboolean sWriteEnabled;
00055 };
00056
00057
00058
00059 class LLGLSDefault
00060 {
00061 protected:
00062 LLGLEnable mColorMaterial;
00063 LLGLDisable mAlphaTest, mBlend, mCullFace, mDither, mFog,
00064 mLineSmooth, mLineStipple, mNormalize, mPolygonSmooth,
00065 mTextureGenQ, mTextureGenR, mTextureGenS, mTextureGenT,
00066 mGLMultisample;
00067 public:
00068 LLGLSDefault()
00069 :
00070
00071 mColorMaterial(GL_COLOR_MATERIAL),
00072
00073 mAlphaTest(GL_ALPHA_TEST),
00074 mBlend(GL_BLEND),
00075 mCullFace(GL_CULL_FACE),
00076 mDither(GL_DITHER),
00077 mFog(GL_FOG),
00078 mLineSmooth(GL_LINE_SMOOTH),
00079 mLineStipple(GL_LINE_STIPPLE),
00080 mNormalize(GL_NORMALIZE),
00081 mPolygonSmooth(GL_POLYGON_SMOOTH),
00082 mTextureGenQ(GL_TEXTURE_GEN_Q),
00083 mTextureGenR(GL_TEXTURE_GEN_R),
00084 mTextureGenS(GL_TEXTURE_GEN_S),
00085 mTextureGenT(GL_TEXTURE_GEN_T),
00086 mGLMultisample(GL_MULTISAMPLE_ARB)
00087 { }
00088 };
00089
00090 class LLGLSNoTexture
00091 {
00092 public:
00093 LLGLSNoTexture()
00094 { LLImageGL::unbindTexture(0); }
00095 };
00096
00097 class LLGLSObjectSelect
00098 {
00099 protected:
00100 LLGLDisable mBlend, mFog, mAlphaTest;
00101 LLGLEnable mCullFace;
00102 public:
00103 LLGLSObjectSelect()
00104 : mBlend(GL_BLEND), mFog(GL_FOG),
00105 mAlphaTest(GL_ALPHA_TEST),
00106 mCullFace(GL_CULL_FACE)
00107 { LLImageGL::unbindTexture(0); }
00108 };
00109
00110 class LLGLSObjectSelectAlpha
00111 {
00112 protected:
00113 LLGLEnable mAlphaTest;
00114 public:
00115 LLGLSObjectSelectAlpha()
00116 : mAlphaTest(GL_ALPHA_TEST)
00117 {}
00118 };
00119
00120
00121
00122 class LLGLSUIDefault
00123 {
00124 protected:
00125 LLGLEnable mBlend, mAlphaTest;
00126 LLGLDisable mCullFace;
00127 LLGLDepthTest mDepthTest;
00128 public:
00129 LLGLSUIDefault()
00130 : mBlend(GL_BLEND), mAlphaTest(GL_ALPHA_TEST),
00131 mCullFace(GL_CULL_FACE),
00132 mDepthTest(GL_FALSE, GL_TRUE, GL_LEQUAL)
00133 {}
00134 };
00135
00136 class LLGLSNoAlphaTest
00137 {
00138 protected:
00139 LLGLDisable mAlphaTest;
00140 public:
00141 LLGLSNoAlphaTest()
00142 : mAlphaTest(GL_ALPHA_TEST)
00143 {}
00144 };
00145
00146 class LLGLSNoTextureNoAlphaTest
00147 {
00148 protected:
00149 LLGLDisable mAlphaTest;
00150 public:
00151 LLGLSNoTextureNoAlphaTest()
00152 : mAlphaTest(GL_ALPHA_TEST)
00153
00154 { LLImageGL::unbindTexture(0); }
00155 };
00156
00157
00158
00159 class LLGLSFog
00160 {
00161 protected:
00162 LLGLEnable mFog;
00163 public:
00164 LLGLSFog()
00165 : mFog(GL_FOG)
00166 {}
00167 };
00168
00169 class LLGLSNoFog
00170 {
00171 protected:
00172 LLGLDisable mFog;
00173 public:
00174 LLGLSNoFog()
00175 : mFog(GL_FOG)
00176 {}
00177 };
00178
00179
00180
00181 class LLGLSPipeline
00182 {
00183 protected:
00184 LLGLEnable mCullFace;
00185 LLGLDepthTest mDepthTest;
00186 public:
00187 LLGLSPipeline()
00188 : mCullFace(GL_CULL_FACE),
00189 mDepthTest(GL_TRUE, GL_TRUE, GL_LEQUAL)
00190 { }
00191 };
00192
00193 class LLGLSPipelineAlpha
00194 {
00195 protected:
00196 LLGLEnable mBlend, mAlphaTest;
00197 public:
00198 LLGLSPipelineAlpha()
00199 : mBlend(GL_BLEND),
00200 mAlphaTest(GL_ALPHA_TEST)
00201 { }
00202 };
00203
00204 class LLGLSPipelineEmbossBump
00205 {
00206 protected:
00207 LLGLDisable mFog;
00208 public:
00209 LLGLSPipelineEmbossBump()
00210 : mFog(GL_FOG)
00211 { }
00212 };
00213
00214 class LLGLSPipelineSelection
00215 {
00216 protected:
00217 LLGLDisable mCullFace;
00218 public:
00219 LLGLSPipelineSelection()
00220 : mCullFace(GL_CULL_FACE)
00221 {}
00222 };
00223
00224 class LLGLSPipelineAvatar
00225 {
00226 protected:
00227 LLGLEnable mNormalize;
00228 public:
00229 LLGLSPipelineAvatar()
00230 : mNormalize(GL_NORMALIZE)
00231 {}
00232 };
00233
00234 class LLGLSPipelineSkyBox
00235 {
00236 protected:
00237 LLGLDisable mAlphaTest, mCullFace, mFog;
00238 public:
00239 LLGLSPipelineSkyBox()
00240 : mAlphaTest(GL_ALPHA_TEST), mCullFace(GL_CULL_FACE), mFog(GL_FOG)
00241 { }
00242 };
00243
00244 class LLGLSTracker
00245 {
00246 protected:
00247 LLGLEnable mCullFace, mBlend, mAlphaTest;
00248 public:
00249 LLGLSTracker() :
00250 mCullFace(GL_CULL_FACE),
00251 mBlend(GL_BLEND),
00252 mAlphaTest(GL_ALPHA_TEST)
00253
00254 { LLImageGL::unbindTexture(0); }
00255 };
00256
00257
00258
00259 class LLGLSSpecular
00260 {
00261 public:
00262 LLGLSSpecular(const LLColor4& color, F32 shininess)
00263 {
00264 if (shininess > 0.0f)
00265 {
00266 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, color.mV);
00267 S32 shiny = (S32)(shininess*128.f);
00268 shiny = llclamp(shiny,0,128);
00269 glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, shiny);
00270 }
00271 }
00272 ~LLGLSSpecular()
00273 {
00274 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, LLColor4(0.f,0.f,0.f,0.f).mV);
00275 glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 0);
00276 }
00277 };
00278
00279
00280
00281
00282 class LLGLSBlendFunc : public LLGLSPipeline {
00283 protected:
00284 GLint mSavedSrc, mSavedDst;
00285 LLGLEnable mBlend;
00286
00287 public:
00288 LLGLSBlendFunc(GLenum srcFunc, GLenum dstFunc) :
00289 mBlend(GL_BLEND)
00290 {
00291 glGetIntegerv(GL_BLEND_SRC, &mSavedSrc);
00292 glGetIntegerv(GL_BLEND_DST, &mSavedDst);
00293 glBlendFunc(srcFunc, dstFunc);
00294 }
00295
00296 ~LLGLSBlendFunc(void) {
00297 glBlendFunc(mSavedSrc, mSavedDst);
00298 }
00299 };
00300
00301
00302 #endif