]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programdata.cpp
Recreate RenderPass shdata if a new program is specified
[libs/gl.git] / source / programdata.cpp
index 1e4f5c1d27ceb1e3599079ecd67e455efc387c93..3561719725501a4ca7663ad4ae6c3e825e6bd10b 100644 (file)
@@ -24,7 +24,7 @@ ProgramData::ProgramData(const Program *p):
 
 // Blocks are intentionally left uncopied
 ProgramData::ProgramData(const ProgramData &other):
-       tied_program(0),
+       tied_program(other.tied_program),
        uniforms(other.uniforms),
        last_block(0),
        buffer(0),
@@ -34,6 +34,23 @@ ProgramData::ProgramData(const ProgramData &other):
                i->value = i->value->clone();
 }
 
+ProgramData::ProgramData(const ProgramData &other, const Program *p):
+       tied_program(p),
+       last_block(0),
+       buffer(0),
+       dirty(0)
+{
+       if(tied_program)
+       {
+               for(vector<NamedUniform>::const_iterator i=other.uniforms.begin(); i!=other.uniforms.end(); ++i)
+                       tied_program->get_uniform_info(i->name);
+       }
+
+       uniforms = other.uniforms;
+       for(vector<NamedUniform>::iterator i=uniforms.begin(); i!=uniforms.end(); ++i)
+               i->value = i->value->clone();
+}
+
 ProgramData &ProgramData::operator=(const ProgramData &other)
 {
        tied_program = other.tied_program;
@@ -210,6 +227,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 +267,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 +352,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));