]> git.tdb.fi Git - libs/gl.git/blob - source/programdata.h
Restructure ProgramData to support sharing between Programs
[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 Color;
11 class Matrix;
12 class Program;
13 class Uniform;
14 class UniformBlock;
15 class Vector3;
16 class Vector4;
17
18 /**
19 Stores uniform variables for a shader program.
20 */
21 class ProgramData
22 {
23 public:
24         class Loader: public DataFile::ObjectLoader<ProgramData>
25         {
26         public:
27                 Loader(ProgramData &);
28         private:
29                 void uniform1i(const std::string &, int);
30                 void uniform1f(const std::string &, float);
31                 void uniform2f(const std::string &, float, float);
32                 void uniform3f(const std::string &, float, float, float);
33                 void uniform4f(const std::string &, float, float, float, float);
34         };
35
36 private:
37         struct Block
38         {
39                 bool dirty;
40                 UniformBlock *block;
41
42                 Block();
43         };
44
45         typedef std::map<std::string, Uniform *> UniformMap;
46         typedef std::map<unsigned, Block> BlockMap;
47
48         UniformMap uniforms;
49         mutable BlockMap blocks;
50         mutable bool modified;
51
52         ProgramData &operator=(const ProgramData &);
53 public:
54         ProgramData();
55         ProgramData(const ProgramData &);
56         ~ProgramData();
57
58 private:
59         void uniform(const std::string &, Uniform *);
60 public:
61         void uniform(const std::string &, int);
62         void uniform(const std::string &, float);
63         void uniform(const std::string &, float, float);
64         void uniform2(const std::string &, const float *);
65         void uniform(const std::string &, float, float, float);
66         void uniform(const std::string &, const Vector3 &);
67         void uniform3(const std::string &, const float *);
68         void uniform(const std::string &, float, float, float, float);
69         void uniform(const std::string &, const Vector4 &);
70         void uniform(const std::string &, const Color &);
71         void uniform4(const std::string &, const float *);
72         void uniform_matrix4(const std::string &, const float *);
73         void uniform_matrix4(const std::string &, const Matrix &);
74
75         const UniformBlock &get_block(const Program &) const;
76
77         void apply() const;
78 };
79
80 } // namespace GL
81 } // namespace Msp
82
83 #endif