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

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