]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/scene.h
Add inline data items to the collection
[libs/gl.git] / source / render / scene.h
index 639a467fa849cb526c19ac31744b957f820af7ea..fcf5d33e8eb9645caccdbc9bff5f7d34a3427f27 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_GL_SCENE_H_
 
 #include <vector>
+#include <msp/core/typeregistry.h>
 #include <msp/datafile/objectloader.h>
 #include "matrix.h"
 #include "renderable.h"
@@ -17,7 +18,7 @@ InstancedScene and OrderedScene.
 */
 class Scene: public Renderable
 {
-public:
+protected:
        class Loader: public DataFile::CollectionObjectLoader<Scene>
        {
        public:
@@ -25,6 +26,7 @@ public:
 
        private:
                ContentMap *content;
+               unsigned inst_counter;
 
        public:
                Loader(Scene &, Collection &);
@@ -34,11 +36,42 @@ public:
 
                void object(const std::string &);
                void object_tagged(const std::string &, const std::string &);
+               void scene(const std::string &);
        };
 
+public:
+       class GenericLoader: public DataFile::Loader
+       {
+       private:
+               template<typename T>
+               struct CreateScene
+               {
+                       void operator()(const std::string &, GenericLoader &) const;
+               };
+
+               DataFile::Collection &coll;
+               Scene *scene;
+               Loader *scene_loader;
+
+               static ActionMap shared_actions;
+
+       public:
+               GenericLoader(DataFile::Collection &);
+               ~GenericLoader();
+
+               Scene *get_scene() { Scene *s = scene; scene = 0; return s; }
+       private:
+               virtual void init_actions();
+
+               void type(const DataFile::Symbol &);
+
+               friend class Scene;
+       };
+
+private:
+       typedef TypeRegistry<GenericLoader::CreateScene, GenericLoader &> SceneRegistry;
+
 protected:
-       // XXX If a loaded renderable is removed from the scene it needs to be removed from here as well
-       std::vector<Renderable *> owned_data;
        mutable Matrix culling_matrix;
        mutable Vector4 frustum_edges[6];
 
@@ -47,7 +80,7 @@ private:
        Scene(const Scene &);
        Scene &operator=(const Scene &);
 public:
-       virtual ~Scene();
+       virtual ~Scene() { }
 
        virtual void add(Renderable &) = 0;
        virtual void remove(Renderable &) = 0;
@@ -55,8 +88,32 @@ public:
 protected:
        bool setup_frustum(const Renderer &) const;
        bool frustum_cull(const Renderable &) const;
+
+public:
+       template<typename T>
+       static void register_type(const std::string &);
+private:
+       static SceneRegistry &get_scene_registry();
 };
 
+template<typename T>
+void Scene::register_type(const std::string &kw)
+{
+       get_scene_registry().register_type<T>(kw);
+}
+
+template<typename T>
+void Scene::GenericLoader::CreateScene<T>::operator()(const std::string &, GenericLoader &ldr) const
+{
+       if(ldr.scene)
+               throw std::logic_error("Scene type was already specified");
+
+       T *scene = new T;
+       ldr.scene = scene;
+       ldr.scene_loader = new typename T::Loader(*scene, ldr.coll);
+       ldr.add_auxiliary_loader(*ldr.scene_loader);
+}
+
 } // namespace GL
 } // namespace Msp