]> git.tdb.fi Git - libs/gl.git/commitdiff
Add interfaces for culling
authorMikko Rasa <tdb@tdb.fi>
Mon, 9 Sep 2013 16:06:44 +0000 (19:06 +0300)
committerMikko Rasa <tdb@tdb.fi>
Mon, 9 Sep 2013 16:06:44 +0000 (19:06 +0300)
Culler implementations to come soon.

source/culler.h [new file with mode: 0644]
source/instancescene.cpp
source/orderedscene.cpp
source/scene.cpp
source/scene.h
source/simplescene.cpp

diff --git a/source/culler.h b/source/culler.h
new file mode 100644 (file)
index 0000000..c813f8d
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef MSP_GL_CULLER_H_
+#define MSP_GL_CULLER_H_
+
+namespace Msp {
+namespace GL {
+
+class Renderable;
+class Renderer;
+
+class Culler
+{
+protected:
+       Culler() { }
+public:
+       virtual ~Culler() { }
+
+       virtual void setup_frame(const Renderer &) { };
+
+       virtual bool cull(const Renderer &, const Renderable &) const = 0;
+};
+
+} // namespace GL
+} // namespace Msp
+
+#endif
index 7b0979c8f5c0923d523e09a614a5acd977914fc9..0ff9b520dd30247465719f5609961698cba9ecf3 100644 (file)
@@ -38,9 +38,11 @@ void InstanceScene::finish_frame() const
 
 void InstanceScene::render(Renderer &renderer, const Tag &tag) const
 {
+       setup_cullers(renderer);
        for(InstanceMap::const_iterator i=renderables.begin(); i!=renderables.end(); ++i)
                for(RenderableSet::const_iterator j=i->second.begin(); j!=i->second.end(); ++j)
-                       renderer.render(**j, tag);
+                       if(!cull(renderer, **j))
+                               renderer.render(**j, tag);
 }
 
 } // namespace GL
index e738cad7ace50fb84a096aea52c6eafde68cbb2a..fe968f0c430ca2c127458dde5cafa6678047001c 100644 (file)
@@ -49,8 +49,10 @@ void OrderedScene::finish_frame() const
 
 void OrderedScene::render(Renderer &renderer, const Tag &tag) const
 {
+       setup_cullers(renderer);
        for(RenderableList::const_iterator i=renderables.begin(); i!=renderables.end(); ++i)
-               renderer.render(**i, tag);
+               if(!cull(renderer, **i))
+                       renderer.render(**i, tag);
 }
 
 } // namespace GL
index d95909e9a10ebd59035d44ddcda7714a44106793..517158f056108943a7c6a2c47902e194799f5348 100644 (file)
@@ -1,14 +1,43 @@
+#include "culler.h"
 #include "renderer.h"
 #include "scene.h"
 
+using namespace std;
+
 namespace Msp {
 namespace GL {
 
+void Scene::add_culler(Culler &c)
+{
+       cullers.push_back(&c);
+}
+
+void Scene::remove_culler(Culler &c)
+{
+       list<Culler *>::iterator i = find(cullers.begin(), cullers.end(), &c);
+       if(i!=cullers.end())
+               cullers.erase(i);
+}
+
 void Scene::render(const Tag &tag) const
 {
        Renderer renderer(0);
        render(renderer, tag);
 }
 
+void Scene::setup_cullers(const Renderer &renderer) const
+{
+       for(list<Culler *>::const_iterator i=cullers.begin(); i!=cullers.end(); ++i)
+               (*i)->setup_frame(renderer);
+}
+
+bool Scene::cull(const Renderer &renderer, const Renderable &renderable) const
+{
+       for(list<Culler *>::const_iterator i=cullers.begin(); i!=cullers.end(); ++i)
+               if((*i)->cull(renderer, renderable))
+                       return true;
+       return false;
+}
+
 } // namespace GL
 } // namespace Msp
index 19048eb305a9f2ca8e8a21eca741f4671ebf813e..e3aa1fabb2cd5829e6567b706712b1580192b991 100644 (file)
@@ -6,6 +6,8 @@
 namespace Msp {
 namespace GL {
 
+class Culler;
+
 /**
 Scenes are containers for other Renderables.  This is a base class that can't
 be instantiated.  At the moment the available Scene types are SimpleScene,
@@ -14,6 +16,8 @@ InstancedScene and OrderedScene.
 class Scene: public Renderable
 {
 protected:
+       std::list<Culler *> cullers;
+
        Scene() { }
 public:
        virtual ~Scene() { }
@@ -21,8 +25,15 @@ public:
        virtual void add(const Renderable &) = 0;
        virtual void remove(const Renderable &) = 0;
 
+       void add_culler(Culler &);
+       void remove_culler(Culler &);
+
        using Renderable::render;
        virtual void render(const Tag & = Tag()) const;
+
+protected:
+       virtual void setup_cullers(const Renderer &) const;
+       virtual bool cull(const Renderer &, const Renderable &) const;
 };
 
 } // namespace GL
index f866f678280b2b4b2786aa2f5920fb9b816472fc..c537ff3b87eef6ff3158b206accd0ab7b9d0c9c6 100644 (file)
@@ -28,8 +28,10 @@ void SimpleScene::finish_frame() const
 
 void SimpleScene::render(Renderer &renderer, const Tag &tag) const
 {
+       setup_cullers(renderer);
        for(RenderableSet::const_iterator i=renderables.begin(); i!=renderables.end(); ++i)
-               renderer.render(**i, tag);
+               if(!cull(renderer, **i))
+                       renderer.render(**i, tag);
 }
 
 } // namespace GL