]> git.tdb.fi Git - libs/gl.git/blob - source/shader.cpp
Add Uniform* classes to store uniform data of Programs
[libs/gl.git] / source / shader.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 #include "arb_shader_objects.h"
9 #include "except.h"
10 #include "extension.h"
11 #include "shader.h"
12
13 using namespace std;
14
15 namespace Msp {
16 namespace GL {
17
18 Shader::Shader(ShaderType t):
19         compiled(false)
20 {
21         if(t==FRAGMENT_SHADER)
22                 require_extension("GL_ARB_fragment_program");
23         else if(t==VERTEX_SHADER)
24                 require_extension("GL_ARB_vertex_program");
25
26         id=glCreateShaderObjectARB(t);
27 }
28
29 Shader::Shader(ShaderType t, const string &src):
30         compiled(false)
31 {
32         if(t==FRAGMENT_SHADER)
33                 require_extension("GL_ARB_fragment_program");
34         else if(t==VERTEX_SHADER)
35                 require_extension("GL_ARB_vertex_program");
36
37         id=glCreateShaderObjectARB(t);
38
39         source(src);
40         compile();
41 }
42
43 Shader::~Shader()
44 {
45         glDeleteObjectARB(id);
46 }
47
48 void Shader::source(sizei count, const char **str, const int *len)
49 {
50         glShaderSourceARB(id, count, str, len);
51 }
52
53 void Shader::source(const string &str)
54 {
55         source(str.data(), str.size());
56 }
57
58 void Shader::source(const char *str, int len)
59 {
60         source(1, &str, &len);
61 }
62
63 void Shader::compile()
64 {
65         glCompileShaderARB(id);
66         if(!(compiled=get_param(GL_COMPILE_STATUS)))
67                 throw CompileError(get_info_log());
68 }
69
70 int Shader::get_param(GLenum param) const
71 {
72         int value;
73         glGetObjectParameterivARB(id, param, &value);
74         return value;
75 }
76
77 string Shader::get_info_log() const
78 {
79         sizei len=get_param(GL_INFO_LOG_LENGTH);
80         char log[len+1];
81         glGetInfoLogARB(id, len+1, reinterpret_cast<GLsizei *>(&len), log);
82         return string(log, len);
83 }
84
85 } // namespace GL
86 } // namespace Msp