]> git.tdb.fi Git - libs/gl.git/blob - source/programdata.cpp
Add $Id$ to tag.*
[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         {
33                 delete uni;
34                 return;
35         }
36
37         map<int, Uniform *>::iterator i=data.find(index);
38         if(i!=data.end())
39         {
40                 delete i->second;
41                 i->second=uni;
42         }
43         else
44                 data[index]=uni;
45 }
46
47 void ProgramData::uniform(int index, int v)
48 {
49         uniform(index, new Uniform1i(v));
50 }
51
52 void ProgramData::uniform(int index, float v)
53 {
54         uniform(index, new Uniform1f(v));
55 }
56
57 void ProgramData::uniform(int index, float v0, float v1)
58 {
59         uniform(index, new Uniform2f(v0, v1));
60 }
61
62 void ProgramData::uniform2(int index, const float *v)
63 {
64         uniform(index, v[0], v[1]);
65 }
66
67 void ProgramData::uniform(int index, float v0, float v1, float v2)
68 {
69         uniform(index, new Uniform3f(v0, v1, v2));
70 }
71
72 void ProgramData::uniform3(int index, const float *v)
73 {
74         uniform(index, v[0], v[1], v[2]);
75 }
76
77 void ProgramData::uniform(int index, float v0, float v1, float v2, float v3)
78 {
79         uniform(index, new Uniform4f(v0, v1, v2, v3));
80 }
81
82 void ProgramData::uniform4(int index, const float *v)
83 {
84         uniform(index, v[0], v[1], v[2], v[3]);
85 }
86
87 void ProgramData::apply() const
88 {
89         for(map<int, Uniform *>::const_iterator i=data.begin(); i!=data.end(); ++i)
90                 i->second->apply(i->first);
91 }
92
93
94 ProgramData::Loader::Loader(ProgramData &pd, Program &pr):
95         pdata(pd),
96         prog(pr)
97 {
98         add("uniform1", &Loader::uniform1);
99         add("uniform2", &Loader::uniform2);
100         add("uniform3", &Loader::uniform3);
101         add("uniform4", &Loader::uniform4);
102 }
103
104 void ProgramData::Loader::uniform1(const string &n, float v)
105 {
106         pdata.uniform(prog.get_uniform_location(n), v);
107 }
108
109 void ProgramData::Loader::uniform2(const string &n, float v0, float v1)
110 {
111         pdata.uniform(prog.get_uniform_location(n), v0, v1);
112 }
113
114 void ProgramData::Loader::uniform3(const string &n, float v0, float v1, float v2)
115 {
116         pdata.uniform(prog.get_uniform_location(n), v0, v1, v2);
117 }
118
119 void ProgramData::Loader::uniform4(const string &n, float v0, float v1, float v2, float v3)
120 {
121         pdata.uniform(prog.get_uniform_location(n), v0, v1, v2, v3);
122 }
123
124 } // namespace GL
125 } // namespace Msp