source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/RenderState.cpp @ 2965

Revision 2965, 3.6 KB checked in by mattausch, 16 years ago (diff)

removed dirttexture stuff. started tonemapping stuff

RevLine 
[2769]1#include "RenderState.h"
2#include "Geometry.h"
3#include "Material.h"
4
[2861]5using namespace std;
[2769]6
[2776]7namespace CHCDemoEngine
[2769]8{
9
[2818]10CGprofile RenderState::sCgFragmentProfile;
11CGprofile RenderState::sCgVertexProfile;
[2769]12
[2819]13CGprogram RenderState::sCgMrtFragmentProgram = NULL;
14CGprogram RenderState::sCgMrtFragmentTexProgram = NULL;
[2964]15CGparameter RenderState::sTexParam;
[2818]16
[2819]17
[2964]18
[2825]19/////////////////
20
[2769]21RenderState::RenderState():
[2773]22mAlphaTestEnabled(false),
[2844]23mCullFaceEnabled(true),
[2773]24mTexturesEnabled(false),
[2801]25mMode(RENDER),
[2943]26mRenderType(FIXED),
[2955]27mUseAlphaToCoverage(true),
28mLockCullFaceEnabled(false)
[2769]29{
30        Reset();
31}
32
33       
34bool RenderState::SetState(Mode mode)
35{
[2800]36        ///////////
[2769]37        //-- just change the modewhen necessary
[2800]38
[2769]39        if (mode == mMode) return false;
40
41        mMode = mode;
42
43        if (mode == QUERY)
44        {
[2825]45                if (mRenderType != DEPTH_PASS)
[2801]46                {
47                        glDisable(GL_LIGHTING);
48                        glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
[2818]49
[2825]50                        if (mRenderType == DEFERRED)
51                        {
52                                cgGLDisableProfile(sCgFragmentProfile);
53                                cgGLDisableProfile(sCgVertexProfile);
54                        }
[2801]55                }
56
[2769]57                glDepthMask(GL_FALSE);
58
[2844]59                SetState(false, false, false);
[2769]60        }
61        else // mode returns to render
62        {
63                /////////////
64                //-- restore render state
65
[2825]66                if (mRenderType != DEPTH_PASS)
[2801]67                {
68                        glEnable(GL_LIGHTING);
69                        glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
[2818]70
[2825]71                        if (mRenderType == DEFERRED)
72                        {
73                                cgGLEnableProfile(sCgFragmentProfile);
74                                cgGLEnableProfile(sCgVertexProfile);
75                        }
[2801]76                }
77
[2769]78                glDepthMask(GL_TRUE);
79        }
80
81        return true;
82}
83
84       
[2844]85void RenderState::SetState(bool texturing, bool alphaTest, bool cullFace)
[2769]86{
[2955]87        if (!mLockCullFaceEnabled)
[2844]88        {
[2955]89                if (mCullFaceEnabled && !cullFace)
90                {
91                        mCullFaceEnabled = false;
92                        glDisable(GL_CULL_FACE);
93                }
94                else if (!mCullFaceEnabled && cullFace)
95                {
96                        mCullFaceEnabled = true;
97                        glEnable(GL_CULL_FACE);
98                }
[2844]99        }
[2769]100        if (mAlphaTestEnabled && !alphaTest)
101        {
102                mAlphaTestEnabled = false;
[2851]103               
[2950]104                if (mUseAlphaToCoverage)
[2943]105                        glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);
[2950]106                else
[2943]107                        glDisable(GL_ALPHA_TEST);
[2769]108        }
109        else if (!mAlphaTestEnabled && alphaTest)
110        {
111                mAlphaTestEnabled = true;
[2851]112               
[2950]113                if (mUseAlphaToCoverage)
[2943]114                        glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);
115                else
116                        glEnable(GL_ALPHA_TEST);
[2769]117        }
[2801]118
119        if (mTexturesEnabled &&
[2825]120                (!texturing || (mRenderType == DEPTH_PASS) && !mAlphaTestEnabled))
[2801]121        {
122                mTexturesEnabled = false;
[2819]123
[2825]124                if (mRenderType == DEFERRED)
125                        cgGLBindProgram(sCgMrtFragmentProgram);
[2819]126
[2801]127                glDisable(GL_TEXTURE_2D);
128                glDisableClientState(GL_TEXTURE_COORD_ARRAY);
129        }
130        else if (!mTexturesEnabled && texturing)
131        {
[2825]132                // support only alpha textures in depth pass
133                if ((mRenderType != DEPTH_PASS) || mAlphaTestEnabled)
[2801]134                {
135                        mTexturesEnabled = true;
[2819]136
[2825]137                        if (mRenderType == DEFERRED)
138                                cgGLBindProgram(sCgMrtFragmentTexProgram);
[2819]139
[2801]140                        glEnable(GL_TEXTURE_2D);
141                        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
142                }
143        }
[2769]144}
145
146
147void RenderState::Reset()
148{
[2773]149        mCurrentVboId = -1;
[2825]150
[2955]151        mCullFaceEnabled = true;
152        glEnable(GL_CULL_FACE);
153       
154        mAlphaTestEnabled = false;
155       
156        glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);
157        glDisable(GL_ALPHA_TEST);
158
159        mTexturesEnabled = false;
160
161        glDisable(GL_TEXTURE_2D);
162        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
163
[2769]164        SetState(RENDER);
165}
166
167
[2943]168void RenderState::SetUseAlphaToCoverage(bool useAlphaToCoverage)
169{
170        mUseAlphaToCoverage = useAlphaToCoverage;
171}
172
173
[2955]174void RenderState::SetRenderPassType(RenderPassType t)
175{
176        mRenderType = t;
177}
178
179
180RenderState::RenderPassType RenderState::GetRenderPassType() const
181{
182        return mRenderType;
183}
184
185
186void RenderState::LockCullFaceEnabled(bool lockCull)
187{
188        mLockCullFaceEnabled =  lockCull;
189}
190
191
[2769]192}
Note: See TracBrowser for help on using the repository browser.