]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/object.cpp
Add inline data items to the collection
[libs/gl.git] / source / render / object.cpp
index 702faaf9217eb9b8ba1374c358f228c0952ccf68..caad3a0725caa8e1de4d18d7e27c985c351daac3 100644 (file)
@@ -1,4 +1,5 @@
 #include <msp/datafile/collection.h>
+#include <msp/fs/utils.h>
 #include <msp/strings/format.h>
 #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<const Mesh> &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<const Technique> &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<Mesh> 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<Technique> 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