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

Revision 3050, 6.4 KB checked in by mattausch, 16 years ago (diff)
Line 
1#include "RenderState.h"
2#include "Geometry.h"
3#include "Material.h"
4#include "ShaderProgram.h"
5#include "Texture.h"
6#include "ResourceManager.h"
7
8
9using namespace std;
10
11
12namespace CHCDemoEngine
13{
14
15
16/////////////////
17
18RenderState::RenderState():
19mRenderTechnique(FORWARD),
20mUseAlphaToCoverage(true),
21mLockCullFaceEnabled(false),
22mCurrentVboId(-1),
23mCurrentTexId(0),
24mCullFaceEnabled(true),
25mAlphaTestEnabled(false),
26mTexturesEnabled(false),
27mCurrentVertexProgram(NULL),
28mCurrentFragmentProgram(NULL),
29mLightingEnabled(true),
30mColorWriteEnabled(true),
31mDepthWriteEnabled(true),
32mCurrentTechnique(NULL)
33{
34        SetMode(RENDER);
35       
36        glEnable(GL_CULL_FACE);
37        glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);
38        glDisable(GL_ALPHA_TEST);
39        glDisable(GL_TEXTURE_2D);
40        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
41        glEnable(GL_LIGHTING);
42        glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
43        glDepthMask(GL_TRUE);
44}
45
46
47void RenderState::Reset()
48{
49        SetMode(RENDER);
50
51        mCurrentVboId = -1;
52        mCurrentTexId = 0;
53
54        mCullFaceEnabled = true;
55        mAlphaTestEnabled = false;
56        mTexturesEnabled = false;
57
58        mCurrentVertexProgram = NULL;
59        mCurrentFragmentProgram = NULL;
60
61        glEnable(GL_CULL_FACE);
62
63        glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);
64        glDisable(GL_ALPHA_TEST);
65
66        glDisable(GL_TEXTURE_2D);
67        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
68
69        ResourceManager::GetSingleton()->DisableFragmentProfile();
70        ResourceManager::GetSingleton()->DisableVertexProfile();
71
72        mFragmentProgramEnabled = false;
73        mVertexProgramEnabled = false;
74
75        mLightingEnabled = true;
76        glEnable(GL_LIGHTING);
77
78        mColorWriteEnabled = true;
79        glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
80
81        mDepthWriteEnabled = true;
82        glDepthMask(GL_TRUE);
83
84        mCurrentTechnique = NULL;
85}
86
87
88// q matt: is this function really necessary or would it be better
89// to just create a query material and use the setstate function?
90bool RenderState::SetMode(Mode mode)
91{
92        ///////////
93        //-- just change the mode when necessary
94
95        if (mode == mMode) return false;
96
97        mMode = mode;
98
99        if (mode == QUERY)
100        {
101                /// the query box material
102                static Technique queryTech = GetQueryTechnique();
103                SetState(&queryTech);
104        }
105
106        return true;
107}
108
109       
110void RenderState::SetState(Technique *tech)
111{
112        if (mCurrentTechnique == tech)
113                return;
114
115        mCurrentTechnique = tech;
116
117        Texture * const tex = tech->GetTexture();
118
119        const bool texturing = (tex != NULL);
120        const bool alphaTest = tech->IsAlphaTestEnabled();
121        const bool cullFace = tech->IsCullFaceEnabled();
122        const bool lighting = tech->IsLightingEnabled();
123        const bool colorWrite = tech->IsColorWriteEnabled();
124        const bool depthWrite = tech->IsDepthWriteEnabled();
125
126        if (mDepthWriteEnabled && !depthWrite)
127        {
128                mDepthWriteEnabled = false;
129                glDepthMask(GL_FALSE);
130        }
131        else if (!mDepthWriteEnabled && depthWrite)
132        {
133                mDepthWriteEnabled = true;
134                glDepthMask(GL_TRUE);
135        }
136
137        if (mLightingEnabled && !lighting)
138        {
139                mLightingEnabled = false;
140                glDisable(GL_LIGHTING);
141        }
142        else if (!mLightingEnabled && lighting)
143        {
144                mLightingEnabled = true;
145                glEnable(GL_LIGHTING);
146        }
147
148        if (mColorWriteEnabled && !colorWrite)
149        {
150                mColorWriteEnabled = false;
151                glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
152        }
153        else if (!mColorWriteEnabled && colorWrite)
154        {
155                mColorWriteEnabled = true;
156                glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
157        }
158
159        if (!mLockCullFaceEnabled)
160        {
161                if (mCullFaceEnabled && !cullFace)
162                {
163                        mCullFaceEnabled = false;
164                        glDisable(GL_CULL_FACE);
165                }
166                else if (!mCullFaceEnabled && cullFace)
167                {
168                        mCullFaceEnabled = true;
169                        glEnable(GL_CULL_FACE);
170                }
171        }
172        if (mAlphaTestEnabled && !alphaTest)
173        {
174                mAlphaTestEnabled = false;
175               
176                if (mUseAlphaToCoverage)
177                        glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);
178                else
179                        glDisable(GL_ALPHA_TEST);
180        }
181        else if (!mAlphaTestEnabled && alphaTest)
182        {
183                mAlphaTestEnabled = true;
184               
185                if (mUseAlphaToCoverage)
186                        glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);
187                else
188                        glEnable(GL_ALPHA_TEST);
189        }
190
191        if (mTexturesEnabled && !texturing)
192        {
193                mTexturesEnabled = false;
194
195                //if (!tech->GetFragmentProgram())
196                        glDisable(GL_TEXTURE_2D);
197
198                glDisableClientState(GL_TEXTURE_COORD_ARRAY);
199        }
200        else if (!mTexturesEnabled && texturing)
201        {
202                mTexturesEnabled = true;
203
204                //if (!tech->GetFragmentProgram())
205                        glEnable(GL_TEXTURE_2D);
206
207                glEnableClientState(GL_TEXTURE_COORD_ARRAY);
208        }
209
210
211        //////////////////
212        //-- fragment and vertex programs
213       
214        ShaderProgram *frag = tech->GetFragmentProgram();
215
216        if (frag)
217        {
218                if (!mFragmentProgramEnabled)
219                {
220                        mFragmentProgramEnabled = true;
221                        ResourceManager::GetSingleton()->EnableFragmentProfile();
222                }
223
224                if (frag != mCurrentFragmentProgram)
225                {                       
226                        mCurrentFragmentProgram = frag;
227                        mCurrentFragmentProgram->Bind();                       
228                }
229                       
230                tech->GetFragmentProgramParameters()->UpdateParameters();
231        }
232        else
233        {
234                if (mFragmentProgramEnabled)
235                {
236                        mFragmentProgramEnabled = false;
237                        ResourceManager::GetSingleton()->DisableFragmentProfile();
238                }
239        }
240
241        ShaderProgram *vert = tech->GetVertexProgram();
242
243        if (vert)
244        {
245                if (!mVertexProgramEnabled)
246                {
247                        mVertexProgramEnabled = true;
248                        ResourceManager::GetSingleton()->EnableVertexProfile();
249                }
250
251                if (vert != mCurrentVertexProgram)
252                {
253                        mCurrentVertexProgram = vert;
254                        mCurrentVertexProgram->Bind();
255                }
256               
257                tech->GetVertexProgramParameters()->UpdateParameters();
258        }
259        else
260        {
261                if (mVertexProgramEnabled)
262                {
263                        mVertexProgramEnabled = false;
264                        ResourceManager::GetSingleton()->DisableVertexProfile();
265                }
266        }
267
268        if (!mFragmentProgramEnabled)
269        {
270                // set texture for fixed function rendering
271                if (tex)
272                {
273                        if (mCurrentTexId != tex->GetId())
274                        {
275                                tex->Bind();
276                                mCurrentTexId = tex->GetId();
277                        }
278                }
279                else
280                {
281                        mCurrentTexId = -1;
282                        glBindTexture(GL_TEXTURE_2D, 0);
283                }
284        }
285}
286
287
288Technique RenderState::GetQueryTechnique()
289{
290        Technique tech;
291
292        tech.Init();
293
294        tech.SetColorWriteEnabled(false);
295        tech.SetLightingEnabled(false);
296        tech.SetDepthWriteEnabled(false);
297
298        return tech;
299}
300
301
302void RenderState::SetUseAlphaToCoverage(bool useAlphaToCoverage)
303{
304        mUseAlphaToCoverage = useAlphaToCoverage;
305}
306
307
308void RenderState::SetRenderTechnique(RenderTechnique t)
309{
310        mRenderTechnique = t;
311}
312
313
314RenderState::RenderTechnique RenderState::GetRenderTechnique() const
315{
316        return mRenderTechnique;
317}
318
319
320void RenderState::LockCullFaceEnabled(bool lockCull)
321{
322        mLockCullFaceEnabled =  lockCull;
323}
324
325
326}
Note: See TracBrowser for help on using the repository browser.