]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/zsortedscene.cpp
Move WindowView::render to the backend
[libs/gl.git] / source / render / zsortedscene.cpp
index dd5f1f3ac701f727cd81b67b44f153eaa99d6282..25255dc693569a9d34b2adfc7b64f709089af63e 100644 (file)
@@ -1,3 +1,4 @@
+#include <msp/core/algorithm.h>
 #include "camera.h"
 #include "renderer.h"
 #include "zsortedscene.h"
@@ -9,14 +10,23 @@ namespace GL {
 
 void ZSortedScene::add(Renderable &r)
 {
-       if(renderables.insert(&r).second && !sorted_cache.empty())
-               sorted_cache.push_back(&r);
+       auto i = lower_bound(content, &r);
+       if(i==content.end() || *i!=&r)
+       {
+               content.insert(i, &r);
+               if(!sorted_cache.empty())
+                       sorted_cache.push_back(&r);
+       }
 }
 
 void ZSortedScene::remove(Renderable &r)
 {
-       renderables.erase(&r);
-       sorted_cache.clear();
+       auto i = lower_bound(content, &r);
+       if(i!=content.end() && *i==&r)
+       {
+               content.erase(i);
+               sorted_cache.clear();
+       }
 }
 
 void ZSortedScene::set_order(SortOrder o)
@@ -31,10 +41,10 @@ void ZSortedScene::set_reference(DepthReference r)
 
 void ZSortedScene::populate_cache() const
 {
-       if(sorted_cache.empty() && !renderables.empty())
+       if(sorted_cache.empty() && !content.empty())
        {
-               sorted_cache.reserve(renderables.size());
-               sorted_cache.insert(sorted_cache.end(), renderables.begin(), renderables.end());
+               sorted_cache.reserve(content.size());
+               sorted_cache.insert(sorted_cache.end(), content.begin(), content.end());
        }
 }
 
@@ -53,7 +63,7 @@ void ZSortedScene::finish_frame()
 
 void ZSortedScene::render(Renderer &renderer, Tag tag) const
 {
-       if(renderables.empty())
+       if(content.empty())
                return;
 
        populate_cache();