#define MSP_GL_SCENE_H_
#include <vector>
+#include <msp/core/typeregistry.h>
#include <msp/datafile/objectloader.h>
#include "matrix.h"
#include "renderable.h"
*/
class Scene: public Renderable
{
-public:
+protected:
class Loader: public DataFile::CollectionObjectLoader<Scene>
{
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;
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