blob: eb108887aa59ee73a75b3f1e49821680bcd0a5bd (
plain)
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
|
#pragma once
#include "shader.h"
#include <GL/glew.h>
#include <glRef.hpp>
#include <glm/mat4x4.hpp>
class Location;
using ProgramRef = glRef<GLuint, &glCreateProgram, &glDeleteProgram>;
class Program {
public:
template<typename... S> Program(const S &... srcs)
{
(glAttachShader(m_program, srcs.compile()), ...);
linkAndValidate();
}
virtual ~Program() = default;
class UniformLocation {
public:
UniformLocation(GLuint prog, const char * name);
operator auto() const
{
return location;
}
protected:
GLint location;
};
class RequiredUniformLocation : public UniformLocation {
public:
RequiredUniformLocation(GLuint prog, const char * name);
};
operator GLuint() const
{
return m_program;
}
protected:
void use() const;
void linkAndValidate() const;
ProgramRef m_program;
};
|