X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fmaterials%2Frenderpass.cpp;h=475f3ed8797c4e6a0bbbda0b7d28938539be9d34;hb=5b652353d545a3190ea2d86ba82a87b2e3382a0d;hp=6e33b5d1f7256a638ab754267b0e010057e277ef;hpb=6b9338845dfee441cd18ad6c633e4feef8ad14e1;p=libs%2Fgl.git diff --git a/source/materials/renderpass.cpp b/source/materials/renderpass.cpp index 6e33b5d1..475f3ed8 100644 --- a/source/materials/renderpass.cpp +++ b/source/materials/renderpass.cpp @@ -9,7 +9,6 @@ #include "renderer.h" #include "texture.h" #include "texture2d.h" -#include "texturing.h" #include "uniform.h" using namespace std; @@ -46,10 +45,9 @@ void RenderPass::maybe_create_material_shader() extra_spec["use_image_based_lighting"] = true; shprog = material->create_compatible_shader(extra_spec); - shprog.keep(); if(shdata) - shdata = new ProgramData(*shdata, shprog.get()); + shdata = new ProgramData(*shdata, shprog); shprog_from_material = true; } @@ -57,7 +55,6 @@ void RenderPass::maybe_create_material_shader() void RenderPass::set_shader_program(const Program *prog, const ProgramData *data) { shprog = prog; - shprog.keep(); shprog_from_material = false; shdata = (data ? new ProgramData(*data) : 0); } @@ -73,7 +70,6 @@ Tag RenderPass::get_slotted_uniform_tag(Tag slot) const void RenderPass::set_material(const Material *mat) { material = mat; - material.keep(); maybe_create_material_shader(); set_material_textures(); } @@ -142,8 +138,9 @@ void RenderPass::apply(Renderer &renderer) const { for(vector::const_iterator i=textures.begin(); i!=textures.end(); ++i) renderer.set_texture(i->tag, i->texture, i->sampler); - renderer.set_material(material.get()); - renderer.set_shader_program(shprog.get(), shdata.get()); + renderer.set_shader_program(shprog, shdata.get()); + if(material) + renderer.add_shader_data(material->get_shader_data()); renderer.set_reverse_winding(back_faces); } @@ -192,6 +189,11 @@ void RenderPass::Loader::init_actions() add("texunit", &Loader::texunit_named); } +void RenderPass::Loader::set_inline_base_name(const string &n) +{ + inline_base_name = n; +} + void RenderPass::Loader::finish() { if(obj.material) @@ -213,24 +215,24 @@ void RenderPass::Loader::material_inline() { Material::GenericLoader ldr(coll); load_sub_with(ldr); - obj.material = ldr.get_material(); + RefPtr mat = ldr.get_material(); + get_collection().add(inline_base_name+".mat", mat.get()); + obj.material = mat.release(); obj.set_material_textures(); } void RenderPass::Loader::material(const string &name) { obj.material = &get_collection().get(name); - obj.material.keep(); obj.set_material_textures(); } void RenderPass::Loader::shader(const string &n) { obj.shprog = &get_collection().get(get_shader_name(n)); - obj.shprog.keep(); obj.shprog_from_material = false; if(obj.shdata) - obj.shdata = new ProgramData(*obj.shdata, obj.shprog.get()); + obj.shdata = new ProgramData(*obj.shdata, obj.shprog); } void RenderPass::Loader::texture(const string &n) @@ -280,7 +282,7 @@ void RenderPass::Loader::uniforms() if(!obj.shprog || obj.shprog_from_material) throw runtime_error("Shader is required for uniforms"); if(!obj.shdata) - obj.shdata = new ProgramData(obj.shprog.get()); + obj.shdata = new ProgramData(obj.shprog); else if(obj.shdata.refcount()>1) obj.shdata = new ProgramData(*obj.shdata); load_sub(*obj.shdata);