source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/ShaderManager.cpp @ 3147

Revision 3147, 6.3 KB checked in by mattausch, 16 years ago (diff)

updated shader loading

Line 
1#include "Material.h"
2#include "Texture.h"
3#include "RenderState.h"
4#include "ShaderProgram.h"
5#include "ShaderManager.h"
6#include "Matrix4x4.h"
7#include <Cg/cg.h>
8#include <Cg/cgGL.h>
9
10
11#ifdef _CRT_SET
12        #define _CRTDBG_MAP_ALLOC
13        #include <stdlib.h>
14        #include <crtdbg.h>
15
16        // redefine new operator
17        #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
18        #define new DEBUG_NEW
19#endif
20
21
22using namespace std;
23
24
25namespace CHCDemoEngine
26{
27
28
29// only instance of the shader manager
30ShaderManager *ShaderManager::sShaderManager = NULL;
31
32/////////
33//-- cg stuff
34
35static CGcontext sCgContext = NULL;
36
37static CGprofile sCgFragmentProfile;
38static CGprofile sCgVertexProfile;
39
40
41
42static void cgErrorCallback()
43{
44        CGerror lastError = cgGetError();
45
46        if (lastError)
47        {
48                printf("Cg error, exiting...\n");
49
50                //Debug << "\n" << cgGetErrorString(lastError) << endl;
51                //Debug << "\n" << cgGetLastListing(sCgContext) << endl;
52
53                printf("%s\n\n", cgGetErrorString(lastError));
54                printf("%s\n", cgGetLastListing(sCgContext));
55
56                exit(0);
57        }
58}
59
60
61ShaderManager::ShaderManager()
62{
63        // setup cg
64        cgSetErrorCallback(cgErrorCallback);
65        // create context.
66        sCgContext = cgCreateContext();
67        // get the optimal fragment profile
68        sCgFragmentProfile = cgGLGetLatestProfile(CG_GL_FRAGMENT);
69        //sCgFragmentProfile = CG_PROFILE_GPU_FP;
70                //CG_PROFILE_FP40;;
71        cgGLSetOptimalOptions(sCgFragmentProfile);
72        // get the optimal vertex profile
73        sCgVertexProfile = cgGLGetLatestProfile(CG_GL_VERTEX);
74        cgGLSetOptimalOptions(sCgVertexProfile);
75
76        // set textures to auto load
77        cgGLSetManageTextureParameters(sCgContext, false);
78       
79        ///////////////
80        //-- load the defaul programs for mrt (used if not defined by the user)
81
82        ShaderProgram *vertexProgMrt, *fragmentProgMrt, *fragmentProgMrtTex;
83
84        vertexProgMrt = CreateVertexProgram("mrt", "vtx", "defaultVertexMrt");
85        fragmentProgMrt = CreateFragmentProgram("mrt", "frag", "defaultFragmentMrt");
86        fragmentProgMrtTex = CreateFragmentProgram("mrt", "fragtex", "defaultFragmentTexMrt");
87
88
89        // provide the current view matrix:
90        // this is an automatic parameter that is updated each frame
91        fragmentProgMrt->AddParameter("viewMatrix", 0);
92        fragmentProgMrtTex->AddParameter("viewMatrix", 0);
93
94
95        // vertex program
96        vertexProgMrt->AddParameter("viewMatrix", 0);
97        // needed for for ssao
98        vertexProgMrt->AddParameter("modelMatrix", 1);
99        vertexProgMrt->AddParameter("oldModelMatrix", 2);
100       
101
102
103        //////////////////////////
104        //-- hack: use hardcoded tree animation (should be provided with a material script!)
105
106        ShaderProgram *treeAnimProg, *treeAnimProgMrt;
107
108        treeAnimProg = CreateVertexProgram("treeanimation", "animateVtx", "treeAnimation");
109        treeAnimProgMrt = CreateVertexProgram("treeanimation", "animateVtxMrt", "treeAnimationMrt");
110
111        treeAnimProg->AddParameter("timer", 0);
112        treeAnimProg->AddParameter("windDir", 1);
113        treeAnimProg->AddParameter("windStrength", 2);
114        treeAnimProg->AddParameter("minMaxPos", 3);
115        treeAnimProg->AddParameter("frequency", 4);
116        treeAnimProg->AddParameter("lightDir", 5);
117
118        treeAnimProgMrt->AddParameter("timer", 0);
119        treeAnimProgMrt->AddParameter("windDir", 1);
120        treeAnimProgMrt->AddParameter("windStrength", 2);
121        treeAnimProgMrt->AddParameter("minMaxPos", 3);
122        treeAnimProgMrt->AddParameter("frequency", 4);
123        treeAnimProgMrt->AddParameter("oldTimer", 5);
124
125       
126        ShaderProgram *normalMappingVertexMrt, *normalMappingFragmentMrt;
127
128        normalMappingVertexMrt = CreateVertexProgram("normalMapping", "vtx", "normalMappingVertexMrt");
129        normalMappingFragmentMrt = CreateFragmentProgram("normalMapping", "frag", "normalMappingFragmentMrt");
130
131
132        // provide the current view matrix:
133        // this is an automatic parameter that is updated each frame
134        normalMappingFragmentMrt->AddParameter("viewMatrix", 0);
135
136        // vertex program
137        normalMappingVertexMrt->AddParameter("viewMatrix", 0);
138        // needed for for ssao
139        normalMappingVertexMrt->AddParameter("modelMatrix", 1);
140        normalMappingVertexMrt->AddParameter("oldModelMatrix", 2);
141
142
143        cout << "cg initialization successful" << endl;
144}
145
146
147void ShaderManager::DelSingleton()
148{
149        DEL_PTR(sShaderManager);
150}
151       
152
153ShaderManager::~ShaderManager()
154{
155        CLEAR_CONTAINER(mShaders);
156       
157        if (sCgContext)
158                cgDestroyContext(sCgContext);
159}
160
161
162ShaderProgram *ShaderManager::CreateFragmentProgram(const std::string &filename,
163                                                                                                        const std::string &funcName,
164                                                                                                        const std::string &name)
165{
166        return CreateShaderProgram(filename, funcName, name, true);
167}
168
169
170ShaderProgram *ShaderManager::CreateVertexProgram(const std::string &filename,
171                                                                                                  const std::string &funcName,
172                                                                                                  const std::string &name)
173{
174        return CreateShaderProgram(filename, funcName, name, false);
175}
176
177
178void ShaderManager::EnableFragmentProfile()
179{
180        cgGLEnableProfile(sCgFragmentProfile);
181}
182
183
184void ShaderManager::EnableVertexProfile()
185{
186        cgGLEnableProfile(sCgVertexProfile);
187}
188
189
190void ShaderManager::DisableFragmentProfile()
191{
192        cgGLDisableProfile(sCgFragmentProfile);
193}
194
195
196void ShaderManager::DisableVertexProfile()
197{
198        cgGLDisableProfile(sCgVertexProfile);
199}
200
201
202ShaderProgram *ShaderManager::CreateShaderProgram(const std::string &filename,
203                                                                                                  const std::string &funcName,
204                                                                                                  const std::string &name,
205                                                                                                  bool isFragment)
206{
207        const string fullName = "src/shaders/" + filename + ".cg";
208       
209        ShaderProgram *p;
210
211        if (isFragment)
212        {
213                p = new ShaderProgram(sCgContext, fullName, sCgFragmentProfile, funcName, ShaderProgram::FRAGMENT_PROGRAM);
214        }
215        else
216        {
217                p = new ShaderProgram(sCgContext, fullName, sCgVertexProfile, funcName, ShaderProgram::VERTEX_PROGRAM);
218        }
219
220        if (GetShaderProgram(name))
221        {
222                cerr << "Program name " << name << "already chosen" << endl;
223
224                DEL_PTR(p);
225                return p;
226        }
227       
228        if (!p->IsValid())
229        {
230                cerr << "Program " << funcName << " in " << fullName << " failed to load" << endl;
231
232                DEL_PTR(p);
233                return p;
234        }
235
236       
237        // everything ok
238        cout << "Program " << funcName << " in " << fullName << " loaded" << endl;
239               
240        mShaders.push_back(p);
241        mShaderMap[name] = p;
242
243        return p;
244}
245
246
247ShaderProgram *ShaderManager::GetShaderProgram(const std::string &name)
248{
249        ShaderMap::const_iterator it = mShaderMap.find(name);
250
251        if (it == mShaderMap.end())
252                return NULL;
253       
254        return (*it).second;
255}
256
257
258}
259
Note: See TracBrowser for help on using the repository browser.