]> git.tdb.fi Git - libs/gl.git/blob - source/programdata.h
Avoid creating blocks for which there are no uniforms
[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 #include "program.h"
7
8 namespace Msp {
9 namespace GL {
10
11 class Buffer;
12 class Color;
13 class Matrix;
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         enum Changes
39         {
40                 NO_CHANGES,
41                 VALUES_CHANGED,
42                 KEYS_CHANGED
43         };
44
45         struct Block
46         {
47                 Changes changes;
48                 UniformBlock *block;
49                 std::map<unsigned, const Uniform *const *> uniforms;
50
51                 Block();
52         };
53
54         typedef std::map<std::string, Uniform *> UniformMap;
55         typedef std::map<unsigned, Block> BlockMap;
56
57         // XXX All these mutables are a bit silly, but I'm out of better ideas
58         UniformMap uniforms;
59         mutable BlockMap blocks;
60         mutable UniformBlock *last_block;
61         mutable Buffer *buffer;
62         mutable Changes changes;
63
64         ProgramData &operator=(const ProgramData &);
65 public:
66         ProgramData();
67         ProgramData(const ProgramData &);
68         ~ProgramData();
69
70 private:
71         void uniform(const std::string &, Uniform *);
72 public:
73         void uniform(const std::string &, int);
74         void uniform(const std::string &, float);
75         void uniform(const std::string &, float, float);
76         void uniform2(const std::string &, const float *);
77         void uniform(const std::string &, float, float, float);
78         void uniform(const std::string &, const Vector3 &);
79         void uniform3(const std::string &, const float *);
80         void uniform(const std::string &, float, float, float, float);
81         void uniform(const std::string &, const Vector4 &);
82         void uniform(const std::string &, const Color &);
83         void uniform4(const std::string &, const float *);
84         void uniform_matrix4(const std::string &, const float *);
85         void uniform_matrix4(const std::string &, const Matrix &);
86         void uniform1_array(const std::string &, unsigned, const float *);
87         void uniform2_array(const std::string &, unsigned, const float *);
88         void uniform3_array(const std::string &, unsigned, const float *);
89         void uniform4_array(const std::string &, unsigned, const float *);
90         void uniform_matrix4_array(const std::string &, unsigned, const float *);
91
92 private:
93         void find_uniforms_for_block(Block &, const Program::UniformBlockInfo &) const;
94         UniformBlock *create_block(const Program::UniformBlockInfo &) const;
95         const UniformBlock *get_block(const Program &, const Program::UniformBlockInfo *) const;
96 public:
97         const UniformBlock *get_block(const Program &, const std::string &) const;
98
99         void apply() const;
100 };
101
102 } // namespace GL
103 } // namespace Msp
104
105 #endif