]> git.tdb.fi Git - libs/gl.git/blob - source/programdata.h
Construct uniform buffers for named uniform blocks
[libs/gl.git] / source / programdata.h
1 #ifndef MSP_GL_PROGRAMDATA_H_
2 #define MSP_GL_PROGRAMDATA_H_
3
4 #include <map>
5 #include <msp/datafile/objectloader.h>
6
7 namespace Msp {
8 namespace GL {
9
10 class Buffer;
11 class Color;
12 class Matrix;
13 class Program;
14 class Uniform;
15 class UniformBlock;
16 class Vector3;
17 class Vector4;
18
19 /**
20 Stores uniform variables for a shader program.
21 */
22 class ProgramData
23 {
24 public:
25         class Loader: public DataFile::ObjectLoader<ProgramData>
26         {
27         public:
28                 Loader(ProgramData &);
29         private:
30                 void uniform1i(const std::string &, int);
31                 void uniform1f(const std::string &, float);
32                 void uniform2f(const std::string &, float, float);
33                 void uniform3f(const std::string &, float, float, float);
34                 void uniform4f(const std::string &, float, float, float, float);
35         };
36
37 private:
38         struct Block
39         {
40                 bool dirty;
41                 UniformBlock *block;
42
43                 Block();
44         };
45
46         typedef std::map<std::string, Uniform *> UniformMap;
47         typedef std::map<unsigned, Block> BlockMap;
48
49         // XXX All these mutables are a bit silly, but I'm out of better ideas
50         UniformMap uniforms;
51         mutable BlockMap blocks;
52         mutable UniformBlock *last_block;
53         mutable Buffer *buffer;
54         mutable bool modified;
55
56         ProgramData &operator=(const ProgramData &);
57 public:
58         ProgramData();
59         ProgramData(const ProgramData &);
60         ~ProgramData();
61
62 private:
63         void uniform(const std::string &, Uniform *);
64 public:
65         void uniform(const std::string &, int);
66         void uniform(const std::string &, float);
67         void uniform(const std::string &, float, float);
68         void uniform2(const std::string &, const float *);
69         void uniform(const std::string &, float, float, float);
70         void uniform(const std::string &, const Vector3 &);
71         void uniform3(const std::string &, const float *);
72         void uniform(const std::string &, float, float, float, float);
73         void uniform(const std::string &, const Vector4 &);
74         void uniform(const std::string &, const Color &);
75         void uniform4(const std::string &, const float *);
76         void uniform_matrix4(const std::string &, const float *);
77         void uniform_matrix4(const std::string &, const Matrix &);
78         void uniform1_array(const std::string &, unsigned, const float *);
79         void uniform2_array(const std::string &, unsigned, const float *);
80         void uniform3_array(const std::string &, unsigned, const float *);
81         void uniform4_array(const std::string &, unsigned, const float *);
82         void uniform_matrix4_array(const std::string &, unsigned, const float *);
83
84         const UniformBlock &get_block(const Program &, const std::string &) const;
85
86         void apply() const;
87 };
88
89 } // namespace GL
90 } // namespace Msp
91
92 #endif