]> git.tdb.fi Git - libs/gl.git/blob - source/uniformblock.cpp
Restructure ProgramData to support sharing between Programs
[libs/gl.git] / source / uniformblock.cpp
1 #include <stdexcept>
2 #include "color.h"
3 #include "matrix.h"
4 #include "uniform.h"
5 #include "uniformblock.h"
6 #include "vector.h"
7
8 using namespace std;
9
10 namespace Msp {
11 namespace GL {
12
13 UniformBlock::~UniformBlock()
14 {
15         for(map<int, Uniform *>::iterator i=uniforms.begin(); i!=uniforms.end(); ++i)
16                 delete i->second;
17 }
18
19 void UniformBlock::uniform(int index, Uniform *uni)
20 {
21         map<int, Uniform *>::iterator i = uniforms.find(index);
22         if(i!=uniforms.end())
23         {
24                 delete i->second;
25                 i->second = uni;
26         }
27         else
28                 uniforms[index] = uni;
29 }
30
31 void UniformBlock::uniform(int index, const Uniform &uni)
32 {
33         uniform(index, uni.clone());
34 }
35
36 void UniformBlock::uniform(int index, int v)
37 {
38         uniform(index, new Uniform1i(v));
39 }
40
41 void UniformBlock::uniform(int index, float v)
42 {
43         uniform(index, new Uniform1f(v));
44 }
45
46 void UniformBlock::uniform(int index, float v0, float v1)
47 {
48         uniform(index, new Uniform2f(v0, v1));
49 }
50
51 void UniformBlock::uniform2(int index, const float *v)
52 {
53         uniform(index, v[0], v[1]);
54 }
55
56 void UniformBlock::uniform(int index, float v0, float v1, float v2)
57 {
58         uniform(index, new Uniform3f(v0, v1, v2));
59 }
60
61 void UniformBlock::uniform(int index, const Vector3 &v)
62 {
63         uniform(index, v.x, v.y, v.z);
64 }
65
66 void UniformBlock::uniform3(int index, const float *v)
67 {
68         uniform(index, v[0], v[1], v[2]);
69 }
70
71 void UniformBlock::uniform(int index, float v0, float v1, float v2, float v3)
72 {
73         uniform(index, new Uniform4f(v0, v1, v2, v3));
74 }
75
76 void UniformBlock::uniform(int index, const Vector4 &v)
77 {
78         uniform(index, v.x, v.y, v.z, v.w);
79 }
80
81 void UniformBlock::uniform(int index, const Color &c)
82 {
83         uniform(index, c.r, c.g, c.b, c.a);
84 }
85
86 void UniformBlock::uniform4(int index, const float *v)
87 {
88         uniform(index, v[0], v[1], v[2], v[3]);
89 }
90
91 void UniformBlock::uniform_matrix4(int index, const float *v)
92 {
93         uniform(index, new UniformMatrix4x4f(v));
94 }
95
96 void UniformBlock::uniform_matrix4(int index, const Matrix &m)
97 {
98         float v[16];
99         copy(m.data(), m.data()+16, v);
100         uniform_matrix4(index, v);
101 }
102
103 void UniformBlock::apply(int index) const
104 {
105         if(index>=0)
106                 throw logic_error("GL_ARB_uniform_buffer_object support not implemented yet");
107
108         for(map<int, Uniform *>::const_iterator i=uniforms.begin(); i!=uniforms.end(); ++i)
109                 i->second->apply(i->first);
110 }
111
112 } // namespace GL
113 } // namespace Msp