]> git.tdb.fi Git - libs/gl.git/blobdiff - source/object.cpp
Remove the deprecated ProgramBuilder class
[libs/gl.git] / source / object.cpp
index a27553a6236e029c27cfe547304b00e84371f5e5..dc1f4f3f1a7996bd55008732df21c0c826f27af5 100644 (file)
@@ -17,6 +17,8 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
+Matrix Object::identity_matrix;
+
 Object::Object():
        lods(1),
        lod0_watched(false)
@@ -30,11 +32,13 @@ Object::Object(const Mesh *m, const Technique *t):
        set_technique(t);
 }
 
+// TODO should have copy-c'tor to set watch on lod0 mesh if necessary
+
 Object::~Object()
 {
        if(lods[0].mesh && lod0_watched)
                if(ResourceManager *rm = lods[0].mesh->get_manager())
-                       rm->unwatch_resource(*lods[0].mesh, *this);
+                       rm->unobserve_resource(*lods[0].mesh, *this);
 }
 
 Object::LevelOfDetail &Object::get_lod(unsigned i, const char *caller)
@@ -55,7 +59,7 @@ void Object::set_mesh(unsigned i, const Mesh *m)
        RefPtr<const Mesh> &ptr = get_lod(i, "Object::set_mesh").mesh;
        if(i==0 && ptr && lod0_watched)
                if(ResourceManager *rm = ptr->get_manager())
-                       rm->unwatch_resource(*ptr, *this);
+                       rm->unobserve_resource(*ptr, *this);
        ptr = m;
        ptr.keep();
        lod0_watched = false;
@@ -63,7 +67,7 @@ void Object::set_mesh(unsigned i, const Mesh *m)
        if(i==0 && m)
                if(ResourceManager *rm = m->get_manager())
                {
-                       rm->watch_resource(*m, *this);
+                       rm->observe_resource(*m, *this);
                        lod0_watched = true;
                }
 
@@ -130,32 +134,21 @@ const Technique *Object::get_technique(unsigned i) const
        return lods[i].technique.get();
 }
 
-void Object::render(const Tag &tag) const
-{
-       const RenderPass *pass = get_pass(tag, 0);
-       if(!pass)
-               return;
-
-       Bind bind_shader(pass->get_shader_program());
-       if(pass->get_shader_data())
-               pass->get_shader_data()->apply();
-       Bind bind_material(pass->get_material());
-       Bind bind_texturing(pass->get_texturing());
-
-       lods.front().mesh->draw();
-}
-
 void Object::render(Renderer &renderer, const Tag &tag) const
 {
        const RenderPass *pass = get_pass(tag, 0);
        if(!pass)
                return;
 
+       const Mesh *mesh = lods.front().mesh.get();
+       if (!mesh)
+               throw logic_error("no mesh");
+
        Renderer::Push push(renderer);
        pass->apply(renderer);
 
        setup_render(renderer, tag);
-       lods.front().mesh->draw(renderer);
+       mesh->draw(renderer);
        finish_render(renderer, tag);
 }
 
@@ -166,12 +159,16 @@ void Object::render(Renderer &renderer, const ObjectInstance &inst, const Tag &t
        if(!pass)
                return;
 
+       const Mesh *mesh = lods[lod].mesh.get();
+       if (!mesh)
+               throw logic_error("no mesh");
+
        Renderer::Push push(renderer);
        pass->apply(renderer);
 
        setup_render(renderer, tag);
        inst.setup_render(renderer, tag);
-       lods[lod].mesh->draw(renderer);
+       mesh->draw(renderer);
        inst.finish_render(renderer, tag);
        finish_render(renderer, tag);
 }
@@ -181,9 +178,7 @@ const RenderPass *Object::get_pass(const Tag &tag, unsigned lod) const
        const Technique *tech = lods[lod].technique.get();
        if(!tech)
                throw logic_error("no technique");
-       if(!tech->has_pass(tag))
-               return 0;
-       return &tech->get_pass(tag);
+       return tech->find_pass(tag);
 }
 
 void Object::resource_loaded(Resource &res)