X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fmaterials%2Frendermethod.cpp;h=0302a9934e75ac3c3d143155a5746c522139ff13;hb=71671ec34b63e3e43fbddb3a49e21b89ba5bbf88;hp=053197589ab1fe6e9d3c83c78261ffc3e27ebc0e;hpb=5a01404e40717c6c2cc389ed8357713e1f216f07;p=libs%2Fgl.git diff --git a/source/materials/rendermethod.cpp b/source/materials/rendermethod.cpp index 05319758..0302a993 100644 --- a/source/materials/rendermethod.cpp +++ b/source/materials/rendermethod.cpp @@ -14,18 +14,11 @@ using namespace std; namespace Msp { namespace GL { -RenderMethod::RenderMethod(): - shprog(0), - shprog_from_material(false), - shdata(0), - material(0), - face_cull(CULL_BACK), - receive_shadows(false), - image_based_lighting(false) -{ } - void RenderMethod::set_material_textures() { + if(!material) + return; + const Tag *material_texture_tags = material->get_texture_tags(); for(const Tag *tag=material_texture_tags; tag->id; ++tag) set_texture(*tag, material->get_texture(*tag), material->get_sampler(*tag)); @@ -33,7 +26,7 @@ void RenderMethod::set_material_textures() void RenderMethod::maybe_create_material_shader() { - if(shprog && !shprog_from_material) + if(!material || (shprog && !shprog_from_material)) return; map extra_spec; @@ -55,6 +48,7 @@ void RenderMethod::set_shader_program(const Program *prog, const ProgramData *da shprog = prog; shprog_from_material = false; shdata = (data ? new ProgramData(*data) : 0); + maybe_create_material_shader(); } Tag RenderMethod::get_slotted_uniform_tag(Tag slot) const @@ -96,9 +90,21 @@ void RenderMethod::set_face_cull(CullMode fc) face_cull = fc; } +void RenderMethod::set_blend(const Blend &b) +{ + blend = b; +} + void RenderMethod::set_receive_shadows(bool rs) { receive_shadows = 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 @@ -109,6 +115,7 @@ void RenderMethod::apply(Renderer &renderer) const if(material) renderer.add_shader_data(material->get_shader_data()); renderer.set_face_cull(face_cull); + renderer.set_blend(&blend); } void RenderMethod::set_debug_name(const string &name) @@ -132,6 +139,8 @@ RenderMethod::Loader::Loader(RenderMethod &p, Collection &c): 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("image_based_lighting", &RenderMethod::image_based_lighting); @@ -156,6 +165,16 @@ void RenderMethod::Loader::finish() obj.maybe_create_material_shader(); } +void RenderMethod::Loader::blend() +{ + load_sub(obj.blend); +} + +void RenderMethod::Loader::blend_factors(BlendFactor src, BlendFactor dest) +{ + obj.blend = Blend(src, dest); +} + void RenderMethod::Loader::material_inline() { Material::GenericLoader ldr(get_collection());