]> git.tdb.fi Git - libs/gl.git/commitdiff
Add support for non-square matrix uniforms
authorMikko Rasa <tdb@tdb.fi>
Wed, 5 Feb 2020 21:35:42 +0000 (23:35 +0200)
committerMikko Rasa <tdb@tdb.fi>
Wed, 5 Feb 2020 21:35:42 +0000 (23:35 +0200)
source/program.cpp
source/program.h
source/programdata.cpp
source/programdata.h

index e65a703f77a8d1f5f4b2d769e7c85ca0d439b2bd..37d72e94191b441a1b8be1fcbbd5317db58e794f 100644 (file)
@@ -143,6 +143,26 @@ void Program::link()
 
        query_uniforms();
        query_attributes();
+
+       for(UniformMap::const_iterator i=uniforms.begin(); i!=uniforms.end(); ++i)
+               require_type(i->second.type);
+       for(AttributeMap::const_iterator i=attributes.begin(); i!=attributes.end(); ++i)
+               require_type(i->second.type);
+}
+
+void Program::require_type(GLenum t)
+{
+       switch(t)
+       {
+       case GL_FLOAT_MAT2x3:
+       case GL_FLOAT_MAT2x4:
+       case GL_FLOAT_MAT3x2:
+       case GL_FLOAT_MAT3x4:
+       case GL_FLOAT_MAT4x2:
+       case GL_FLOAT_MAT4x3:
+               { static Require _req(NV_non_square_matrices); }
+               break;
+       }
 }
 
 void Program::query_uniforms()
index 734d665b3d5e21c5ec6e1efe8a7106980c5da003..8c1356c2678a7ec306ddfe60368d12dd5805caac 100644 (file)
@@ -111,6 +111,7 @@ public:
 
        void link();
 private:
+       static void require_type(GLenum);
        void query_uniforms();
        void query_uniform_blocks(const std::vector<UniformInfo *> &);
        void query_attributes();
index 1e4f5c1d27ceb1e3599079ecd67e455efc387c93..dba6b06f2cc8a94ca25d1006020fc567f9d1619d 100644 (file)
@@ -210,6 +210,36 @@ void ProgramData::uniform_matrix2(const string &name, const float *v)
        uniform(name, new UniformMatrix2x2f(v));
 }
 
+void ProgramData::uniform(const string &name, const LinAl::Matrix<float, 2, 3> &m)
+{
+       uniform_matrix3x2(name, &m(0, 0));
+}
+
+void ProgramData::uniform_matrix3x2(const string &name, const float *v)
+{
+       uniform(name, new UniformMatrix3x2f(v));
+}
+
+void ProgramData::uniform(const string &name, const LinAl::Matrix<float, 2, 4> &m)
+{
+       uniform_matrix4x2(name, &m(0, 0));
+}
+
+void ProgramData::uniform_matrix4x2(const string &name, const float *v)
+{
+       uniform(name, new UniformMatrix4x2f(v));
+}
+
+void ProgramData::uniform(const string &name, const LinAl::Matrix<float, 3, 2> &m)
+{
+       uniform_matrix2x3(name, &m(0, 0));
+}
+
+void ProgramData::uniform_matrix2x3(const string &name, const float *v)
+{
+       uniform(name, new UniformMatrix2x3f(v));
+}
+
 void ProgramData::uniform(const string &name, const LinAl::Matrix<float, 3, 3> &m)
 {
        uniform_matrix3(name, &m(0, 0));
@@ -220,6 +250,36 @@ void ProgramData::uniform_matrix3(const string &name, const float *v)
        uniform(name, new UniformMatrix3x3f(v));
 }
 
+void ProgramData::uniform(const string &name, const LinAl::Matrix<float, 3, 4> &m)
+{
+       uniform_matrix4x3(name, &m(0, 0));
+}
+
+void ProgramData::uniform_matrix4x3(const string &name, const float *v)
+{
+       uniform(name, new UniformMatrix4x3f(v));
+}
+
+void ProgramData::uniform(const string &name, const LinAl::Matrix<float, 4, 2> &m)
+{
+       uniform_matrix2x4(name, &m(0, 0));
+}
+
+void ProgramData::uniform_matrix2x4(const string &name, const float *v)
+{
+       uniform(name, new UniformMatrix2x4f(v));
+}
+
+void ProgramData::uniform(const string &name, const LinAl::Matrix<float, 4, 3> &m)
+{
+       uniform_matrix3x4(name, &m(0, 0));
+}
+
+void ProgramData::uniform_matrix3x4(const string &name, const float *v)
+{
+       uniform(name, new UniformMatrix3x4f(v));
+}
+
 void ProgramData::uniform(const string &name, const Matrix &m)
 {
        uniform_matrix4(name, m.data());
@@ -275,11 +335,41 @@ void ProgramData::uniform_matrix2_array(const string &name, unsigned n, const fl
        uniform(name, new UniformArray<UniformMatrix2x2f>(n, v));
 }
 
+void ProgramData::uniform_matrix3x2_array(const string &name, unsigned n, const float *v)
+{
+       uniform(name, new UniformArray<UniformMatrix3x2f>(n, v));
+}
+
+void ProgramData::uniform_matrix4x2_array(const string &name, unsigned n, const float *v)
+{
+       uniform(name, new UniformArray<UniformMatrix4x2f>(n, v));
+}
+
+void ProgramData::uniform_matrix2x3_array(const string &name, unsigned n, const float *v)
+{
+       uniform(name, new UniformArray<UniformMatrix2x3f>(n, v));
+}
+
 void ProgramData::uniform_matrix3_array(const string &name, unsigned n, const float *v)
 {
        uniform(name, new UniformArray<UniformMatrix3x3f>(n, v));
 }
 
+void ProgramData::uniform_matrix4x3_array(const string &name, unsigned n, const float *v)
+{
+       uniform(name, new UniformArray<UniformMatrix4x3f>(n, v));
+}
+
+void ProgramData::uniform_matrix2x4_array(const string &name, unsigned n, const float *v)
+{
+       uniform(name, new UniformArray<UniformMatrix2x4f>(n, v));
+}
+
+void ProgramData::uniform_matrix3x4_array(const string &name, unsigned n, const float *v)
+{
+       uniform(name, new UniformArray<UniformMatrix3x4f>(n, v));
+}
+
 void ProgramData::uniform_matrix4_array(const string &name, unsigned n, const float *v)
 {
        uniform(name, new UniformArray<UniformMatrix4x4f>(n, v));
index 08b117b4fbc2712842bfd2967f23201a29b18bcc..605b41b1359c0da3146b05d2b78e9cf7dfb96e9f 100644 (file)
@@ -181,8 +181,20 @@ public:
        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 *);
@@ -194,7 +206,13 @@ public:
        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 &);