]> git.tdb.fi Git - libs/gl.git/blobdiff - source/renderpass.cpp
Automatically add uniforms for texunits
[libs/gl.git] / source / renderpass.cpp
index be5bb170280844d88c8b3e8f46fd22cb72e902de..4e3b1f1332bbd0dcda294940821d61be091604f3 100644 (file)
@@ -52,6 +52,17 @@ RenderPass::~RenderPass()
        delete texturing;
 }
 
+void RenderPass::ensure_private_shader_data()
+{
+       if(!shprog)
+               throw invalid_operation("RenderPass::ensure_private_shader_data");
+
+       if(!shdata)
+               shdata = new ProgramData(shprog);
+       else if(shdata.refcount() > 1)
+               shdata = new ProgramData(*shdata);
+}
+
 void RenderPass::set_shader_program(const Program *prog, const ProgramData *data)
 {
        shprog = prog;
@@ -153,12 +164,13 @@ void RenderPass::Loader::texunit_named(unsigned i, const string &n)
 {
        texunit(i);
        obj.tex_names[n] = i;
+       obj.ensure_private_shader_data();
+       obj.shdata->uniform(n, static_cast<int>(i));
 }
 
 void RenderPass::Loader::uniforms()
 {
-       if(!obj.shprog)
-               throw invalid_operation("RenderPass::Loader::uniforms");
+       obj.ensure_private_shader_data();
        RefPtr<ProgramData> shd = new ProgramData(obj.shprog);
        load_sub(*shd);
        obj.shdata = shd.release();