//HEADER FILE
#ifndef CS5400_PROGRAM
#define CS5400_PROGRAM
#include <memory>
#include "Shader.hpp"
namespace cs5400
{
class Program
{
public:
Program(
std::shared_ptr<VertexShader> vertex_
,std::shared_ptr<FragmentShader> fragment_)
:handle(glCreateProgram())
,vertex(vertex_)
,fragment(fragment_)
{}
GLuint getHandle(){return handle;}
~Program()
{
//glDeleteProgram(handle);
}
private:
GLuint handle;
std::shared_ptr<VertexShader> vertex;
std::shared_ptr<FragmentShader> fragment;
};
std::shared_ptr<Program> make_program(std::shared_ptr<VertexShader> vertex,std::shared_ptr<FragmentShader> fragment);
}
#endif
//SOURCE FILE
#include "Program.hpp"
std::shared_ptr<cs5400::Program> cs5400::make_program
(
std::shared_ptr<cs5400::VertexShader> vertex
,std::shared_ptr<cs5400::FragmentShader> fragment
)
{
GLint link_ok = GL_FALSE;
auto program = std::make_shared<Program>(vertex,fragment);
glAttachShader(program->getHandle(), vertex->getHandle());
glAttachShader(program->getHandle(), fragment->getHandle());
glLinkProgram(program->getHandle());
glGetProgramiv(program->getHandle(), GL_LINK_STATUS, &link_ok);
if (!link_ok)
{
throw std::runtime_error("Could not link shader program.");
}
return program;
}