#include "RenderState.h" #include "Geometry.h" #include "Material.h" namespace CHCDemoEngine { CGprofile RenderState::sCgFragmentProfile; CGprofile RenderState::sCgVertexProfile; CGprogram RenderState::sCgMrtFragmentProgram = NULL; CGprogram RenderState::sCgMrtFragmentTexProgram = NULL; ///////////////// RenderState::RenderState(): mAlphaTestEnabled(false), mTexturesEnabled(false), mMode(RENDER), mRenderType(FIXED) { Reset(); } bool RenderState::SetState(Mode mode) { /////////// //-- just change the modewhen necessary if (mode == mMode) return false; mMode = mode; if (mode == QUERY) { if (mRenderType != DEPTH_PASS) { glDisable(GL_LIGHTING); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); if (mRenderType == DEFERRED) { cgGLDisableProfile(sCgFragmentProfile); cgGLDisableProfile(sCgVertexProfile); } } glDepthMask(GL_FALSE); SetState(false, false); } else // mode returns to render { ///////////// //-- restore render state if (mRenderType != DEPTH_PASS) { glEnable(GL_LIGHTING); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); if (mRenderType == DEFERRED) { cgGLEnableProfile(sCgFragmentProfile); cgGLEnableProfile(sCgVertexProfile); } } glDepthMask(GL_TRUE); } return true; } void RenderState::SetState(bool texturing, bool alphaTest) { if (mAlphaTestEnabled && !alphaTest) { mAlphaTestEnabled = false; glDisable(GL_ALPHA_TEST); } else if (!mAlphaTestEnabled && alphaTest) { mAlphaTestEnabled = true; glEnable(GL_ALPHA_TEST); } if (mTexturesEnabled && (!texturing || (mRenderType == DEPTH_PASS) && !mAlphaTestEnabled)) { mTexturesEnabled = false; if (mRenderType == DEFERRED) cgGLBindProgram(sCgMrtFragmentProgram); glDisable(GL_TEXTURE_2D); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } else if (!mTexturesEnabled && texturing) { // support only alpha textures in depth pass if ((mRenderType != DEPTH_PASS) || mAlphaTestEnabled) { mTexturesEnabled = true; if (mRenderType == DEFERRED) cgGLBindProgram(sCgMrtFragmentTexProgram); glEnable(GL_TEXTURE_2D); glEnableClientState(GL_TEXTURE_COORD_ARRAY); } } } void RenderState::Reset() { mCurrentVboId = -1; SetState(false, false); SetState(RENDER); } }