X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fmaterials%2Frendermethod.cpp;h=ddbe4f1e457e83760dc699bce85ad52dd64ac29e;hp=2b4738ef46e0b2dd2a21f0fb38f463072f4368e9;hb=HEAD;hpb=b1862c511570cb82155cc8c0628e1e903388fc10 diff --git a/source/materials/rendermethod.cpp b/source/materials/rendermethod.cpp index 2b4738ef..78b937d0 100644 --- a/source/materials/rendermethod.cpp +++ b/source/materials/rendermethod.cpp @@ -34,11 +34,17 @@ void RenderMethod::maybe_create_material_shader() extra_spec["use_shadow_map"] = true; if(image_based_lighting) extra_spec["use_image_based_lighting"] = true; + if(instancing) + extra_spec["use_instancing"] = true; 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 +53,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 +83,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; @@ -101,6 +113,12 @@ void RenderMethod::set_receive_shadows(bool rs) maybe_create_material_shader(); } +void RenderMethod::set_image_based_lighting(bool ibl) +{ + image_based_lighting = ibl; + maybe_create_material_shader(); +} + void RenderMethod::apply(Renderer &renderer) const { for(const TextureSlot &t: textures) @@ -136,8 +154,9 @@ void RenderMethod::Loader::init_actions() add("blend", &Loader::blend); add("blend", &Loader::blend_factors); add("face_cull", &RenderMethod::face_cull); - add("shader", &Loader::shader); + add("shader", &Loader::shader); add("image_based_lighting", &RenderMethod::image_based_lighting); + add("instancing", &RenderMethod::instancing); add("material", &Loader::material_inline); add("material", &Loader::material); add("material_slot", &RenderMethod::material_slot); @@ -188,7 +207,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) @@ -196,7 +219,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); @@ -210,7 +233,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); }