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

Revision 3116, 5.5 KB checked in by mattausch, 16 years ago (diff)

tree animation works somehow with flow vector

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        // provide the current view matrix:
89        // this is an automatic parameter that is updated each frame
90        fragmentProgMrt->AddParameter("viewMatrix", 0);
91        fragmentProgMrtTex->AddParameter("viewMatrix", 0);
92
93
94        // vertex program
95        vertexProgMrt->AddParameter("viewMatrix", 0);
96        // needed for for ssao
97        vertexProgMrt->AddParameter("modelMatrix", 1);
98        vertexProgMrt->AddParameter("oldModelMatrix", 2);
99       
100
101        // add a texture parameter
102        fragmentProgMrtTex->AddParameter("tex", 1);
103
104
105        //////////////////////////
106        //-- hack: use hardcoded tree animation (should be provided with a material script!)
107
108        ShaderProgram *treeAnimProg, *treeAnimProgMrt;
109
110        treeAnimProg = CreateVertexProgram("treeanimation", "animateVtx", "treeAnimation");
111        treeAnimProgMrt = CreateVertexProgram("treeanimation", "animateVtxMrt", "treeAnimationMrt");
112
113        treeAnimProg->AddParameter("timer", 0);
114        treeAnimProg->AddParameter("windDir", 1);
115        treeAnimProg->AddParameter("windStrength", 2);
116        treeAnimProg->AddParameter("minMaxPos", 3);
117        treeAnimProg->AddParameter("frequency", 4);
118        treeAnimProg->AddParameter("lightDir", 5);
119
120        treeAnimProgMrt->AddParameter("timer", 0);
121        treeAnimProgMrt->AddParameter("windDir", 1);
122        treeAnimProgMrt->AddParameter("windStrength", 2);
123        treeAnimProgMrt->AddParameter("minMaxPos", 3);
124        treeAnimProgMrt->AddParameter("frequency", 4);
125        treeAnimProgMrt->AddParameter("oldTimer", 5);
126
127        cout << "cg initialization successful" << endl;
128}
129
130
131void ShaderManager::DelSingleton()
132{
133        DEL_PTR(sShaderManager);
134}
135       
136
137ShaderManager::~ShaderManager()
138{
139        CLEAR_CONTAINER(mShaders);
140       
141        if (sCgContext)
142                cgDestroyContext(sCgContext);
143}
144
145
146ShaderProgram *ShaderManager::CreateFragmentProgram(const std::string &filename,
147                                                                                                        const std::string &funcName,
148                                                                                                        const std::string &name)
149{
150        return CreateShaderProgram(filename, funcName, name, true);
151}
152
153
154ShaderProgram *ShaderManager::CreateVertexProgram(const std::string &filename,
155                                                                                                  const std::string &funcName,
156                                                                                                  const std::string &name)
157{
158        return CreateShaderProgram(filename, funcName, name, false);
159}
160
161
162void ShaderManager::EnableFragmentProfile()
163{
164        cgGLEnableProfile(sCgFragmentProfile);
165}
166
167
168void ShaderManager::EnableVertexProfile()
169{
170        cgGLEnableProfile(sCgVertexProfile);
171}
172
173
174void ShaderManager::DisableFragmentProfile()
175{
176        cgGLDisableProfile(sCgFragmentProfile);
177}
178
179
180void ShaderManager::DisableVertexProfile()
181{
182        cgGLDisableProfile(sCgVertexProfile);
183}
184
185
186ShaderProgram *ShaderManager::CreateShaderProgram(const std::string &filename,
187                                                                                                  const std::string &funcName,
188                                                                                                  const std::string &name,
189                                                                                                  bool isFragment)
190{
191        const string fullName = "src/shaders/" + filename + ".cg";
192       
193        ShaderProgram *p =
194                new ShaderProgram(sCgContext, fullName,
195                                  isFragment ? sCgFragmentProfile : sCgVertexProfile, funcName);
196
197        if (GetShaderProgram(name))
198        {
199                cerr << "Program name " << name << "already chosen" << endl;
200
201                DEL_PTR(p);
202                return p;
203        }
204       
205        if (!p->IsValid())
206        {
207                cerr << "Program " << funcName << " in " << fullName << " failed to load" << endl;
208
209                DEL_PTR(p);
210                return p;
211        }
212
213       
214        // everything ok
215        cout << "Program " << funcName << " in " << fullName << " loaded" << endl;
216               
217        mShaders.push_back(p);
218        mShaderMap[name] = p;
219
220        return p;
221}
222
223
224ShaderProgram *ShaderManager::GetShaderProgram(const std::string &name)
225{
226        ShaderMap::const_iterator it = mShaderMap.find(name);
227
228        if (it == mShaderMap.end())
229                return NULL;
230       
231        return (*it).second;
232}
233
234
235}
236
Note: See TracBrowser for help on using the repository browser.