00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00020
00021 #ifndef __VR3SHADERPROGRAM_H__
00022 #define __VR3SHADERPROGRAM_H__
00023
00024
00025 #include <unordered_map>
00026
00028
00117 class VR3ShaderProgram {
00119 friend class VR3ShaderManager;
00120
00122
00128 static VR3ShaderProgram* ms_activeprogram;
00129
00131 GLuint m_program;
00132
00134 std::unordered_map<std::string, GLint> m_uniforms;
00135
00137 GLint m_std_uniforms[VR3_NUM_STD_UNIFORMS];
00138
00140 VR3ShaderProgram(const VR3ShaderProgram&);
00142 VR3ShaderProgram& operator = (const VR3ShaderProgram&);
00143
00144
00145
00147
00148
00150
00157 void GetSource(const char* filename, std::string& filestr);
00158
00160
00171 void SplitShaders(const std::string& shaders,
00172 std::string& vertex,
00173 std::string& geometry,
00174 std::string& fragment);
00175
00177
00178 public:
00179
00180
00181
00183
00184
00186
00195 VR3ShaderProgram(const char* shader, bool code_in_par);
00196
00198
00208 VR3ShaderProgram(const char* vertex, const char* geometry,
00209 const char* fragment, bool code_in_par);
00210
00212
00213 ~VR3ShaderProgram();
00214
00216
00217
00218
00220
00221
00223
00228 void Start();
00229
00231
00236 void Stop();
00237
00239
00240
00241
00243
00247 static VR3ShaderProgram* GetActiveProgram() { return ms_activeprogram; }
00248
00249
00250
00269
00270 void SendUniform1(const char* varname, GLfloat v0);
00271 void SendUniform2(const char* varname, GLfloat v0, GLfloat v1);
00272 void SendUniform3(const char* varname, GLfloat v0, GLfloat v1, GLfloat v2);
00273 void SendUniform4(const char* varname, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
00274
00275 void SendUniform1(const char* varname, GLint v0);
00276 void SendUniform2(const char* varname, GLint v0, GLint v1);
00277 void SendUniform3(const char* varname, GLint v0, GLint v1, GLint v2);
00278 void SendUniform4(const char* varname, GLint v0, GLint v1, GLint v2, GLint v3);
00279
00280 void SendUniform1v(const char* varname, GLsizei count, GLfloat *value);
00281 void SendUniform2v(const char* varname, GLsizei count, GLfloat *value);
00282 void SendUniform3v(const char* varname, GLsizei count, GLfloat *value);
00283 void SendUniform4v(const char* varname, GLsizei count, GLfloat *value);
00284
00285 void SendUniform1v(const char* varname, GLsizei count, GLint *value);
00286 void SendUniform2v(const char* varname, GLsizei count, GLint *value);
00287 void SendUniform3v(const char* varname, GLsizei count, GLint *value);
00288 void SendUniform4v(const char* varname, GLsizei count, GLint *value);
00289
00290 void SendUniformMatrix2fv(const char* varname, GLsizei count,
00291 bool transpose, GLfloat* value);
00292 void SendUniformMatrix3fv(const char* varname, GLsizei count,
00293 bool transpose, GLfloat* value);
00294 void SendUniformMatrix4fv(const char* varname, GLsizei count,
00295 bool transpose, GLfloat* value);
00296
00297 void SendUniformTexture(const char* varname, unsigned int unit_id);
00298
00300
00301
00302
00304
00305
00307
00313 const GLint* GetStdUniforms()
00314 { return m_std_uniforms; }
00315
00317 };
00318
00319 #endif