Developer Documentation
UniformPool.hh
1/*===========================================================================*\
2 * *
3 * OpenFlipper *
4 * Copyright (c) 2001-2015, RWTH-Aachen University *
5 * Department of Computer Graphics and Multimedia *
6 * All rights reserved. *
7 * www.openflipper.org *
8 * *
9 *---------------------------------------------------------------------------*
10 * This file is part of OpenFlipper. *
11 *---------------------------------------------------------------------------*
12 * *
13 * Redistribution and use in source and binary forms, with or without *
14 * modification, are permitted provided that the following conditions *
15 * are met: *
16 * *
17 * 1. Redistributions of source code must retain the above copyright notice, *
18 * this list of conditions and the following disclaimer. *
19 * *
20 * 2. Redistributions in binary form must reproduce the above copyright *
21 * notice, this list of conditions and the following disclaimer in the *
22 * documentation and/or other materials provided with the distribution. *
23 * *
24 * 3. Neither the name of the copyright holder nor the names of its *
25 * contributors may be used to endorse or promote products derived from *
26 * this software without specific prior written permission. *
27 * *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39 * *
40\*===========================================================================*/
41
42
43#pragma once
44
45//==============================================================================
46
47#include <ACG/Config/ACGDefines.hh>
48#include <ACG/Math/VectorT.hh>
49#include <ACG/Math/GLMatrixT.hh>
50#include <ACG/ShaderUtils/GLSLShader.hh>
51
52#include <list>
53#include <string>
54
55
56//==============================================================================
57
58namespace GLSL {
59
64 class ACGDLLEXPORT UniformPool {
65
66 public:
70
73 UniformPool(const UniformPool& _pool);
74
75 virtual ~UniformPool();
76
77 void bind(PtrProgram _prog) const;
78 void bind(GLuint _prog) const;
79
80 void setUniform(const char *_name, GLint _value);
81 void setUniform(const char *_name, const ACG::Vec2i &_value);
82 void setUniform(const char *_name, const ACG::Vec3i &_value);
83 void setUniform(const char *_name, const ACG::Vec4i &_value);
84
85 void setUniform(const char *_name, GLuint _value);
86 void setUniform(const char *_name, const ACG::Vec2ui &_value);
87 void setUniform(const char *_name, const ACG::Vec3ui &_value);
88 void setUniform(const char *_name, const ACG::Vec4ui &_value);
89
90 void setUniform(const char *_name, GLfloat _value);
91 void setUniform(const char *_name, const ACG::Vec2f &_value);
92 void setUniform(const char *_name, const ACG::Vec3f &_value);
93 void setUniform(const char *_name, const ACG::Vec4f &_value);
94
95
96 void setUniform(const char *_name, const ACG::GLMatrixf &_value, bool _transposed = false);
97 void setUniformMat3(const char *_name, const ACG::GLMatrixf &_value, bool _transposed = false);
98
99
100 void setUniform(const char *_name, GLint *_values, int _count);
101 void setUniform(const char *_name, GLfloat *_values, int _count);
102
103
104 void addPool(const UniformPool& _src);
105
109 void clear();
110
115 bool empty() const;
116
120 QString toString() const;
121
125 UniformPool& operator =(const UniformPool& _other);
126
127 private:
128 struct UniformBase {
129 std::string id;
130
131
132 UniformBase() {}
133 virtual ~UniformBase() {}
134
135 virtual void bind(GLuint _progID) const {}
136
137 virtual QString toString() const { return QString(""); }
138 };
139
140 struct UniformVecf : public UniformBase {
141 ACG::Vec4f val;
142 int size;
143
144 void bind(GLuint _progID) const override;
145
146 virtual QString toString() const override;
147 };
148
149 // separate float int vector because sizeof(int) != sizeof(float) for some compilers
150 struct UniformVeci : public UniformBase {
151 ACG::Vec4i val;
152 int size;
153
154 void bind(GLuint _progID) const override;
155
156 virtual QString toString() const override;
157 };
158
159 struct UniformVecui : public UniformBase {
160 ACG::Vec4ui val;
161 int size;
162
163 void bind(GLuint _progID) const override;
164
165 virtual QString toString() const override;
166 };
167
168
170 ACG::Matrix4x4f val;
171
172 bool transposed;
173 int size;
174
175 void bind(GLuint _progID) const override;
176
177 virtual QString toString() const override;
178 };
179
180 struct UniformBuf : public UniformBase {
181 float* val;
182
183 bool integer;
184 int size;
185
186 UniformBuf();
187 ~UniformBuf();
188
189 void bind(GLuint _progID) const override;
190
191 virtual QString toString() const override;
192 };
193
194
195 typedef std::list<UniformBase*> UniformList;
196 typedef UniformList::iterator UniformListIt;
197
199 UniformList pool_;
200
201 private:
202
203 UniformListIt findEntry(std::string _name);
204
205 void addVecf(const UniformVecf& _vec);
206 void addVeci(const UniformVeci& _vec);
207 void addVecui(const UniformVecui& _vec);
208 void addMatrix(const UniformMat& _mat);
209 void addBuf(const char *_name, void *_values, int _count, bool _integer);
210 };
211
213 typedef const UniformPool* PtrConstUniformPool;
214
215}
216
GLSL program class.
Definition: GLSLShader.hh:211
GLSL uniform pool.
Definition: UniformPool.hh:64
UniformList pool_
list of uniform params
Definition: UniformPool.hh:199
This namespace contains all the classes and functions for handling GLSL shader and program objects.
Definition: AntiAliasing.hh:66
bool bind(osg::GeometryPtr &_geo, Mesh &_mesh)
Definition: bindT.hh:101