X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Foccludedscene.cpp;h=b3219123e8a2ed777d1a3a75d3691864e943712b;hp=2e140a534537c076b54b804dd0a09db16d7878bc;hb=e16855bccb78c721e2fe3f2ea8fc0310e041cb43;hpb=d031a80ea06e3ccd01041e9c6024fa62adf25160 diff --git a/source/occludedscene.cpp b/source/occludedscene.cpp index 2e140a53..b3219123 100644 --- a/source/occludedscene.cpp +++ b/source/occludedscene.cpp @@ -48,41 +48,59 @@ void OccludedScene::remove(Renderable &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();