X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fmaterials%2Frendermethod.cpp;h=2b4738ef46e0b2dd2a21f0fb38f463072f4368e9;hb=b1862c511570cb82155cc8c0628e1e903388fc10;hp=a6a843ee59f1770dbe17b9d9d2286ad3c79a8dcf;hpb=c0b7d6ee4a7478f5aecb1504429ec1fc846d64ed;p=libs%2Fgl.git diff --git a/source/materials/rendermethod.cpp b/source/materials/rendermethod.cpp index a6a843ee..2b4738ef 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,15 @@ 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::apply(Renderer &renderer) const @@ -109,6 +109,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) @@ -124,12 +125,6 @@ void RenderMethod::set_debug_name(const string &name) DataFile::Loader::ActionMap RenderMethod::Loader::shared_actions; -RenderMethod::Loader::Loader(RenderMethod &p): - DataFile::CollectionObjectLoader(p, 0) -{ - set_actions(shared_actions); -} - RenderMethod::Loader::Loader(RenderMethod &p, Collection &c): DataFile::CollectionObjectLoader(p, &c) { @@ -138,6 +133,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); @@ -162,13 +159,21 @@ 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(coll); + Material::GenericLoader ldr(get_collection()); load_sub_with(ldr); - RefPtr mat = ldr.get_material(); - get_collection().add(inline_base_name+".mat", mat.get()); - obj.material = mat.release(); + obj.material = ldr.store_object(get_collection(), inline_base_name+".mat"); obj.set_material_textures(); }