X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Frender%2Fprogramdata.h;h=aeffae45700726f9bc5bd9c7fbc350477486eb90;hb=bb386d8;hp=6f20d4d8317da1d393e5da555c0d4a3989498f67;hpb=ba1427f10d574ff8c4dafc4b8673452b19308ca2;p=libs%2Fgl.git diff --git a/source/render/programdata.h b/source/render/programdata.h index 6f20d4d8..aeffae45 100644 --- a/source/render/programdata.h +++ b/source/render/programdata.h @@ -8,6 +8,7 @@ #include "matrix.h" #include "program.h" #include "tag.h" +#include "uniform.h" #include "vector.h" namespace Msp { @@ -21,7 +22,7 @@ public: }; class Buffer; -class Uniform; +class BufferBackedUniformBlock; class UniformBlock; struct Color; @@ -151,9 +152,10 @@ private: // XXX All these mutables are a bit silly, but I'm out of better ideas const Program *tied_program; std::vector uniforms; + unsigned generation; mutable std::vector blocks; mutable std::vector programs; - mutable UniformBlock *last_block; + mutable BufferBackedUniformBlock *last_buffer_block; mutable Buffer *buffer; mutable Mask dirty; @@ -172,6 +174,7 @@ private: void uniform_array(Tag, unsigned, V); bool validate_tag(Tag) const; void add_uniform(Tag, Uniform *); + void mark_dirty(Mask); public: void uniform(Tag, const Uniform &); void uniform(Tag, int); @@ -182,33 +185,25 @@ public: void uniform2(Tag, const float *); void uniform(Tag, int, int, int); void uniform(Tag, float, float, float); - void uniform(Tag, const Vector3 &); void uniform3(Tag, const int *); void uniform3(Tag, const float *); void uniform(Tag, int, int, int, int); void uniform(Tag, float, float, float, float); - void uniform(Tag, const Vector4 &); void uniform(Tag, const Color &); void uniform4(Tag, const int *); void uniform4(Tag, const float *); - void uniform(Tag, const LinAl::Matrix &); void uniform_matrix2(Tag, const float *); - void uniform(Tag, const LinAl::Matrix &); void uniform_matrix3x2(Tag, const float *); - void uniform(Tag, const LinAl::Matrix &); void uniform_matrix4x2(Tag, const float *); - void uniform(Tag, const LinAl::Matrix &); void uniform_matrix2x3(Tag, const float *); - void uniform(Tag, const LinAl::Matrix &); void uniform_matrix3(Tag, const float *); - void uniform(Tag, const LinAl::Matrix &); void uniform_matrix4x3(Tag, const float *); - void uniform(Tag, const LinAl::Matrix &); void uniform_matrix2x4(Tag, const float *); - void uniform(Tag, const LinAl::Matrix &); void uniform_matrix3x4(Tag, const float *); void uniform(Tag, const Matrix &); void uniform_matrix4(Tag, const float *); + void uniform_array(Tag, unsigned, const int *); + void uniform_array(Tag, unsigned, const float *); void uniform1_array(Tag, unsigned, const int *); void uniform1_array(Tag, unsigned, const float *); void uniform2_array(Tag, unsigned, const int *); @@ -226,8 +221,23 @@ public: void uniform_matrix2x4_array(Tag, unsigned, const float *); void uniform_matrix3x4_array(Tag, unsigned, const float *); void uniform_matrix4_array(Tag, unsigned, const float *); + + template + void uniform(Tag, const LinAl::Vector &); + + template + void uniform(Tag, const LinAl::Matrix &); + + template + void uniform_array(Tag, unsigned, const LinAl::Vector *); + + template + void uniform_array(Tag, unsigned, const LinAl::Matrix *); + void remove_uniform(Tag); + unsigned get_generation() const { return generation; } + std::vector get_uniform_tags() const; const Uniform &get_uniform(Tag) const; const Uniform *find_uniform(Tag) const; @@ -244,6 +254,22 @@ public: void apply() const; }; +template +void ProgramData::uniform(Tag tag, const LinAl::Vector &v) +{ uniform >(tag, &v.x); } + +template +void ProgramData::uniform(Tag tag, const LinAl::Matrix &v) +{ uniform >(tag, &v(0, 0)); } + +template +void ProgramData::uniform_array(Tag tag, unsigned n, const LinAl::Vector *v) +{ uniform_array >(tag, n, &v[0].x); } + +template +void ProgramData::uniform_array(Tag tag, unsigned n, const LinAl::Matrix *v) +{ uniform_array >(tag, n, &v[0](0, 0)); } + } // namespace GL } // namespace Msp