]> git.tdb.fi Git - libs/gl.git/blob - source/programdata.cpp
Use DevIL for loading images
[libs/gl.git] / source / programdata.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 "extension.h"
9 #include "program.h"
10 #include "programdata.h"
11 #include "uniform.h"
12
13 using namespace std;
14
15 namespace Msp {
16 namespace GL {
17
18 ProgramData::ProgramData()
19 {
20         require_extension("GL_ARB_shader_objects");
21 }
22
23 ProgramData::~ProgramData()
24 {
25         for(map<int, Uniform *>::iterator i=data.begin(); i!=data.end(); ++i)
26                 delete i->second;
27 }
28
29 void ProgramData::uniform(int index, Uniform *uni)
30 {
31         if(index<0)
32                 return;
33
34         map<int, Uniform *>::iterator i=data.find(index);
35         if(i!=data.end())
36         {
37                 delete i->second;
38                 i->second=uni;
39         }
40         else
41                 data[index]=uni;
42 }
43
44 void ProgramData::uniform(int index, int v)
45 {
46         uniform(index, new Uniform1i(v));
47 }
48
49 void ProgramData::uniform(int index, float v)
50 {
51         uniform(index, new Uniform1f(v));
52 }
53
54 void ProgramData::uniform(int index, float v0, float v1)
55 {
56         uniform(index, new Uniform2f(v0, v1));
57 }
58
59 void ProgramData::uniform2(int index, const float *v)
60 {
61         uniform(index, v[0], v[1]);
62 }
63
64 void ProgramData::uniform(int index, float v0, float v1, float v2)
65 {
66         uniform(index, new Uniform3f(v0, v1, v2));
67 }
68
69 void ProgramData::uniform3(int index, const float *v)
70 {
71         uniform(index, v[0], v[1], v[2]);
72 }
73
74 void ProgramData::uniform(int index, float v0, float v1, float v2, float v3)
75 {
76         uniform(index, new Uniform4f(v0, v1, v2, v3));
77 }
78
79 void ProgramData::uniform4(int index, const float *v)
80 {
81         uniform(index, v[0], v[1], v[2], v[3]);
82 }
83
84 void ProgramData::apply() const
85 {
86         for(map<int, Uniform *>::const_iterator i=data.begin(); i!=data.end(); ++i)
87                 i->second->apply(i->first);
88 }
89
90
91 ProgramData::Loader::Loader(ProgramData &pd, Program &pr):
92         pdata(pd),
93         prog(pr)
94 {
95         add("uniform1", &Loader::uniform1);
96         add("uniform2", &Loader::uniform2);
97         add("uniform3", &Loader::uniform3);
98         add("uniform4", &Loader::uniform4);
99 }
100
101 void ProgramData::Loader::uniform1(const string &n, float v)
102 {
103         pdata.uniform(prog.get_uniform_location(n), v);
104 }
105
106 void ProgramData::Loader::uniform2(const string &n, float v0, float v1)
107 {
108         pdata.uniform(prog.get_uniform_location(n), v0, v1);
109 }
110
111 void ProgramData::Loader::uniform3(const string &n, float v0, float v1, float v2)
112 {
113         pdata.uniform(prog.get_uniform_location(n), v0, v1, v2);
114 }
115
116 void ProgramData::Loader::uniform4(const string &n, float v0, float v1, float v2, float v3)
117 {
118         pdata.uniform(prog.get_uniform_location(n), v0, v1, v2, v3);
119 }
120
121 } // namespace GL
122 } // namespace Msp