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

Revision 2845, 2.6 KB checked in by mattausch, 16 years ago (diff)
Line 
1#include "RenderState.h"
2#include "Geometry.h"
3#include "Material.h"
4
5
6namespace CHCDemoEngine
7{
8
9CGprofile RenderState::sCgFragmentProfile;
10CGprofile RenderState::sCgVertexProfile;
11
12CGprogram RenderState::sCgMrtFragmentProgram = NULL;
13CGprogram RenderState::sCgMrtFragmentTexProgram = NULL;
14
15
16/////////////////
17
18RenderState::RenderState():
19mAlphaTestEnabled(false),
20mCullFaceEnabled(true),
21mTexturesEnabled(false),
22mMode(RENDER),
23mRenderType(FIXED)
24{
25        Reset();
26}
27
28       
29bool RenderState::SetState(Mode mode)
30{
31        ///////////
32        //-- just change the modewhen necessary
33
34        if (mode == mMode) return false;
35
36        mMode = mode;
37
38        if (mode == QUERY)
39        {
40                if (mRenderType != DEPTH_PASS)
41                {
42                        glDisable(GL_LIGHTING);
43                        glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
44
45                        if (mRenderType == DEFERRED)
46                        {
47                                cgGLDisableProfile(sCgFragmentProfile);
48                                cgGLDisableProfile(sCgVertexProfile);
49                        }
50                }
51
52                glDepthMask(GL_FALSE);
53
54                SetState(false, false, false);
55        }
56        else // mode returns to render
57        {
58                /////////////
59                //-- restore render state
60
61                if (mRenderType != DEPTH_PASS)
62                {
63                        glEnable(GL_LIGHTING);
64                        glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
65
66                        if (mRenderType == DEFERRED)
67                        {
68                                cgGLEnableProfile(sCgFragmentProfile);
69                                cgGLEnableProfile(sCgVertexProfile);
70                        }
71                }
72
73                glDepthMask(GL_TRUE);
74        }
75
76        return true;
77}
78
79       
80void RenderState::SetState(bool texturing, bool alphaTest, bool cullFace)
81{
82        if (mCullFaceEnabled && !cullFace)
83        {
84                mCullFaceEnabled = false;
85                glDisable(GL_CULL_FACE);
86        }
87        else if (!mCullFaceEnabled && cullFace)
88        {
89                mCullFaceEnabled = true;
90                glEnable(GL_CULL_FACE);
91        }
92
93        if (mAlphaTestEnabled && !alphaTest)
94        {
95                mAlphaTestEnabled = false;
96                glDisable(GL_ALPHA_TEST);
97        }
98        else if (!mAlphaTestEnabled && alphaTest)
99        {
100                mAlphaTestEnabled = true;
101                glEnable(GL_ALPHA_TEST);
102        }
103
104        if (mTexturesEnabled &&
105                (!texturing || (mRenderType == DEPTH_PASS) && !mAlphaTestEnabled))
106        {
107                mTexturesEnabled = false;
108
109                if (mRenderType == DEFERRED)
110                        cgGLBindProgram(sCgMrtFragmentProgram);
111
112                glDisable(GL_TEXTURE_2D);
113                glDisableClientState(GL_TEXTURE_COORD_ARRAY);
114        }
115        else if (!mTexturesEnabled && texturing)
116        {
117                // support only alpha textures in depth pass
118                if ((mRenderType != DEPTH_PASS) || mAlphaTestEnabled)
119                {
120                        mTexturesEnabled = true;
121
122                        if (mRenderType == DEFERRED)
123                                cgGLBindProgram(sCgMrtFragmentTexProgram);
124
125                        glEnable(GL_TEXTURE_2D);
126                        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
127                }
128        }
129}
130
131
132void RenderState::Reset()
133{
134        mCurrentVboId = -1;
135
136        SetState(false, false, true);
137        SetState(RENDER);
138}
139
140
141}
Note: See TracBrowser for help on using the repository browser.