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

Revision 2943, 3.0 KB checked in by mattausch, 16 years ago (diff)

shadows working nicely

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