X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Frender%2Fobject.cpp;h=caad3a0725caa8e1de4d18d7e27c985c351daac3;hp=702faaf9217eb9b8ba1374c358f228c0952ccf68;hb=3ac3a51c623271da815c8ee60c484445871753bf;hpb=885b8ad08cfcefba4b95ec9028fa1e25df2fe171 diff --git a/source/render/object.cpp b/source/render/object.cpp index 702faaf9..caad3a07 100644 --- a/source/render/object.cpp +++ b/source/render/object.cpp @@ -1,4 +1,5 @@ #include +#include #include #include "error.h" #include "material.h" @@ -56,12 +57,11 @@ Object::LevelOfDetail &Object::get_lod(unsigned i, const char *caller) void Object::set_mesh(unsigned i, const Mesh *m) { - RefPtr &ptr = get_lod(i, "Object::set_mesh").mesh; + const Mesh *&ptr = get_lod(i, "Object::set_mesh").mesh; if(i==0 && ptr && lod0_watched) if(ResourceManager *rm = ptr->get_manager()) rm->unobserve_resource(*ptr, *this); ptr = m; - ptr.keep(); lod0_watched = false; if(i==0 && m) @@ -116,14 +116,12 @@ const Mesh *Object::get_mesh(unsigned i) const if(i>=lods.size()) return 0; - return lods[i].mesh.get(); + return lods[i].mesh; } void Object::set_technique(unsigned i, const Technique *t) { - RefPtr &ptr = get_lod(i, "Object::set_technique").technique; - ptr = t; - ptr.keep(); + get_lod(i, "Object::set_technique").technique = t; } const Technique *Object::get_technique(unsigned i) const @@ -131,7 +129,7 @@ const Technique *Object::get_technique(unsigned i) const if(i>=lods.size()) return 0; - return lods[i].technique.get(); + return lods[i].technique; } void Object::render(Renderer &renderer, Tag tag) const @@ -140,7 +138,7 @@ void Object::render(Renderer &renderer, Tag tag) const if(!pass) return; - const Mesh *mesh = lods.front().mesh.get(); + const Mesh *mesh = lods.front().mesh; if (!mesh) throw logic_error("no mesh"); @@ -159,7 +157,7 @@ void Object::render(Renderer &renderer, const ObjectInstance &inst, Tag tag) con if(!pass) return; - const Mesh *mesh = lods[lod].mesh.get(); + const Mesh *mesh = lods[lod].mesh; if (!mesh) throw logic_error("no mesh"); @@ -175,7 +173,7 @@ void Object::render(Renderer &renderer, const ObjectInstance &inst, Tag tag) con const RenderPass *Object::get_pass(Tag tag, unsigned lod) const { - const Technique *tech = lods[lod].technique.get(); + const Technique *tech = lods[lod].technique; if(!tech) throw logic_error("no technique"); return tech->find_pass(tag); @@ -183,13 +181,13 @@ const RenderPass *Object::get_pass(Tag tag, unsigned lod) const void Object::resource_loaded(Resource &res) { - if(&res==lods.front().mesh.get() && bounding_sphere.is_empty()) + if(&res==lods.front().mesh && bounding_sphere.is_empty()) update_bounding_sphere(); } void Object::resource_removed(Resource &res) { - if(&res==lods.front().mesh.get()) + if(&res==lods.front().mesh) lod0_watched = false; } @@ -249,7 +247,8 @@ void Object::LodLoader::mesh_inline() { RefPtr msh = new Mesh; load_sub(*msh); - lod.mesh = msh; + get_collection().add(format("%s/lod%d.mesh", FS::basename(get_source()), index), msh.get()); + lod.mesh = msh.release(); } void Object::LodLoader::technique(const string &n) @@ -260,11 +259,12 @@ void Object::LodLoader::technique(const string &n) void Object::LodLoader::technique_inline() { RefPtr tech = new Technique; - if(coll) - load_sub(*tech, get_collection()); - else - load_sub(*tech); - lod.technique = tech; + Technique::Loader ldr(*tech, get_collection()); + string name = format("%s/lod%d.tech", FS::basename(get_source()), index); + ldr.set_inline_base_name(name); + load_sub(*tech, get_collection()); + get_collection().add(name, tech.get()); + lod.technique = tech.release(); } } // namespace GL