Circles (ellipses) have been added (filled only)
[ipdf/code.git] / src / shaderprogram.cpp
1 #include "shaderprogram.h"
2 #include "log.h"
3
4 using namespace IPDF;
5
6 ShaderProgram::~ShaderProgram()
7 {
8         for(auto shader : m_shaders)
9         {
10                 glDetachShader(m_program, shader.obj);
11                 glDeleteShader(shader.obj);
12         }
13
14         if (m_program)
15                 glDeleteProgram(m_program);
16 }
17
18 void ShaderProgram::LazyCreateProgram()
19 {
20         if (!m_program)
21         {
22                 m_program = glCreateProgram();
23         }
24 }
25
26 bool ShaderProgram::AttachShader(const char *src, GLenum type)
27 {
28         GLuint shader_obj = glCreateShader(type);
29         glShaderSource(shader_obj, 1, &src, 0);
30         glCompileShader(shader_obj);
31         int did_compile = 0;
32         glGetShaderiv(shader_obj, GL_COMPILE_STATUS, &did_compile);
33         if (!did_compile)
34         {
35                 char info_log[2048];
36
37                 glGetShaderInfoLog(shader_obj, 2048, nullptr, info_log);
38                 Error("Shader compile error: %s\n", info_log);
39                 return false;
40         }
41
42         m_shaders.push_back(Shader{type, shader_obj});
43         LazyCreateProgram();
44         glAttachShader(m_program, shader_obj);
45         return true;
46 }
47
48 bool ShaderProgram::AttachVertexProgram(const char *src)
49 {
50         return AttachShader(src, GL_VERTEX_SHADER);
51 }
52
53 bool ShaderProgram::AttachFragmentProgram(const char *src)
54 {
55         return AttachShader(src, GL_FRAGMENT_SHADER);
56 }
57
58 bool ShaderProgram::AttachGeometryProgram(const char *src)
59 {
60         return AttachShader(src, GL_GEOMETRY_SHADER);
61 }
62
63 bool ShaderProgram::Link()
64 {
65         glLinkProgram(m_program);
66         return true;
67 }
68
69 const void ShaderProgram::Use() const
70 {
71         glUseProgram(m_program);
72 }
73
74 const GLint ShaderProgram::GetUniformLocation(const char *name) const
75 {
76         return glGetUniformLocation(m_program, name);
77 }

UCC git Repository :: git.ucc.asn.au