00001 #ifndef __SHADER_LOADER__
00002 #define __SHADER_LOADER__
00003
00004 #include <Cg/cg.h>
00005 #include <Cg/cgGL.h>
00006
00007 #include <string>
00008 #include <map>
00009
00010 #include "tinyXML/tinyxml.h"
00011 #include "logger.h"
00012
00013 using namespace std;
00014
00019 class ShaderProgram
00020 {
00021 public:
00022 string name;
00023 CGprogram program;
00024 map<string, string> parameterTypeMap;
00025 map<string, CGparameter> parameterMap;
00026
00027 void setTextureParameter(string name, unsigned int value);
00028 void setParameter3f(string name, double valueOne, double valueTwo, double valueThree);
00029 void setParameter2f(string name, double valueOne, double valueTwo);
00030 void setParameter1f(string name, double valueOne);
00031
00032 void enableTextureParameters();
00033 void disableTextureParameters();
00034
00035 void activate();
00036 };
00037
00046 class ShaderLoader
00047 {
00048 public:
00049 static ShaderLoader *getShaderLoader();
00050
00051 ShaderProgram *getProgram(string name);
00052
00053 void disableShaders();
00054 void enableFragmentShaders();
00055 void enableVertexShaders();
00056
00057 void setActive(ShaderProgram *shaderProgram);
00058
00064 bool isActive(ShaderProgram *shaderProgram) {return active == shaderProgram;}
00065
00066 void checkForCgError(const char *situation);
00067
00068
00069
00070
00071
00072
00073
00074
00075 private:
00076 static ShaderLoader *singleton;
00077
00078 CGcontext cgContext;
00079 CGprofile cgFragmentProfile;
00080 CGprofile cgVertexProfile;
00081
00082 ShaderProgram *active;
00083
00084 map<string, ShaderProgram *> programMap;
00085
00086 void loadParameter(ShaderProgram *currentProgram, TiXmlElement* parameterElement);
00087 ShaderProgram *loadShader(TiXmlElement* shaderElement);
00088
00089
00090 void initShaderPrograms(string configFile);
00091
00092
00093
00094 map<string, ShaderProgram *> shaderStorage;
00095
00096 void initCG();
00097
00098
00099 ShaderLoader();
00100 ~ShaderLoader();
00101
00102 };
00103
00104
00105
00106 #endif