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

Revision 2965, 3.6 KB checked in by mattausch, 16 years ago (diff)

removed dirttexture stuff. started tonemapping stuff

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