/** * @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 }; //---------------------------------------------------------------------------- struct LLGLSDefault { private: LLGLEnable mColorMaterial; LLGLDisable mAlphaTest; LLGLDisable mBlend; LLGLDisable mCullFace; LLGLDisable mDither; LLGLDisable mFog; LLGLDisable mLineSmooth; LLGLDisable mLineStipple; LLGLDisable mNormalize; LLGLDisable mPolygonSmooth; LLGLDisable mGLMultisample; LLGLDisable lighting; }; struct LLGLSObjectSelect { private: LLGLDisable mBlend; LLGLDisable mAlphaTest; LLGLDisable mFog; LLGLEnable mCullFace; }; struct LLGLSObjectSelectAlpha { private: LLGLEnable mAlphaTest; }; //---------------------------------------------------------------------------- struct LLGLSUIDefault { private: LLGLEnable mBlend; LLGLEnable mAlphaTest; LLGLDisable mCullFace; LLGLDisable mMSAA; //LLGLEnable mScissor; LLGLDepthTest mDepthTest; public: LLGLSUIDefault() : mDepthTest(GL_FALSE, GL_TRUE, GL_LEQUAL) {} }; struct LLGLSNoAlphaTest // : public LLGLSUIDefault { private: LLGLDisable mAlphaTest; }; //---------------------------------------------------------------------------- struct LLGLSFog { private: LLGLEnable mFog; }; struct LLGLSNoFog { private: LLGLDisable mFog; }; //---------------------------------------------------------------------------- struct LLGLSPipeline { private: LLGLEnable mCullFace; LLGLDepthTest mDepthTest; public: LLGLSPipeline() : mDepthTest(GL_TRUE, GL_TRUE, GL_LEQUAL) {} }; struct LLGLSPipelineAlpha // : public LLGLSPipeline { private: LLGLEnable mAlphaTest; LLGLEnable mBlend; }; struct LLGLSPipelineEmbossBump { private: LLGLDisable mFog; }; struct LLGLSPipelineSelection { private: LLGLDisable mCullFace; }; struct LLGLSPipelineAvatar { private: LLGLEnable mNormalize; }; struct LLGLSPipelineSkyBox { private: LLGLDisable mAlphaTest; LLGLDisable mCullFace; LLGLDisable mFog; LLGLDisable mLighting; }; struct LLGLSTracker { private: LLGLEnable mAlphaTest; LLGLEnable mBlend; LLGLEnable mCullFace; }; //---------------------------------------------------------------------------- class LLGLSSpecular { public: F32 mShininess; LLGLSSpecular(const LLColor4& color, F32 shininess) { mShininess = shininess; if (mShininess > 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() { if (mShininess > 0.f) { 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); } } }; //---------------------------------------------------------------------------- #endif