]> git.tdb.fi Git - libs/gl.git/blob - source/program.cpp
Add shaders
[libs/gl.git] / source / program.cpp
1 /* $Id$
2
3 This file is part of libmspgl
4 Copyright © 2007 Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
6 */
7
8 #define GL_GLEXT_PROTOTYPES
9 #include "program.h"
10 #include "shader.h"
11
12 using namespace std;
13
14 namespace Msp {
15 namespace GL {
16
17 Program::Program()
18 {
19         id=glCreateProgram();
20 }
21
22 Program::~Program()
23 {
24         glDeleteProgram(id);
25 }
26
27 void Program::attach_shader(Shader &shader)
28 {
29         if(find(shaders.begin(), shaders.end(), &shader)==shaders.end())
30         {
31                 glAttachShader(id, shader.get_id());
32                 shaders.push_back(&shader);
33         }
34 }
35
36 void Program::detach_shader(Shader &shader)
37 {
38         list<Shader *>::iterator i=remove(shaders.begin(), shaders.end(), &shader);
39         if(i!=shaders.end())
40         {
41                 shaders.erase(i, shaders.end());
42                 glDetachShader(id, shader.get_id());
43         }
44 }
45
46 bool Program::link()
47 {
48         for(list<Shader *>::iterator i=shaders.begin(); i!=shaders.end(); ++i)
49                 if(!(*i)->get_compiled() && !(*i)->compile())
50                         return false;
51
52         glLinkProgram(id);
53         linked=get_param(GL_LINK_STATUS);
54         return linked;
55 }
56
57 int Program::get_param(GLenum param) const
58 {
59         int value;
60         glGetProgramiv(id, param, &value);
61         return value;
62 }
63
64 string Program::get_info_log() const
65 {
66         sizei len=get_param(GL_INFO_LOG_LENGTH);
67         char log[len+1];
68         glGetProgramInfoLog(id, len+1, reinterpret_cast<GLsizei *>(&len), log);
69         return string(log, len);
70 }
71
72 } // namespace GL
73 } // namespace Msp