]> git.tdb.fi Git - libs/gl.git/blob - source/uniformblock.cpp
Rewrite the Uniform classes as templates
[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         float va[2] = { v0, v1 };
49         uniform2(index, va);
50 }
51
52 void UniformBlock::uniform2(int index, const float *v)
53 {
54         uniform(index, new Uniform2f(v));
55 }
56
57 void UniformBlock::uniform(int index, float v0, float v1, float v2)
58 {
59         float va[3] = { v0, v1, v2 };
60         uniform3(index, va);
61 }
62
63 void UniformBlock::uniform(int index, const Vector3 &v)
64 {
65         uniform(index, v.x, v.y, v.z);
66 }
67
68 void UniformBlock::uniform3(int index, const float *v)
69 {
70         uniform(index, new Uniform3f(v));
71 }
72
73 void UniformBlock::uniform(int index, float v0, float v1, float v2, float v3)
74 {
75         float va[4] = { v0, v1, v2, v3 };
76         uniform4(index, va);
77 }
78
79 void UniformBlock::uniform(int index, const Vector4 &v)
80 {
81         uniform(index, v.x, v.y, v.z, v.w);
82 }
83
84 void UniformBlock::uniform(int index, const Color &c)
85 {
86         uniform(index, c.r, c.g, c.b, c.a);
87 }
88
89 void UniformBlock::uniform4(int index, const float *v)
90 {
91         uniform(index, new Uniform4f(v));
92 }
93
94 void UniformBlock::uniform_matrix4(int index, const float *v)
95 {
96         uniform(index, new UniformMatrix4x4f(v));
97 }
98
99 void UniformBlock::uniform_matrix4(int index, const Matrix &m)
100 {
101         float v[16];
102         copy(m.data(), m.data()+16, v);
103         uniform_matrix4(index, v);
104 }
105
106 void UniformBlock::apply(int index) const
107 {
108         if(index>=0)
109                 throw logic_error("GL_ARB_uniform_buffer_object support not implemented yet");
110
111         for(map<int, Uniform *>::const_iterator i=uniforms.begin(); i!=uniforms.end(); ++i)
112                 i->second->apply(i->first);
113 }
114
115 } // namespace GL
116 } // namespace Msp