Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 7895 was 7835, checked in by bensch, 19 years ago

orxonox/water: Uniform class, (total inline Class, that handles Uniforms of Shader-Programs

File size: 4.0 KB
Line 
1/*!
2 * @file shader.h
3 * @brief Definition of the Shader rendering class
4*/
5
6#ifndef _SHADER_H
7#define _SHADER_H
8
9#include "base_object.h"
10#include "glincl.h"
11#include <vector>
12
13
14// FORWARD DECLARATION
15
16
17
18//! A class for ...
19class Shader : public BaseObject
20{
21public:
22  class Uniform
23  {
24  public:
25    Uniform(const Shader* shader, const std::string& location) { glGetUniformLocationARB(shader->getProgram(), location.c_str()) ; }
26    Uniform(const Shader& shader, const std::string& location) { glGetUniformLocation(shader.getProgram(), location.c_str()) ; };
27    Uniform(GLhandleARB shaderProgram, const std::string& location) { glGetUniformLocation(shaderProgram, location.c_str()) ; };
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
79  typedef enum
80  {
81    None       = 0,
82    Fragment   = 1,
83    Vertex     = 2,
84
85    Program    = 4,
86  }
87  Type;
88
89public:
90  Shader(const std::string& vertexShaderFile = "", const std::string& fragmentShaderFile = "");
91  virtual ~Shader();
92  static Shader* getShader(const std::string& vertexShaderFile, const std::string& fragmentShaderFile);
93  static bool unload(Shader* shader);
94
95
96  static bool checkShaderAbility();
97  void activateShader();
98  static void deactivateShader();
99
100  Shader::Uniform getUniform(const std::string& location) { return Shader::Uniform(this, location); }
101
102  bool loadShaderProgramm(Shader::Type type, const std::string& fileName);
103  void deleteProgram(Shader::Type type);
104
105  void linkShaderProgram();
106
107
108  bool readShader(const std::string& fileName, std::string& output);
109
110
111inline static bool shaderActive() { return (Shader::storedShader != NULL)? true : false; };
112  inline static Shader* getActiveShader() { return Shader::storedShader; };
113  inline static void suspendShader() { Shader* currShader = storedShader; if (storedShader!= NULL) { Shader::deactivateShader(); Shader::storedShader = currShader;} };
114  inline static void restoreShader() { if (storedShader != NULL) storedShader->activateShader(); storedShader = NULL; };
115
116
117
118
119  GLhandleARB getProgram() const { return this->shaderProgram; }
120  GLhandleARB getVertexS() const { return this->vertexShader; }
121  GLhandleARB getFragmentS() const { return this->fragmentShader; }
122
123  void debug() const;
124
125  static void printError(GLhandleARB program);
126
127
128private:
129  std::string            fragmentShaderFile;
130  std::string            vertexShaderFile;
131
132  GLhandleARB            shaderProgram;
133
134  GLhandleARB            vertexShader;
135  GLhandleARB            fragmentShader;
136
137
138  static Shader*         storedShader;
139};
140
141#endif /* _SHADER_H */
Note: See TracBrowser for help on using the repository browser.