]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/zsortedscene.cpp
Use a sorted vector in place of set for small data
[libs/gl.git] / source / render / zsortedscene.cpp
index b9833dadff84ed31f5418bd2a526b3a905d9cd51..af3c5b86140823968a12cc19cf36a747fe3b5c1c 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(renderables, &r);
+       if(i==renderables.end() || *i!=&r)
+       {
+               renderables.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(renderables, &r);
+       if(i!=renderables.end() && *i==&r)
+       {
+               renderables.erase(i);
+               sorted_cache.clear();
+       }
 }
 
 void ZSortedScene::set_order(SortOrder o)
@@ -62,7 +72,7 @@ void ZSortedScene::render(Renderer &renderer, Tag tag) const
        if(!camera)
        {
                for(const SortedRenderable &r: sorted_cache)
-                       renderer.render(*r.renderable, tag);
+                       r.renderable->render(renderer, tag);
                return;
        }
 
@@ -113,7 +123,7 @@ void ZSortedScene::render(Renderer &renderer, Tag tag) const
                }
 
        for(auto i=sorted_cache.begin(); (i!=sorted_cache.end() && i->in_frustum); ++i)
-               renderer.render(*i->renderable, tag);
+               i->renderable->render(renderer, tag);
 }