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

Revision 3031, 4.0 KB checked in by mattausch, 16 years ago (diff)

shader working but slow

Line 
1#include "RenderState.h"
2#include "Geometry.h"
3#include "Material.h"
4#include "ShaderProgram.h"
5#include "Texture.h"
6
7using namespace std;
8
9namespace CHCDemoEngine
10{
11
12CGprofile RenderState::sCgFragmentProfile;
13CGprofile RenderState::sCgVertexProfile;
14
15ShaderProgram *RenderState::sCgMrtFragmentProgram = NULL;
16ShaderProgram *RenderState::sCgMrtFragmentTexProgram = NULL;
17ShaderProgram *RenderState::sCgMrtVertexProgram = NULL;
18
19
20int RenderState::sTexParam;
21
22
23
24/////////////////
25
26RenderState::RenderState():
27mAlphaTestEnabled(false),
28mCullFaceEnabled(true),
29mTexturesEnabled(false),
30mMode(RENDER),
31mRenderType(FIXED),
32mUseAlphaToCoverage(true),
33mLockCullFaceEnabled(false)
34{
35        Reset();
36}
37
38       
39bool RenderState::SetMode(Mode mode)
40{
41        ///////////
42        //-- just change the modewhen necessary
43
44        if (mode == mMode) return false;
45
46        mMode = mode;
47
48        if (mode == QUERY)
49        {
50                if (mRenderType != DEPTH_PASS)
51                {
52                        glDisable(GL_LIGHTING);
53                        glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
54
55                        if (mRenderType == DEFERRED)
56                        {
57                                cgGLDisableProfile(sCgFragmentProfile);
58                                cgGLDisableProfile(sCgVertexProfile);
59                        }
60                }
61
62                glDepthMask(GL_FALSE);
63
64                SetState(false, false, false);
65        }
66        else // mode returns to render
67        {
68                /////////////
69                //-- restore render state
70
71                if (mRenderType != DEPTH_PASS)
72                {
73                        glEnable(GL_LIGHTING);
74                        glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
75
76                        if (mRenderType == DEFERRED)
77                        {
78                                cgGLEnableProfile(sCgFragmentProfile);
79                                cgGLEnableProfile(sCgVertexProfile);
80                        }
81                }
82
83                glDepthMask(GL_TRUE);
84        }
85
86        return true;
87}
88
89       
90void RenderState::SetState(Texture *tex, bool alphaTest, bool cullFace)
91{
92        const bool texturing = (tex != NULL);
93
94        if (!mLockCullFaceEnabled)
95        {
96                if (mCullFaceEnabled && !cullFace)
97                {
98                        mCullFaceEnabled = false;
99                        glDisable(GL_CULL_FACE);
100                }
101                else if (!mCullFaceEnabled && cullFace)
102                {
103                        mCullFaceEnabled = true;
104                        glEnable(GL_CULL_FACE);
105                }
106        }
107        if (mAlphaTestEnabled && !alphaTest)
108        {
109                mAlphaTestEnabled = false;
110               
111                if (mUseAlphaToCoverage)
112                        glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);
113                else
114                        glDisable(GL_ALPHA_TEST);
115        }
116        else if (!mAlphaTestEnabled && alphaTest)
117        {
118                mAlphaTestEnabled = true;
119               
120                if (mUseAlphaToCoverage)
121                        glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);
122                else
123                        glEnable(GL_ALPHA_TEST);
124        }
125
126        if (mTexturesEnabled &&
127                (!texturing || (mRenderType == DEPTH_PASS) && !mAlphaTestEnabled))
128        {
129                mTexturesEnabled = false;
130
131                if (mRenderType == DEFERRED)
132                        sCgMrtFragmentProgram->Bind();
133                else
134                        glDisable(GL_TEXTURE_2D);
135
136                glDisableClientState(GL_TEXTURE_COORD_ARRAY);
137        }
138        else if (!mTexturesEnabled && texturing)
139        {
140                // support only alpha textures in depth pass
141                if ((mRenderType != DEPTH_PASS) || mAlphaTestEnabled)
142                {
143                        mTexturesEnabled = true;
144
145                        if (mRenderType == DEFERRED)
146                                sCgMrtFragmentTexProgram->Bind();
147                        else
148                                glEnable(GL_TEXTURE_2D);
149
150                        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
151                }
152        }
153
154        SetTexture(tex);
155}
156
157
158void RenderState::Reset()
159{
160        mCurrentVboId = -1;
161
162        mCullFaceEnabled = true;
163        glEnable(GL_CULL_FACE);
164       
165        mAlphaTestEnabled = false;
166       
167        glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);
168        glDisable(GL_ALPHA_TEST);
169
170        mTexturesEnabled = false;
171
172        glDisable(GL_TEXTURE_2D);
173        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
174
175        SetMode(RENDER);
176}
177
178
179void RenderState::SetUseAlphaToCoverage(bool useAlphaToCoverage)
180{
181        mUseAlphaToCoverage = useAlphaToCoverage;
182}
183
184
185void RenderState::SetRenderPassType(RenderPassType t)
186{
187        mRenderType = t;
188}
189
190
191RenderState::RenderPassType RenderState::GetRenderPassType() const
192{
193        return mRenderType;
194}
195
196
197void RenderState::LockCullFaceEnabled(bool lockCull)
198{
199        mLockCullFaceEnabled =  lockCull;
200}
201
202
203void RenderState::SetTexture(Texture *tex)
204{
205        if (GetRenderPassType() == RenderState::DEFERRED)
206        {
207                if (tex)
208                        RenderState::sCgMrtFragmentTexProgram->SetTexture("tex", tex->GetId());
209        }
210        else
211        {
212                if (tex)
213                        tex->Bind();
214                else
215                        glBindTexture(GL_TEXTURE_2D, 0);               
216        }
217}
218
219
220}
Note: See TracBrowser for help on using the repository browser.