00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __RE_Shader__
00022 #define __RE_Shader__
00023
00024 #include "RE_API.h"
00025
00026 #include <UT/UT_HashTable.h>
00027 #include <UT/UT_IntArray.h>
00028 #include <UT/UT_String.h>
00029 #include <UT/UT_PtrArray.h>
00030 #include "RE_Uniform.h"
00031
00032 class RE_Render;
00033
00034 class RE_API RE_Shader
00035 {
00036 public:
00037 RE_Shader();
00038 virtual ~RE_Shader();
00039
00040 const char *getName() { return myShaderName; }
00041 int getProgram() const { return myProgramObject; }
00042
00043 virtual void applyShader() const = 0;
00044 virtual void removeShader() = 0;
00045
00046
00047
00048
00049
00050 bool loadPrograms(const char *english_name,
00051 const char *vtxFile,
00052 const char *fragFile,
00053 UT_String *messages = NULL);
00054
00055 virtual bool setPrograms(const char *english_name,
00056 const char *vtxShader,
00057 const char *fragShader,
00058 UT_String *messages = NULL) = 0;
00059 virtual void clearPrograms() = 0;
00060
00061
00062
00063 virtual int bindTextureMap(const char *name,
00064 const char *tmap,
00065 const char *relativeTo) = 0;
00066 virtual bool bindTextureMap(const char *name, int tex_id, int tex_unit) = 0;
00067
00068
00069
00070
00071
00072 virtual bool bindVariableInt(const char *name, const int *val,
00073 int array_size=1)=0;
00074 virtual bool bindVariableInt2(const char *name, const int *val,
00075 int array_size=1)=0;
00076 virtual bool bindVariableInt3(const char *name, const int *val,
00077 int array_size=1)=0;
00078 virtual bool bindVariableInt4(const char *name, const int *val,
00079 int array_size=1)=0;
00080
00081
00082 virtual bool bindVariable1(const char *name, const float *val,
00083 int array_size=1)=0;
00084 virtual bool bindVariable2(const char *name, const float *val,
00085 int array_size=1)=0;
00086 virtual bool bindVariable3(const char *name, const float *val,
00087 int array_size=1)=0;
00088 virtual bool bindVariable4(const char *name, const float *val,
00089 int array_size=1)=0;
00090
00091
00092 virtual bool bindMatrix2(const char *name, const float *val,
00093 int array_size=1)=0;
00094 virtual bool bindMatrix3(const char *name, const float *val,
00095 int array_size=1)=0;
00096 virtual bool bindMatrix4(const char *name, const float *val,
00097 int array_size=1) =0;
00098
00099
00100
00101
00102
00103
00104 virtual bool bindUniform(const RE_Uniform *uniform, int index = -1);
00105
00106 bool hasShaderAttribs() const
00107 { return myAttribNames.entries() > 0; }
00108 const UT_StringList &getShaderAttribNames() const
00109 { return myAttribNames; }
00110 const UT_IntArray &getShaderAttribLocations() const
00111 { return myAttribLocations; }
00112 const UT_IntArray &getShaderAttribSizes() const
00113 { return myAttribSizes; }
00114
00115 virtual void loadShaderTexMaps(RE_Render *) = 0;
00116
00117
00118
00119
00120 virtual bool hasBuiltInUniform(RE_UniformBuiltIn uniform) const;
00121
00122
00123
00124 static RE_Shader *getShader(int program_object);
00125
00126 protected:
00127
00128
00129
00130 virtual int getAttributeIndex(const char *name);
00131 virtual int getUniformIndex(const char *name);
00132
00133 virtual bool loadShaderAttribNames() = 0;
00134 virtual bool loadShaderUniformNames() = 0;
00135
00136
00137
00138 virtual void registerProgram(int program_object);
00139 virtual void unregisterProgram(int program_object);
00140
00141
00142 static UT_HashTable theShaderTable;
00143
00144 UT_String myShaderName;
00145 int myProgramObject;
00146
00147 int myVertexShaderObject, myFragmentShaderObject;
00148 UT_String myVertexShaderSource, myFragmentShaderSource;
00149
00150 UT_StringList myAttribNames;
00151 UT_IntArray myAttribLocations;
00152 UT_IntArray myAttribSizes;
00153 UT_StringList myUniformNames;
00154 UT_IntArray myUniformArraySizes;
00155 UT_IntArray myUniformTypes;
00156 UT_IntArray myBuiltInUniforms;
00157 };
00158 #endif