Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/graphics/shader.h @ 8534

Last change on this file since 8534 was 8255, checked in by bensch, 18 years ago

merged the atmos back with command: https://svn.orxonox.net/orxonox/branches/atmospheric_engine

File size: 4.1 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) { 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()) ; };
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  void bindShader(const char* name, const float* value, size_t size);
99  static void deactivateShader();
100
101  Shader::Uniform getUniform(const std::string& location) { return Shader::Uniform(this, location); }
102
103  bool loadShaderProgramm(Shader::Type type, const std::string& fileName);
104  void deleteProgram(Shader::Type type);
105
106  void linkShaderProgram();
107
108
109  bool readShader(const std::string& fileName, std::string& output);
110
111
112inline static bool shaderActive() { return (Shader::storedShader != NULL)? true : false; };
113  inline static Shader* getActiveShader() { return Shader::storedShader; };
114  inline static void suspendShader() { Shader* currShader = storedShader; if (storedShader!= NULL) { Shader::deactivateShader(); Shader::storedShader = currShader;} };
115  inline static void restoreShader() { if (storedShader != NULL) storedShader->activateShader(); storedShader = NULL; };
116
117
118
119
120  GLhandleARB getProgram() const { return this->shaderProgram; }
121  GLhandleARB getVertexS() const { return this->vertexShader; }
122  GLhandleARB getFragmentS() const { return this->fragmentShader; }
123
124  void debug() const;
125
126  static void printError(GLhandleARB program);
127
128
129private:
130  std::string            fragmentShaderFile;
131  std::string            vertexShaderFile;
132
133  GLhandleARB            shaderProgram;
134
135  GLhandleARB            vertexShader;
136  GLhandleARB            fragmentShader;
137
138
139  static Shader*         storedShader;
140};
141
142#endif /* _SHADER_H */
Note: See TracBrowser for help on using the repository browser.