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

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