X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fobject.cpp;h=dc1f4f3f1a7996bd55008732df21c0c826f27af5;hb=b13f1bced27e0ad3e4661e645f6bafed38359120;hp=bdb292bb64e4721208c7bed12dca73bb30d03433;hpb=53953f28255e782ed640a9e8d2d42c9b218943ad;p=libs%2Fgl.git diff --git a/source/object.cpp b/source/object.cpp index bdb292bb..dc1f4f3f 100644 --- a/source/object.cpp +++ b/source/object.cpp @@ -17,6 +17,8 @@ using namespace std; namespace Msp { namespace GL { +Matrix Object::identity_matrix; + Object::Object(): lods(1), lod0_watched(false) @@ -36,7 +38,7 @@ 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) @@ -57,7 +59,7 @@ void Object::set_mesh(unsigned i, const Mesh *m) RefPtr &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; @@ -65,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; } @@ -138,11 +140,15 @@ void Object::render(Renderer &renderer, const Tag &tag) const 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); } @@ -153,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); } @@ -168,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)