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

Revision 3127, 6.6 KB checked in by mattausch, 16 years ago (diff)
RevLine 
[2769]1#include "RenderState.h"
2#include "Geometry.h"
3#include "Material.h"
[3028]4#include "ShaderProgram.h"
5#include "Texture.h"
[3057]6#include "ShaderManager.h"
[2769]7
[3038]8
[2861]9using namespace std;
[2769]10
[3038]11
[2776]12namespace CHCDemoEngine
[2769]13{
14
15
[2825]16/////////////////
17
[2769]18RenderState::RenderState():
[3068]19mRenderTechnique(0),
[2955]20mUseAlphaToCoverage(true),
[3050]21mLockCullFaceEnabled(false),
22mCurrentVboId(-1),
23mCurrentTexId(0),
24mCullFaceEnabled(true),
25mAlphaTestEnabled(false),
26mTexturesEnabled(false),
27mCurrentVertexProgram(NULL),
28mCurrentFragmentProgram(NULL),
29mLightingEnabled(true),
30mColorWriteEnabled(true),
31mDepthWriteEnabled(true),
32mCurrentTechnique(NULL)
[2769]33{
[3038]34        SetMode(RENDER);
[3050]35       
[3038]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);
[3050]41        glEnable(GL_LIGHTING);
42        glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
43        glDepthMask(GL_TRUE);
[2769]44}
45
[3038]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
[3057]69        ShaderManager::GetSingleton()->DisableFragmentProfile();
70        ShaderManager::GetSingleton()->DisableVertexProfile();
[3043]71
72        mFragmentProgramEnabled = false;
73        mVertexProgramEnabled = false;
[3050]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;
[3038]85}
86
[3050]87
[3065]88static Technique GetDummyTechnique()
89{
90        Technique tech;
91        tech.Init();
92
93        tech.SetColorWriteEnabled(true);
94        tech.SetLightingEnabled(true);
95        tech.SetDepthWriteEnabled(false);
96        //tech.SetCullFaceEnabled(false);
97
98        return tech;
99}
100
101/** A special technique for occlusion queries. This material
102        has color write, depth write, and lighting turned off
103*/
104static Technique GetQueryTechnique()
105{
106        Technique tech;
107        tech.Init();
108
109        tech.SetColorWriteEnabled(false);
110        tech.SetLightingEnabled(false);
111        tech.SetDepthWriteEnabled(false);
112        //tech.SetCullFaceEnabled(false);
113
114        return tech;
115}
116
117
[3031]118bool RenderState::SetMode(Mode mode)
[2769]119{
[2800]120        ///////////
[3050]121        //-- just change the mode when necessary
[2800]122
[2769]123        if (mode == mMode) return false;
124
125        mMode = mode;
126
127        if (mode == QUERY)
128        {
[3048]129                /// the query box material
[3050]130                static Technique queryTech = GetQueryTechnique();
[3066]131                SetState(&queryTech);
[3127]132
133                glDisableClientState(GL_NORMAL_ARRAY);
[2769]134        }
[3127]135        else
136        {
137                glEnableClientState(GL_NORMAL_ARRAY);
138        }
[2769]139
140        return true;
141}
142
143       
[3114]144void RenderState::SetState(Technique *tech, SceneEntity *ent)
[2769]145{
[3114]146        //if (mCurrentTechnique == tech) return;
[3050]147        mCurrentTechnique = tech;
148
149        Texture * const tex = tech->GetTexture();
150
[3031]151        const bool texturing = (tex != NULL);
[3050]152        const bool alphaTest = tech->IsAlphaTestEnabled();
153        const bool cullFace = tech->IsCullFaceEnabled();
154        const bool lighting = tech->IsLightingEnabled();
155        const bool colorWrite = tech->IsColorWriteEnabled();
156        const bool depthWrite = tech->IsDepthWriteEnabled();
[3031]157
[3114]158
[3050]159        if (mDepthWriteEnabled && !depthWrite)
160        {
161                mDepthWriteEnabled = false;
162                glDepthMask(GL_FALSE);
163        }
164        else if (!mDepthWriteEnabled && depthWrite)
165        {
166                mDepthWriteEnabled = true;
167                glDepthMask(GL_TRUE);
168        }
[3034]169
[3050]170        if (mLightingEnabled && !lighting)
171        {
172                mLightingEnabled = false;
173                glDisable(GL_LIGHTING);
174        }
175        else if (!mLightingEnabled && lighting)
176        {
177                mLightingEnabled = true;
178                glEnable(GL_LIGHTING);
179        }
180
181        if (mColorWriteEnabled && !colorWrite)
182        {
183                mColorWriteEnabled = false;
184                glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
185        }
186        else if (!mColorWriteEnabled && colorWrite)
187        {
188                mColorWriteEnabled = true;
189                glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
190        }
191
[2955]192        if (!mLockCullFaceEnabled)
[2844]193        {
[2955]194                if (mCullFaceEnabled && !cullFace)
195                {
196                        mCullFaceEnabled = false;
197                        glDisable(GL_CULL_FACE);
198                }
199                else if (!mCullFaceEnabled && cullFace)
200                {
201                        mCullFaceEnabled = true;
202                        glEnable(GL_CULL_FACE);
203                }
[2844]204        }
[2769]205        if (mAlphaTestEnabled && !alphaTest)
206        {
207                mAlphaTestEnabled = false;
[2851]208               
[2950]209                if (mUseAlphaToCoverage)
[2943]210                        glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);
[2950]211                else
[2943]212                        glDisable(GL_ALPHA_TEST);
[2769]213        }
214        else if (!mAlphaTestEnabled && alphaTest)
215        {
216                mAlphaTestEnabled = true;
[2851]217               
[2950]218                if (mUseAlphaToCoverage)
[2943]219                        glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);
220                else
221                        glEnable(GL_ALPHA_TEST);
[2769]222        }
[2801]223
[3048]224        if (mTexturesEnabled && !texturing)
[2801]225        {
226                mTexturesEnabled = false;
[3127]227                glDisable(GL_TEXTURE_2D);
[2819]228
[2801]229                glDisableClientState(GL_TEXTURE_COORD_ARRAY);
230        }
231        else if (!mTexturesEnabled && texturing)
232        {
[3050]233                mTexturesEnabled = true;
[2819]234
[3127]235                glEnable(GL_TEXTURE_2D);
[3050]236                glEnableClientState(GL_TEXTURE_COORD_ARRAY);
[2801]237        }
[3031]238
[3050]239
[3126]240        // set texture for fixed function rendering
241        if (tex)
242        {
243                if (mCurrentTexId != tex->GetId())
244                {
245                        tex->Bind();
246                        mCurrentTexId = tex->GetId();
247                }
248        }
249        else
250        {
251                mCurrentTexId = -1;
252                glBindTexture(GL_TEXTURE_2D, 0);
253        }
254
255
[3050]256        //////////////////
[3043]257        //-- fragment and vertex programs
258       
259        ShaderProgram *frag = tech->GetFragmentProgram();
260
261        if (frag)
[3034]262        {
[3043]263                if (!mFragmentProgramEnabled)
[3034]264                {
[3043]265                        mFragmentProgramEnabled = true;
[3057]266                        ShaderManager::GetSingleton()->EnableFragmentProfile();
[3043]267                }
[3038]268
[3043]269                if (frag != mCurrentFragmentProgram)
270                {                       
271                        mCurrentFragmentProgram = frag;
272                        mCurrentFragmentProgram->Bind();                       
[3034]273                }
[3043]274                       
[3114]275                tech->GetFragmentProgramParameters()->UpdateParameters(ent);
[3043]276        }
277        else
278        {
279                if (mFragmentProgramEnabled)
280                {
281                        mFragmentProgramEnabled = false;
[3057]282                        ShaderManager::GetSingleton()->DisableFragmentProfile();
[3043]283                }
284        }
[3042]285
[3114]286        ShaderProgram *vtx = tech->GetVertexProgram();
[3042]287
[3114]288        if (vtx)
[3043]289        {
290                if (!mVertexProgramEnabled)
[3034]291                {
[3043]292                        mVertexProgramEnabled = true;
[3057]293                        ShaderManager::GetSingleton()->EnableVertexProfile();
[3043]294                }
295
[3114]296                if (vtx != mCurrentVertexProgram)
[3043]297                {
[3114]298                        mCurrentVertexProgram = vtx;
[3043]299                        mCurrentVertexProgram->Bind();
300                }
[3039]301               
[3114]302                tech->GetVertexProgramParameters()->UpdateParameters(ent);
[3034]303        }
304        else
305        {
[3043]306                if (mVertexProgramEnabled)
307                {
308                        mVertexProgramEnabled = false;
[3057]309                        ShaderManager::GetSingleton()->DisableVertexProfile();
[3043]310                }
311        }
[2769]312}
313
314
[2943]315void RenderState::SetUseAlphaToCoverage(bool useAlphaToCoverage)
316{
317        mUseAlphaToCoverage = useAlphaToCoverage;
318}
319
320
[3068]321void RenderState::SetRenderTechnique(int t)
[2955]322{
[3048]323        mRenderTechnique = t;
[2955]324}
325
326
[3068]327int RenderState::GetRenderTechnique() const
[2955]328{
[3048]329        return mRenderTechnique;
[2955]330}
331
332
333void RenderState::LockCullFaceEnabled(bool lockCull)
334{
335        mLockCullFaceEnabled =  lockCull;
336}
337
338
[3074]339
[2769]340}
Note: See TracBrowser for help on using the repository browser.