Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/water/src/lib/graphics/shader.h @ 8019

Last change on this file since 8019 was 7982, checked in by stefalie, 18 years ago

branches/water: light!

File size: 4.0 KB
RevLine 
[4838]1/*!
[5261]2 * @file shader.h
3 * @brief Definition of the Shader rendering class
[3245]4*/
[1853]5
[5261]6#ifndef _SHADER_H
7#define _SHADER_H
[1853]8
[3543]9#include "base_object.h"
[5261]10#include "glincl.h"
[7164]11#include <vector>
[1853]12
[5261]13
[4838]14// FORWARD DECLARATION
[3543]15
16
[7835]17
[3955]18//! A class for ...
[7818]19class Shader : public BaseObject
20{
[7835]21public:
22  class Uniform
23  {
[7818]24  public:
[7982]25    Uniform(const Shader* shader, const std::string& location) { this->uniform = glGetUniformLocationARB(shader->getProgram(), location.c_str()) ; }
26    Uniform(const Shader& shader, const std::string& location) { this->uniform = glGetUniformLocation(shader.getProgram(), location.c_str()) ; };
27    Uniform(GLhandleARB shaderProgram, const std::string& location) { this->uniform = glGetUniformLocation(shaderProgram, location.c_str()) ; };
[7835]28
29    void set(float v0) const { glUniform1f(this->uniform, v0); }
30    void set(float v0, float v1) const { glUniform2f(this->uniform, v0, v1); }
31    void set(float v0, float v1, float v2) const { glUniform3f(this->uniform, v0, v1, v2); }
32    void set(float v0, float v1, float v2, float v3) const { glUniform4f(this->uniform, v0, v1, v2, v3); }
33
34    void set(int v0) const { glUniform1i(this->uniform, v0); }
35    void set(int v0, int v1) const { glUniform2i(this->uniform, v0, v1); }
36    void set(int v0, int v1, int v2) const { glUniform3i(this->uniform, v0, v1, v2); }
37    void set(int v0, int v1, int v2, int v3) const { glUniform4i(this->uniform, v0, v1, v2, v3); }
38
39    void setV(unsigned int count, float* vv) const
40    {
41      switch (count)
42      {
43        case 1:
44          glUniform1fv(this->uniform, 1, vv);
45          break;
46        case 2:
47          glUniform2fv(this->uniform, 2, vv);
48          break;
49        case 3:
50          glUniform3fv(this->uniform, 3, vv);
51          break;
52        case 4:
53          glUniform4fv(this->uniform, 4, vv);
54          break;
55      }
56    }
57    void setV(unsigned int count, int* vv) const
58    {
59      switch (count)
60      {
61        case 1:
62          glUniform1iv(this->uniform, 1, vv);
63          break;
64        case 2:
65          glUniform2iv(this->uniform, 2, vv);
66          break;
67        case 3:
68          glUniform3iv(this->uniform, 3, vv);
69          break;
70        case 4:
71          glUniform4iv(this->uniform, 4, vv);
72          break;
73      }
74    }
75    private:
76    GLint uniform;
77  };
78
[7818]79  typedef enum
80  {
81    None       = 0,
82    Fragment   = 1,
83    Vertex     = 2,
[1853]84
[7818]85    Program    = 4,
[7835]86  }
87  Type;
[7818]88
[7835]89public:
[7221]90  Shader(const std::string& vertexShaderFile = "", const std::string& fragmentShaderFile = "");
[5261]91  virtual ~Shader();
[7221]92  static Shader* getShader(const std::string& vertexShaderFile, const std::string& fragmentShaderFile);
[5323]93  static bool unload(Shader* shader);
[1853]94
[7818]95
96  static bool checkShaderAbility();
[5266]97  void activateShader();
98  static void deactivateShader();
[3245]99
[7835]100  Shader::Uniform getUniform(const std::string& location) { return Shader::Uniform(this, location); }
[7818]101
102  bool loadShaderProgramm(Shader::Type type, const std::string& fileName);
103  void deleteProgram(Shader::Type type);
104
105  void linkShaderProgram();
106
107
[7822]108  bool readShader(const std::string& fileName, std::string& output);
[5266]109
[5317]110
[7835]111inline static bool shaderActive() { return (Shader::storedShader != NULL)? true : false; };
[5323]112  inline static Shader* getActiveShader() { return Shader::storedShader; };
[5318]113  inline static void suspendShader() { Shader* currShader = storedShader; if (storedShader!= NULL) { Shader::deactivateShader(); Shader::storedShader = currShader;} };
[5317]114  inline static void restoreShader() { if (storedShader != NULL) storedShader->activateShader(); storedShader = NULL; };
115
116
[7835]117
118
[7818]119  GLhandleARB getProgram() const { return this->shaderProgram; }
120  GLhandleARB getVertexS() const { return this->vertexShader; }
121  GLhandleARB getFragmentS() const { return this->fragmentShader; }
122
[5262]123  void debug() const;
124
[7818]125  static void printError(GLhandleARB program);
[5262]126
[7818]127
[7835]128private:
129  std::string            fragmentShaderFile;
130  std::string            vertexShaderFile;
[7818]131
[7835]132  GLhandleARB            shaderProgram;
[7818]133
[7835]134  GLhandleARB            vertexShader;
135  GLhandleARB            fragmentShader;
[5317]136
[7834]137
[7835]138  static Shader*         storedShader;
[1853]139};
140
[5261]141#endif /* _SHADER_H */
Note: See TracBrowser for help on using the repository browser.