#pragma once #include #include #include #include #include #include namespace cgl { class Program { protected: GLuint id{}; public: Program() { id = glCreateProgram(); } Program(Program &) = delete; Program(Program &&o) noexcept { id = std::exchange(o.id, 0); }; ~Program() { glDeleteProgram(id); } operator GLuint() const { return id; } [[nodiscard]] int get(GLenum pname) const { GLint res; glGetProgramiv(id, pname, &res); return (int) res; } [[nodiscard]] std::string get_info_log() const { auto len = (size_t) get(GL_INFO_LOG_LENGTH); char buffer[len]; glGetProgramInfoLog(id, len, nullptr, buffer); return std::string(buffer); } template void attach(const Shader &sh) { glAttachShader(id, sh); } template void detach(const Shader &sh) { glDetachShader(id, sh); } bool link() { glLinkProgram(id); return (bool) get(GL_LINK_STATUS); } }; }