]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/simplescene.cpp
Check the flat qualifier from the correct member
[libs/gl.git] / source / render / simplescene.cpp
index d1fd3c1cea2a4c4ad0349fb1a30017cfa2b52920..e78b4709b49be463b6c8eed8b8d505e3b73d1323 100644 (file)
@@ -1,3 +1,5 @@
+#include <msp/core/algorithm.h>
+#include "camera.h"
 #include "renderer.h"
 #include "simplescene.h"
 
@@ -6,52 +8,42 @@ namespace GL {
 
 void SimpleScene::add(Renderable &r)
 {
-       // Add to cache as well if the cache is valid
-       if(renderables.insert(&r).second && !cache.empty())
-               cache.push_back(&r);
+       auto i = lower_bound(content, &r);
+       if(i==content.end() || *i!=&r)
+               content.insert(i, &r);
 }
 
 void SimpleScene::remove(Renderable &r)
 {
-       renderables.erase(&r);
-       cache.clear();
-}
-
-void SimpleScene::populate_cache() const
-{
-       if(cache.empty() && !renderables.empty())
-       {
-               cache.reserve(renderables.size());
-               cache.insert(cache.end(), renderables.begin(), renderables.end());
-       }
+       auto i = find(content, &r);
+       if(i!=content.end())
+               content.erase(i);
 }
 
 void SimpleScene::setup_frame(Renderer &renderer)
 {
-       populate_cache();
-       for(RenderableArray::const_iterator i=cache.begin(); i!=cache.end(); ++i)
-               (*i)->setup_frame(renderer);
+       for(Renderable *r: content)
+               r->setup_frame(renderer);
 }
 
 void SimpleScene::finish_frame()
 {
-       for(RenderableArray::const_iterator i=cache.begin(); i!=cache.end(); ++i)
-               (*i)->finish_frame();
+       for(Renderable *r: content)
+               r->finish_frame();
 }
 
-void SimpleScene::render(Renderer &renderer, const Tag &tag) const
+void SimpleScene::render(Renderer &renderer, Tag tag) const
 {
-       populate_cache();
-       if(setup_frustum(renderer))
+       if(const Camera *camera = renderer.get_camera())
        {
-               for(RenderableArray::const_iterator i=cache.begin(); i!=cache.end(); ++i)
-                       if(!frustum_cull(**i))
-                               renderer.render(**i, tag);
+               for(Renderable *r: content)
+                       if(camera->is_in_frustum(*r))
+                               r->render(renderer, tag);
        }
        else
        {
-               for(RenderableArray::const_iterator i=cache.begin(); i!=cache.end(); ++i)
-                       renderer.render(**i, tag);
+               for(Renderable *r: content)
+                       r->render(renderer, tag);
        }
 }