#pragma once #include "shader.h" #include #include #include class Location; using ProgramRef = glRef; class Program { public: template explicit 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; };