34
34
#include "display.h"
35
35
#include "sdlapp.h"
39
#include <boost/format.hpp>
46
enum { SHADER_UNIFORM_FLOAT,
48
SHADER_UNIFORM_SAMPLER_1D,
49
SHADER_UNIFORM_SAMPLER_2D,
56
SHADER_UNIFORM_VEC2_ARRAY,
57
SHADER_UNIFORM_VEC3_ARRAY,
58
SHADER_UNIFORM_VEC4_ARRAY
69
std::string type_name;
75
ShaderUniform(Shader* shader, const std::string& name, int uniform_type, const std::string& type_name);
77
virtual void unload();
79
int getType() { return uniform_type; };
81
virtual void write(std::string& content) const {};
83
const std::string& getName() const;
84
bool isInitialized() const { return initialized; };
87
bool isBaked() const { return baked; };
88
bool isModified() const { return modified; };
90
void setInitialized(bool initialized) { this->initialized = initialized; };
92
virtual void apply() {};
94
virtual void setBaked(bool baked);
95
virtual void setModified(bool modified) { this->modified = modified; };
98
class FloatShaderUniform : public ShaderUniform {
101
FloatShaderUniform(Shader* shader, const std::string& name, float value = 0.0f);
103
void write(std::string& content) const;
106
void setValue(float value);
107
float getValue() const;
110
class IntShaderUniform : public ShaderUniform {
113
IntShaderUniform(Shader* shader, const std::string& name, int value = 0);
115
void write(std::string& content) const;
118
void setValue(int value);
119
float getValue() const;
122
class BoolShaderUniform : public ShaderUniform {
125
BoolShaderUniform(Shader* shader, const std::string& name, bool value = false);
127
void write(std::string& content) const;
130
void setValue(bool value);
131
float getValue() const;
134
class Sampler1DShaderUniform : public ShaderUniform {
137
Sampler1DShaderUniform(Shader* shader, const std::string& name, int value = 0);
139
void write(std::string& content) const;
141
void setBaked(bool baked);
144
void setValue(int value);
145
float getValue() const;
148
class Sampler2DShaderUniform : public ShaderUniform {
151
Sampler2DShaderUniform(Shader* shader, const std::string& name, int value = 0);
153
void write(std::string& content) const;
155
void setBaked(bool baked);
158
void setValue(int value);
159
float getValue() const;
162
class Vec2ShaderUniform : public ShaderUniform {
165
Vec2ShaderUniform(Shader* shader, const std::string& name, const vec2& value = vec2(0.0f)) ;
167
void write(std::string& content) const;
170
void setValue(const vec2& value);
171
const vec2& getValue() const;
174
class Vec3ShaderUniform : public ShaderUniform {
177
Vec3ShaderUniform(Shader* shader, const std::string& name, const vec3& value = vec3(0.0f));
179
void write(std::string& content) const;
182
void setValue(const vec3& value);
183
const vec3& getValue() const;
186
class Vec4ShaderUniform : public ShaderUniform {
189
Vec4ShaderUniform(Shader* shader, const std::string& name, const vec4& value = vec4(0.0f));
191
void write(std::string& content) const;
194
void setValue(const vec4& value);
195
const vec4& getValue() const;
198
class Mat3ShaderUniform : public ShaderUniform {
201
Mat3ShaderUniform(Shader* shader, const std::string& name, const mat3& value = mat3(1.0f));
203
void write(std::string& content) const;
206
void setValue(const mat3& value);
207
const mat3& getValue() const;
210
class Mat4ShaderUniform : public ShaderUniform {
213
Mat4ShaderUniform(Shader* shader, const std::string& name, const mat4& value = mat4(1.0f));
215
void write(std::string& content) const;
218
void setValue(const mat4& value);
219
const mat4& getValue() const;
222
class Vec2ArrayShaderUniform : public ShaderUniform {
226
void copyValue(const vec2* value);
227
void copyValue(const std::vector<vec2>& value);
229
Vec2ArrayShaderUniform(Shader* shader, const std::string& name, size_t length, const vec2* value = 0);
230
~Vec2ArrayShaderUniform();
232
void write(std::string& content) const;
236
void setValue(const vec2* value);
237
void setValue(const std::vector<vec2>& value);
239
const vec2* getValue() const;
242
class Vec3ArrayShaderUniform : public ShaderUniform {
246
void copyValue(const vec3* value);
247
void copyValue(const std::vector<vec3>& value);
249
Vec3ArrayShaderUniform(Shader* shader, const std::string& name, size_t length, const vec3* value = 0);
250
~Vec3ArrayShaderUniform();
252
void write(std::string& content) const;
256
void setValue(const vec3* value);
257
void setValue(const std::vector<vec3>& value);
259
const vec3* getValue() const;
262
class Vec4ArrayShaderUniform : public ShaderUniform {
266
void copyValue(const vec4* value);
267
void copyValue(const std::vector<vec4>& value);
269
Vec4ArrayShaderUniform(Shader* shader, const std::string& name, size_t length, const vec4* value = 0);
270
~Vec4ArrayShaderUniform();
272
void write(std::string& content) const;
276
void setValue(const vec4* value);
277
void setValue(const std::vector<vec4>& value);
279
const vec4* getValue() const;
283
GLint shader_object_type;
284
std::string shader_object_desc;
285
GLenum shader_object;
288
std::map<std::string,std::string> extensions;
293
std::string shader_object_source;
295
std::list<ShaderUniform*> uniforms;
297
bool errorContext(const char* log_message, std::string& context);
299
bool preprocess(const std::string& line);
301
ShaderPass(Shader* parent, GLint shader_object_type, const std::string& shader_object_desc);
302
virtual ~ShaderPass();
304
GLint getType() { return shader_object_type; };
306
void toString(std::string& out);
313
ShaderUniform* addArrayUniform(const std::string& name, const std::string& type, size_t length);
314
ShaderUniform* addUniform(const std::string& name, const std::string& type);
316
virtual void attachTo(GLenum program);
318
void includeSource(const std::string& source);
319
void includeFile(const std::string& filename);
322
class VertexShader : public ShaderPass {
324
VertexShader(Shader* parent);
327
class FragmentShader : public ShaderPass {
329
FragmentShader(Shader* parent);
332
class GeometryShader : public ShaderPass {
334
GeometryShader(Shader* parent);
336
void attachTo(GLenum program);
42
339
class Shader : public Resource {
44
std::map<std::string, GLint> varMap;
48
GLenum fragmentShader;
50
GLint getVarLocation(const std::string& name);
52
bool preprocess(const std::string& line, std::string& output);
53
bool readSource(const std::string& filename, std::string& output);
54
GLenum load(const std::string& filename, GLenum shaderType);
57
void checkError(const std::string& filename, GLenum shaderRef);
341
std::map<std::string, ShaderUniform*> uniforms;
342
std::map<std::string,std::string> substitutions;
345
bool dynamic_compile;
347
void checkProgramError();
351
VertexShader* vertex_shader;
352
GeometryShader* geometry_shader;
353
FragmentShader* fragment_shader;
59
356
Shader(const std::string& prefix);
62
359
GLenum getProgram();
63
GLenum getVertexShader();
64
GLenum getFragmentShader();
366
ShaderPass* grabShaderPass(GLenum shader_object_type);
368
void includeSource(GLenum shader_object_type, const std::string& source);
369
void includeFile(GLenum shader_object_type, const std::string& filename);
371
static void substitute(std::string& source, const std::string& name, const std::string& value);
373
void addSubstitute(const std::string& name, const char *value, ...);
374
void applySubstitutions(std::string& source);
376
void addUniform(ShaderUniform* uniform);
377
ShaderUniform* getUniform(const std::string& name);
379
void setDynamicCompile(bool dynamic_compile);
382
void applyUniforms();
384
void setBool(const std::string& name, bool value);
66
385
void setInteger (const std::string& name, int value);
386
void setSampler1D(const std::string& name, int value);
387
void setSampler2D(const std::string& name, int value);
67
388
void setFloat(const std::string& name, float value);
68
void setVec2 (const std::string& name, const vec2f& value);
69
void setVec3 (const std::string& name, const vec3f& value);
70
void setVec4 (const std::string& name, const vec4f& value);
389
void setVec2 (const std::string& name, const vec2& value);
390
void setVec3 (const std::string& name, const vec3& value);
391
void setVec4 (const std::string& name, const vec4& value);
392
void setMat3 (const std::string& name, const mat3& value);
393
void setMat4 (const std::string& name, const mat4& value);
395
void setVec2Array(const std::string& name, vec2* value);
396
void setVec2Array(const std::string& name, std::vector<vec2>& value);
398
void setVec3Array(const std::string& name, vec3* value);
399
void setVec3Array(const std::string& name, std::vector<vec3>& value);
401
void setVec4Array(const std::string& name, vec4* value);
402
void setVec4Array(const std::string& name, std::vector<vec4>& value);
404
void setBaked(const std::string& name, bool baked);
405
void setBakedUniforms(bool baked);
75
413
class ShaderManager : public ResourceManager {
81
418
Shader* grab(const std::string& shader_prefix);
420
void enableWarnings(bool warnings);
422
void manage(Shader* shader);
84
428
extern ShaderManager shadermanager;