X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fmaterials%2Frendermethod.cpp;h=ddbe4f1e457e83760dc699bce85ad52dd64ac29e;hb=5ced451549e2238bb1195d03419437a395b9afec;hp=0302a9934e75ac3c3d143155a5746c522139ff13;hpb=71671ec34b63e3e43fbddb3a49e21b89ba5bbf88;p=libs%2Fgl.git diff --git a/source/materials/rendermethod.cpp b/source/materials/rendermethod.cpp index 0302a993..ddbe4f1e 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(); } @@ -71,7 +81,7 @@ void RenderMethod::set_texture(Tag tag, const Texture *tex, const Sampler *samp) auto i = find_member(textures, tag, &TextureSlot::tag); if(i==textures.end()) { - textures.push_back(TextureSlot(tag)); + textures.emplace_back(tag); i = textures.end()-1; } i->texture = tex; @@ -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) @@ -202,7 +216,7 @@ void RenderMethod::Loader::texture(const string &n) auto i = find_member(obj.textures, Tag(n), &TextureSlot::tag); if(i==obj.textures.end()) { - obj.textures.push_back(TextureSlot(n)); + obj.textures.emplace_back(n); i = obj.textures.end()-1; } TextureSlot::Loader ldr(*i, n, coll); @@ -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); }