]> git.tdb.fi Git - libs/gl.git/commitdiff
Require mspgbase now that Image was moved there
authorMikko Rasa <tdb@tdb.fi>
Wed, 3 Sep 2008 06:40:23 +0000 (06:40 +0000)
committerMikko Rasa <tdb@tdb.fi>
Wed, 3 Sep 2008 06:40:23 +0000 (06:40 +0000)
Discard Renderable::get_order as bad design
Refactor Object to render instances from an iterator range instead of list
Rework Scene to make use of Object's multi-instance rendering

Build
source/object.cpp
source/object.h
source/renderable.h
source/scene.cpp
source/scene.h

diff --git a/Build b/Build
index 7d435789378c347037c54c55bde066a62eb374d7..46a9b2eb06c37da3bb1b34d0aab39d49d03d7895 100644 (file)
--- a/Build
+++ b/Build
@@ -8,6 +8,7 @@ package "mspgl"
        tar_file "License.txt";
 
        require "mspdatafile";
+       require "mspgbase";
        require "opengl";
 
        library "mspgl"
index f710145a08cb23913aa6db794ca878bb2b6649ef..78f445577caa54209044e3db4dc40dd1e33b5cec 100644 (file)
@@ -59,11 +59,6 @@ void Object::render(const ObjectInstance &inst, const Tag &tag) const
        render(get_pass(tag), &inst);
 }
 
-void Object::render(const list<const ObjectInstance *> &insts, const Tag &tag) const
-{
-       render(get_pass(tag), insts);
-}
-
 void Object::setup_render(const ObjectPass &pass) const
 {
        if(!meshes[0])
@@ -105,36 +100,20 @@ void Object::render(const ObjectPass &pass, const ObjectInstance *inst) const
 {
        setup_render(pass);
 
-       unsigned lod=0;
-       if(inst)
-       {
-               inst->setup_render(pass);
-               lod=min(inst->get_level_of_detail(), meshes.size()-1);
-       }
-
-       meshes[lod]->draw();
-
        if(inst)
-               inst->finish_render(pass);
+               render_instance(pass, *inst);
+       else
+               meshes[0]->draw();
 
        finish_render(pass);
 }
 
-void Object::render(const ObjectPass &pass, const list<const ObjectInstance *> &insts) const
+void Object::render_instance(const ObjectPass &pass, const ObjectInstance &inst) const
 {
-       setup_render(pass);
-
-       for(list<const ObjectInstance *>::const_iterator i=insts.begin(); i!=insts.end(); ++i)
-       {
-               (*i)->setup_render(pass);
-
-               unsigned lod=min((*i)->get_level_of_detail(), meshes.size()-1);
-               meshes[lod]->draw();
-
-               (*i)->finish_render(pass);
-       }
-
-       finish_render(pass);
+       inst.setup_render(pass);
+       unsigned lod=min(inst.get_level_of_detail(), meshes.size()-1);
+       meshes[lod]->draw();
+       inst.finish_render(pass);
 }
 
 
index 0039dffd42500f8daadaaff85c1071df279d9564..42541eaf28004807d1e088f32f1281c1788b7800 100644 (file)
@@ -92,12 +92,24 @@ public:
        Each instance's hook functions will be called before and after drawing the
        mesh.
        */
-       void render(const std::list<const ObjectInstance *> &, const Tag &tag=Tag()) const;
+       template<typename Iter>
+       void render(Iter begin, Iter end, const Tag &tag=Tag()) const
+       { render(get_pass(tag), begin, end); }
 private:
        void setup_render(const ObjectPass &) const;
        void finish_render(const ObjectPass &) const;
        void render(const ObjectPass &, const ObjectInstance *) const;
-       void render(const ObjectPass &, const std::list<const ObjectInstance *> &) const;
+
+       template<typename Iter>
+       void render(const ObjectPass &pass, Iter begin, Iter end) const
+       {
+               setup_render(pass);
+               for(Iter i=begin; i!=end; ++i)
+                       render_instance(pass, **i);
+               finish_render(pass);
+       }
+
+       void render_instance(const ObjectPass &, const ObjectInstance &) const;
 };
 
 } // namespace GL
index aeee1666dc34f54ba441da0793607d786ea1cb28..e96ac77a853a96b9de09a30baa41096f70f3eef8 100644 (file)
@@ -17,9 +17,7 @@ namespace GL {
 class Renderable
 {
 public:
-       virtual int get_order() const { return 0; }
        virtual bool has_pass(const Tag &tag) const =0;
-
        virtual void render(const Tag &tag=Tag()) const =0;
 };
 
index 607166d5d32f285e35879ff62134891a9c8e5a42..59f3041187d29a13b40315a4f3a0eaf70e3fc5f9 100644 (file)
@@ -5,6 +5,8 @@ Copyright © 2007  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
+#include "object.h"
+#include "objectinstance.h"
 #include "scene.h"
 
 using namespace std;
@@ -14,28 +16,38 @@ namespace GL {
 
 void Scene::add(const Renderable &r)
 {
-       renderables.insert(&r);
+       if(const ObjectInstance *oi=dynamic_cast<const ObjectInstance *>(&r))
+               objects[&oi->get_object()].insert(oi);
+       else
+               renderables.insert(&r);
 }
 
 void Scene::remove(const Renderable &r)
 {
-       renderables.erase(&r);
+       if(const ObjectInstance *oi=dynamic_cast<const ObjectInstance *>(&r))
+       {
+               map<const Object *, set<const ObjectInstance *> >::iterator i=objects.find(&oi->get_object());
+               if(i!=objects.end())
+               {
+                       i->second.erase(oi);
+                       if(i->second.empty())
+                               objects.erase(i);
+               }
+       }
+       else
+               renderables.erase(&r);
 }
 
 void Scene::render(const Tag &tag) const
 {
-       for(set<const Renderable *, Compare>::const_iterator i=renderables.begin(); i!=renderables.end(); ++i)
+       for(map<const Object *, set<const ObjectInstance *> >::const_iterator i=objects.begin(); i!=objects.end(); ++i)
+               if(i->first->has_pass(tag))
+                       i->first->render(i->second.begin(), i->second.end(), tag);
+
+       for(set<const Renderable *>::const_iterator i=renderables.begin(); i!=renderables.end(); ++i)
                if((*i)->has_pass(tag))
                        (*i)->render(tag);
 }
 
-
-bool Scene::Compare::operator()(const Renderable *a, const Renderable *b) const
-{
-       if(a->get_order()!=b->get_order())
-               return a->get_order()<b->get_order();
-       return a<b;
-}
-
 } // namespace GL
 } // namespace Msp
index 9766ab21a0292a4a217e76c086fcefae4d77a4a8..e6de1c23e6becb3a94103a06e7d905832173534e 100644 (file)
@@ -8,21 +8,21 @@ Distributed under the LGPL
 #ifndef MSP_GL_SCENE_H_
 #define MSP_GL_SCENE_H_
 
+#include <map>
 #include <set>
 #include "renderable.h"
 
 namespace Msp {
 namespace GL {
 
+class Object;
+class ObjectInstance;
+
 class Scene: public Renderable
 {
 private:
-       struct Compare
-       {
-               bool operator()(const Renderable *, const Renderable *) const;
-       };
-
-       std::set<const Renderable *, Compare> renderables;
+       std::map<const Object *, std::set<const ObjectInstance *> > objects;
+       std::set<const Renderable *> renderables;
 
 public:
        void add(const Renderable &);