]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/scene.cpp
Add a registry-based generic loader to Scene
[libs/gl.git] / source / render / scene.cpp
index e6c62e802f8c9672fafce477d3eae50c9f2efaac..dd611536bf605ab8b53708e60831ba342560e54b 100644 (file)
@@ -1,8 +1,11 @@
 #include <msp/datafile/collection.h>
 #include "animatedobject.h"
 #include "camera.h"
+#include "orderedscene.h"
 #include "renderer.h"
 #include "scene.h"
+#include "simplescene.h"
+#include "zsortedscene.h"
 
 using namespace std;
 
@@ -73,6 +76,22 @@ bool Scene::frustum_cull(const Renderable &renderable) const
        return false;
 }
 
+Scene::SceneRegistry &Scene::get_scene_registry()
+{
+       static SceneRegistry registry;
+       static bool initialized = false;
+       if(!initialized)
+       {
+               initialized = true;
+               register_type<SimpleScene>("simple");
+               register_type<ZSortedScene>("zsorted");
+               register_type<OrderedScene>("ordered");
+               // TODO OccludedScene requires a collection as a constructor parameter
+               //register_type<OccludedScene>("occluded");
+       }
+       return registry;
+}
+
 
 Scene::Loader::Loader(Scene &s, Collection &c):
        DataFile::CollectionObjectLoader<Scene>(s, &c),
@@ -109,5 +128,32 @@ void Scene::Loader::object_tagged(const string &n, const string &t)
        obj.owned_data.push_back(anob.release());
 }
 
+
+DataFile::Loader::ActionMap Scene::GenericLoader::shared_actions;
+
+Scene::GenericLoader::GenericLoader(DataFile::Collection &c):
+       coll(c),
+       scene(0),
+       scene_loader(0)
+{
+       set_actions(shared_actions);
+}
+
+Scene::GenericLoader::~GenericLoader()
+{
+       delete scene;
+       delete scene_loader;
+}
+
+void Scene::GenericLoader::init_actions()
+{
+       add("type", &GenericLoader::type);
+}
+
+void Scene::GenericLoader::type(const DataFile::Symbol &sym)
+{
+       get_scene_registry().invoke(sym.name, *this);
+}
+
 } // namespace GL
 } // namespace Msp