X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fmaterials%2Frendermethod.cpp;h=5c838ef945624629483ea2fff992b1564285137a;hp=0302a9934e75ac3c3d143155a5746c522139ff13;hb=9ec0e018234391efa66cc0f4080bfe470b910288;hpb=e70662d7812464159f2e47f4bebb69d88f89ae93 diff --git a/source/materials/rendermethod.cpp b/source/materials/rendermethod.cpp index 0302a993..5c838ef9 100644 --- a/source/materials/rendermethod.cpp +++ b/source/materials/rendermethod.cpp @@ -38,7 +38,11 @@ void RenderMethod::maybe_create_material_shader() shprog = material->create_compatible_shader(extra_spec); if(shdata) - shdata = new ProgramData(*shdata, shprog); + { + RefPtr old_shdata = shdata; + shdata = new ProgramData(shprog); + shdata->copy_uniforms(*old_shdata); + } shprog_from_material = true; } @@ -47,7 +51,13 @@ void RenderMethod::set_shader_program(const Program *prog, const ProgramData *da { shprog = prog; shprog_from_material = false; - shdata = (data ? new ProgramData(*data) : 0); + if(data) + { + shdata = new ProgramData; + shdata->copy_uniforms(*data); + } + else + shdata = 0; maybe_create_material_shader(); } @@ -194,7 +204,11 @@ void RenderMethod::Loader::shader(const string &n) obj.shprog = &get_collection().get(n); obj.shprog_from_material = false; if(obj.shdata) - obj.shdata = new ProgramData(*obj.shdata, obj.shprog); + { + RefPtr old_shdata = obj.shdata; + obj.shdata = new ProgramData(obj.shprog); + obj.shdata->copy_uniforms(*old_shdata); + } } void RenderMethod::Loader::texture(const string &n) @@ -216,7 +230,11 @@ void RenderMethod::Loader::uniforms() if(!obj.shdata) obj.shdata = new ProgramData(obj.shprog); else if(obj.shdata.refcount()>1) - obj.shdata = new ProgramData(*obj.shdata); + { + RefPtr old_shdata = obj.shdata; + obj.shdata = new ProgramData; + obj.shdata->copy_uniforms(*old_shdata); + } load_sub(*obj.shdata); }