X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Frender%2Foccludedscene.cpp;h=644e380d15ab10a25917571fd29d61522040a99f;hb=016f0f0dd51511f98d0bf398d99199d7dec1543c;hp=fd6ea5de13b7c4aebc4b8140145a4d21769c3682;hpb=38712d8ecc57d043a2419ffbaeeb57f7a6586f14;p=libs%2Fgl.git diff --git a/source/render/occludedscene.cpp b/source/render/occludedscene.cpp index fd6ea5de..644e380d 100644 --- a/source/render/occludedscene.cpp +++ b/source/render/occludedscene.cpp @@ -1,4 +1,4 @@ -#include +#include #include "camera.h" #include "mesh.h" #include "occludedscene.h" @@ -13,7 +13,7 @@ namespace GL { OccludedScene::OccludedScene(): bounding_mesh(Resources::get_global().get("_occluder.mesh")), - bounding_shader(Resources::get_global().get("_occluder.glsl.shader")), + bounding_shader(Resources::get_global().get("occluder.glsl.shader")), queries(OCCLUSION_QUERY, 0) { no_color_write.write_mask = WRITE_NONE; @@ -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()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(); @@ -77,7 +85,7 @@ void OccludedScene::render(Renderer &renderer, Tag tag) const if(!camera) { for(const OccludedRenderable &o: occluded_cache) - renderer.render(*o.renderable, tag); + o.renderable->render(renderer, tag); return; } @@ -107,11 +115,11 @@ void OccludedScene::render(Renderer &renderer, Tag tag) const i->occluder = true; if(i->occluder) - renderer.render(*i->renderable, tag); + i->renderable->render(renderer, tag); } // 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; @@ -135,7 +143,7 @@ void OccludedScene::render(Renderer &renderer, Tag tag) const { QueryPool::Activate activate_query(renderer, queries, i-occluded_cache.begin()); Renderer::Push push2(renderer); - renderer.transform(Matrix(*i->renderable->get_matrix()) + renderer.set_matrix(Matrix(*i->renderable->get_matrix()) .translate(i->bounding_sphere->get_center()) .scale(i->bounding_sphere->get_radius())); bounding_mesh.draw(renderer); @@ -145,7 +153,7 @@ void OccludedScene::render(Renderer &renderer, Tag tag) const // Render anything that has a chance of being visible for(auto i=occluded_cache.begin(); (i!=occluded_cache.end() && i->in_frustum); ++i) if(!i->occluder && queries.get_result(i-occluded_cache.begin())) - renderer.render(*i->renderable, tag); + i->renderable->render(renderer, tag); } } // namespace GL