/
Program.h
116 lines (89 loc) · 4.48 KB
/
Program.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
tdogl::Program
Copyright 2012 Thomas Dalling - http://tomdalling.com/
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#pragma once
#include "Shader.h"
#include <vector>
#include <glm/glm.hpp>
namespace tdogl {
/**
Represents an OpenGL program made by linking shaders.
*/
class Program {
public:
/**
Creates a program by linking a list of tdogl::Shader objects
@param shaders The shaders to link together to make the program
@throws std::exception if an error occurs.
@see tdogl::Shader
*/
Program(const std::vector<Shader>& shaders);
~Program();
/**
@result The program's object ID, as returned from glCreateProgram
*/
GLuint object() const;
void use() const;
bool isInUse() const;
void stopUsing() const;
/**
@result The attribute index for the given name, as returned from glGetAttribLocation.
*/
GLint attrib(const GLchar* attribName) const;
/**
@result The uniform index for the given name, as returned from glGetUniformLocation.
*/
GLint uniform(const GLchar* uniformName) const;
/**
Setters for attribute and uniform variables.
These are convenience methods for the glVertexAttrib* and glUniform* functions.
*/
#define _TDOGL_PROGRAM_ATTRIB_N_UNIFORM_SETTERS(OGL_TYPE) \
void setAttrib(const GLchar* attribName, OGL_TYPE v0); \
void setAttrib(const GLchar* attribName, OGL_TYPE v0, OGL_TYPE v1); \
void setAttrib(const GLchar* attribName, OGL_TYPE v0, OGL_TYPE v1, OGL_TYPE v2); \
void setAttrib(const GLchar* attribName, OGL_TYPE v0, OGL_TYPE v1, OGL_TYPE v2, OGL_TYPE v3); \
\
void setAttrib1v(const GLchar* attribName, const OGL_TYPE* v); \
void setAttrib2v(const GLchar* attribName, const OGL_TYPE* v); \
void setAttrib3v(const GLchar* attribName, const OGL_TYPE* v); \
void setAttrib4v(const GLchar* attribName, const OGL_TYPE* v); \
\
void setUniform(const GLchar* uniformName, OGL_TYPE v0); \
void setUniform(const GLchar* uniformName, OGL_TYPE v0, OGL_TYPE v1); \
void setUniform(const GLchar* uniformName, OGL_TYPE v0, OGL_TYPE v1, OGL_TYPE v2); \
void setUniform(const GLchar* uniformName, OGL_TYPE v0, OGL_TYPE v1, OGL_TYPE v2, OGL_TYPE v3); \
\
void setUniform1v(const GLchar* uniformName, const OGL_TYPE* v, GLsizei count=1); \
void setUniform2v(const GLchar* uniformName, const OGL_TYPE* v, GLsizei count=1); \
void setUniform3v(const GLchar* uniformName, const OGL_TYPE* v, GLsizei count=1); \
void setUniform4v(const GLchar* uniformName, const OGL_TYPE* v, GLsizei count=1); \
_TDOGL_PROGRAM_ATTRIB_N_UNIFORM_SETTERS(GLfloat)
_TDOGL_PROGRAM_ATTRIB_N_UNIFORM_SETTERS(double)
_TDOGL_PROGRAM_ATTRIB_N_UNIFORM_SETTERS(GLint)
_TDOGL_PROGRAM_ATTRIB_N_UNIFORM_SETTERS(GLuint)
void setUniformMatrix2(const GLchar* uniformName, const GLfloat* v, GLsizei count=1, GLboolean transpose=GL_FALSE);
void setUniformMatrix3(const GLchar* uniformName, const GLfloat* v, GLsizei count=1, GLboolean transpose=GL_FALSE);
void setUniformMatrix4(const GLchar* uniformName, const GLfloat* v, GLsizei count=1, GLboolean transpose=GL_FALSE);
void setUniform(const GLchar* uniformName, const glm::mat2& m, GLboolean transpose=GL_FALSE);
void setUniform(const GLchar* uniformName, const glm::mat3& m, GLboolean transpose=GL_FALSE);
void setUniform(const GLchar* uniformName, const glm::mat4& m, GLboolean transpose=GL_FALSE);
void setUniform(const GLchar* uniformName, const glm::vec3& v);
void setUniform(const GLchar* uniformName, const glm::vec4& v);
private:
GLuint _object;
//copying disabled
Program(const Program&);
const Program& operator=(const Program&);
};
}