]> git.tdb.fi Git - libs/gl.git/blob - source/program.cpp
Move VertexFormat and VertexArrayBuilder to their own files
[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 void Program::bind_attribute(int index, const string &name)
47 {
48         glBindAttribLocation(id, index, name.c_str());
49 }
50
51 bool Program::link()
52 {
53         for(list<Shader *>::iterator i=shaders.begin(); i!=shaders.end(); ++i)
54                 if(!(*i)->get_compiled() && !(*i)->compile())
55                         return false;
56
57         glLinkProgram(id);
58         linked=get_param(GL_LINK_STATUS);
59         return linked;
60 }
61
62 int Program::get_param(GLenum param) const
63 {
64         int value;
65         glGetProgramiv(id, param, &value);
66         return value;
67 }
68
69 string Program::get_info_log() const
70 {
71         sizei len=get_param(GL_INFO_LOG_LENGTH);
72         char log[len+1];
73         glGetProgramInfoLog(id, len+1, reinterpret_cast<GLsizei *>(&len), log);
74         return string(log, len);
75 }
76
77 } // namespace GL
78 } // namespace Msp