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

Revision 3146, 6.6 KB checked in by mattausch, 16 years ago (diff)

normal mapping hack not working yet. found problems with ssao if the geometry is not tesselated enough (especially with smoothed
normals: one can see the underlying tesselation!

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
[3146]269                if (1)//frag != mCurrentFragmentProgram)
[3043]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.