X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Foccludedscene.cpp;h=b3219123e8a2ed777d1a3a75d3691864e943712b;hp=3d540a72ac8739e6b780ff7e7cc19845104741fc;hb=71240e5c5ef7165313664ee9fe81df95c0eff10b;hpb=782344299d402dfc7e4eb038bba876d7455f50f5 diff --git a/source/occludedscene.cpp b/source/occludedscene.cpp index 3d540a72..b3219123 100644 --- a/source/occludedscene.cpp +++ b/source/occludedscene.cpp @@ -36,53 +36,71 @@ OccludedScene::~OccludedScene() glDeleteQueries(queries.size(), &queries[0]); } -void OccludedScene::add(const Renderable &r) +void OccludedScene::add(Renderable &r) { renderables.insert(&r); cache_dirty = true; } -void OccludedScene::remove(const Renderable &r) +void OccludedScene::remove(Renderable &r) { renderables.erase(&r); cache_dirty = true; } -void OccludedScene::render(Renderer &renderer, const Tag &tag) const +void OccludedScene::populate_cache() const { - if(renderables.empty()) + if(!cache_dirty) return; - const Camera *camera = renderer.get_camera(); - if(!camera) + if(occluded_cache.size() new_queries(occluded_cache.size()-old_size); + glGenQueries(new_queries.size(), &new_queries[0]); + for(unsigned i=0; irenderable = *i; + for(; j!=occluded_cache.end(); ++j) { - if(occluded_cache.size() new_queries(occluded_cache.size()-old_size); - glGenQueries(new_queries.size(), &new_queries[0]); - for(unsigned i=0; irenderable = 0; + j->in_frustum = false; + } - OccludedArray::iterator j = occluded_cache.begin(); - for(RenderableSet::iterator i=renderables.begin(); i!=renderables.end(); ++i, ++j) - j->renderable = *i; - for(; j!=occluded_cache.end(); ++j) - { - j->renderable = 0; - j->in_frustum = false; - } + cache_dirty = false; +} + +void OccludedScene::setup_frame(Renderer &renderer) +{ + populate_cache(); + for(OccludedArray::const_iterator i=occluded_cache.begin(); i!=occluded_cache.end(); ++i) + i->renderable->setup_frame(renderer); +} - cache_dirty = false; +void OccludedScene::finish_frame() +{ + for(OccludedArray::const_iterator i=occluded_cache.begin(); i!=occluded_cache.end(); ++i) + i->renderable->finish_frame(); +} + +void OccludedScene::render(Renderer &renderer, const Tag &tag) const +{ + if(renderables.empty()) + return; + + populate_cache(); + + const Camera *camera = renderer.get_camera(); + if(!camera) + { + for(OccludedArray::const_iterator i=occluded_cache.begin(); i!=occluded_cache.end(); ++i) + renderer.render(*i->renderable, tag); + return; } const Vector3 &camera_pos = camera->get_position();