]> git.tdb.fi Git - libs/gl.git/blobdiff - source/occludedscene.cpp
Use a type registry to manage postprocessor types for pipeline templates
[libs/gl.git] / source / occludedscene.cpp
index 2e140a534537c076b54b804dd0a09db16d7878bc..b3219123e8a2ed777d1a3a75d3691864e943712b 100644 (file)
@@ -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()<renderables.size())
        {
-               for(RenderableSet::const_iterator i=renderables.begin(); i!=renderables.end(); ++i)
-                       renderer.render(**i, tag);
-               return;
+               unsigned old_size = occluded_cache.size();
+               occluded_cache.resize(renderables.size());
+               vector<unsigned> new_queries(occluded_cache.size()-old_size);
+               glGenQueries(new_queries.size(), &new_queries[0]);
+               for(unsigned i=0; i<new_queries.size(); ++i)
+                       occluded_cache[old_size+i].query = new_queries[i];
        }
 
-       if(cache_dirty)
+       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)
        {
-               if(occluded_cache.size()<renderables.size())
-               {
-                       unsigned old_size = occluded_cache.size();
-                       occluded_cache.resize(renderables.size());
-                       vector<unsigned> new_queries(occluded_cache.size()-old_size);
-                       glGenQueries(new_queries.size(), &new_queries[0]);
-                       for(unsigned i=0; i<new_queries.size(); ++i)
-                               occluded_cache[old_size+i].query = new_queries[i];
-               }
+               j->renderable = 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();