#define MSP_GL_PROGRAMDATA_H_
#include <map>
+#include <stdexcept>
#include <msp/datafile/objectloader.h>
#include "datatype.h"
#include "matrix.h"
namespace Msp {
namespace GL {
+class too_many_uniforms: public std::runtime_error
+{
+public:
+ too_many_uniforms(const std::string &w): std::runtime_error(w) { }
+ virtual ~too_many_uniforms() throw() { }
+};
+
class Buffer;
class Uniform;
class UniformBlock;
public:
ProgramData(const Program * = 0);
ProgramData(const ProgramData &);
+ ProgramData(const ProgramData &, const Program *);
ProgramData &operator=(const ProgramData &);
~ProgramData();
private:
void uniform(const std::string &, Uniform *);
+ template<typename T, typename V>
+ void uniform(const std::string &, V);
+ template<typename T, typename V>
+ void uniform_array(const std::string &, unsigned, V);
+ bool validate_name(const std::string &) const;
+ void add_uniform(const std::string &, Uniform *);
public:
void uniform(const std::string &, const Uniform &);
void uniform(const std::string &, int);
void uniform4(const std::string &, const float *);
void uniform(const std::string &, const LinAl::Matrix<float, 2, 2> &);
void uniform_matrix2(const std::string &, const float *);
+ void uniform(const std::string &, const LinAl::Matrix<float, 2, 3> &);
+ void uniform_matrix3x2(const std::string &, const float *);
+ void uniform(const std::string &, const LinAl::Matrix<float, 2, 4> &);
+ void uniform_matrix4x2(const std::string &, const float *);
+ void uniform(const std::string &, const LinAl::Matrix<float, 3, 2> &);
+ void uniform_matrix2x3(const std::string &, const float *);
void uniform(const std::string &, const LinAl::Matrix<float, 3, 3> &);
void uniform_matrix3(const std::string &, const float *);
+ void uniform(const std::string &, const LinAl::Matrix<float, 3, 4> &);
+ void uniform_matrix4x3(const std::string &, const float *);
+ void uniform(const std::string &, const LinAl::Matrix<float, 4, 2> &);
+ void uniform_matrix2x4(const std::string &, const float *);
+ void uniform(const std::string &, const LinAl::Matrix<float, 4, 3> &);
+ void uniform_matrix3x4(const std::string &, const float *);
void uniform(const std::string &, const Matrix &);
void uniform_matrix4(const std::string &, const float *);
void uniform1_array(const std::string &, unsigned, const int *);
void uniform4_array(const std::string &, unsigned, const int *);
void uniform4_array(const std::string &, unsigned, const float *);
void uniform_matrix2_array(const std::string &, unsigned, const float *);
+ void uniform_matrix3x2_array(const std::string &, unsigned, const float *);
+ void uniform_matrix4x2_array(const std::string &, unsigned, const float *);
+ void uniform_matrix2x3_array(const std::string &, unsigned, const float *);
void uniform_matrix3_array(const std::string &, unsigned, const float *);
+ void uniform_matrix4x3_array(const std::string &, unsigned, const float *);
+ void uniform_matrix2x4_array(const std::string &, unsigned, const float *);
+ void uniform_matrix3x4_array(const std::string &, unsigned, const float *);
void uniform_matrix4_array(const std::string &, unsigned, const float *);
void remove_uniform(const std::string &);
std::vector<std::string> get_uniform_names() const;
const Uniform &get_uniform(const std::string &) const;
+ const Uniform *find_uniform(const std::string &) const;
private:
static bool uniform_name_compare(const NamedUniform &, const std::string &);