#include #include #include "Program.hpp" #include "../../Common/Assert.hpp" namespace MC::GFX::Shading { Program::Program(Shader vertex, Shader fragment) { m_program = glCreateProgram(); glAttachShader(m_program, fragment.get()); glAttachShader(m_program, vertex.get()); glLinkProgram(m_program); glDeleteShader(fragment.get()); glDeleteShader(vertex.get()); GLint success; glGetProgramiv(m_program, GL_LINK_STATUS, &success); if(!success) { Char message[512] = {}; glGetProgramInfoLog(m_program, 512, nullptr, message); throw std::runtime_error(message); } } void Program::bind() const { ASSERT(m_program != 0, "Program is not initialized"); glUseProgram(m_program); } void Program::unbind() const { glUseProgram(0); } std::optional Program::uniform(const std::string& name) const { ASSERT(m_program != 0, "Program is not initialized"); auto index = glGetUniformLocation(m_program, name.c_str()); if (index == -1) return {}; return {{name, static_cast(index)}}; } U32 Program::get() const { return m_program; } }