]> git.tdb.fi Git - libs/gl.git/blob - source/programdata.cpp
Use RAII checks for extensions and versions
[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         static RequireExtension _ext("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("uniform1i", &Loader::uniform1i);
99         add("uniform1f", &Loader::uniform1f);
100         add("uniform2f", &Loader::uniform2f);
101         add("uniform3f", &Loader::uniform3f);
102         add("uniform4f", &Loader::uniform4f);
103 }
104
105 void ProgramData::Loader::uniform1i(const string &n, int v)
106 {
107         pdata.uniform(prog.get_uniform_location(n), v);
108 }
109
110 void ProgramData::Loader::uniform1f(const string &n, float v)
111 {
112         pdata.uniform(prog.get_uniform_location(n), v);
113 }
114
115 void ProgramData::Loader::uniform2f(const string &n, float v0, float v1)
116 {
117         pdata.uniform(prog.get_uniform_location(n), v0, v1);
118 }
119
120 void ProgramData::Loader::uniform3f(const string &n, float v0, float v1, float v2)
121 {
122         pdata.uniform(prog.get_uniform_location(n), v0, v1, v2);
123 }
124
125 void ProgramData::Loader::uniform4f(const string &n, float v0, float v1, float v2, float v3)
126 {
127         pdata.uniform(prog.get_uniform_location(n), v0, v1, v2, v3);
128 }
129
130 } // namespace GL
131 } // namespace Msp