]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/occludedscene.cpp
Move WindowView::render to the backend
[libs/gl.git] / source / render / occludedscene.cpp
index 5d85b5d5bf762d43f056d114e383cd613ef67198..0d8a5b857698d17d3a67e91e2367d674424eec05 100644 (file)
@@ -1,4 +1,4 @@
-#include <algorithm>
+#include <msp/core/algorithm.h>
 #include "camera.h"
 #include "mesh.h"
 #include "occludedscene.h"
@@ -21,14 +21,22 @@ OccludedScene::OccludedScene():
 
 void OccludedScene::add(Renderable &r)
 {
-       renderables.insert(&r);
-       cache_dirty = true;
+       auto i = lower_bound(content, &r);
+       if(i==content.end() || *i!=&r)
+       {
+               content.insert(i, &r);
+               cache_dirty = true;
+       }
 }
 
 void OccludedScene::remove(Renderable &r)
 {
-       renderables.erase(&r);
-       cache_dirty = true;
+       auto i = lower_bound(content, &r);
+       if(i!=content.end() && *i==&r)
+       {
+               content.erase(i);
+               cache_dirty = true;
+       }
 }
 
 void OccludedScene::populate_cache() const
@@ -36,13 +44,13 @@ void OccludedScene::populate_cache() const
        if(!cache_dirty)
                return;
 
-       if(queries.get_size()<renderables.size())
-               queries.resize(renderables.size());
-       if(occluded_cache.size()<renderables.size())
-               occluded_cache.resize(renderables.size());
+       if(queries.get_size()<content.size())
+               queries.resize(content.size());
+       if(occluded_cache.size()<content.size())
+               occluded_cache.resize(content.size());
 
        auto j = occluded_cache.begin();
-       for(Renderable *r: renderables)
+       for(Renderable *r: content)
                j++->renderable = r;
        for(; j!=occluded_cache.end(); ++j)
        {
@@ -68,7 +76,7 @@ void OccludedScene::finish_frame()
 
 void OccludedScene::render(Renderer &renderer, Tag tag) const
 {
-       if(renderables.empty())
+       if(content.empty())
                return;
 
        populate_cache();
@@ -111,7 +119,7 @@ void OccludedScene::render(Renderer &renderer, Tag tag) const
        }
 
        // Move all objects within the frustum to the beginning of the array
-       for(auto i=occluded_cache.begin(), j=i+renderables.size()-1; i!=j; )
+       for(auto i=occluded_cache.begin(), j=i+content.size()-1; i!=j; )
        {
                if(i->in_frustum)
                        ++i;