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

Revision 3057, 5.0 KB checked in by mattausch, 16 years ago (diff)

added a shader manager

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