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

Revision 3214, 6.4 KB checked in by mattausch, 16 years ago (diff)

worked on lense flare

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