X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Frender%2Fscene.h;h=33678b7998900fac18f25cb113f181f5d654e9f3;hb=fea2752a8abb1de5cc89addc92b804d9ff4fc89a;hp=639a467fa849cb526c19ac31744b957f820af7ea;hpb=7aaec9a70b8d7733429bec043f8e33e02956f266;p=libs%2Fgl.git diff --git a/source/render/scene.h b/source/render/scene.h index 639a467f..33678b79 100644 --- a/source/render/scene.h +++ b/source/render/scene.h @@ -2,6 +2,7 @@ #define MSP_GL_SCENE_H_ #include +#include #include #include "matrix.h" #include "renderable.h" @@ -17,7 +18,7 @@ InstancedScene and OrderedScene. */ class Scene: public Renderable { -public: +protected: class Loader: public DataFile::CollectionObjectLoader { public: @@ -34,8 +35,41 @@ 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 + 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 SceneRegistry; + protected: // XXX If a loaded renderable is removed from the scene it needs to be removed from here as well std::vector owned_data; @@ -55,8 +89,32 @@ public: protected: bool setup_frustum(const Renderer &) const; bool frustum_cull(const Renderable &) const; + +public: + template + static void register_type(const std::string &); +private: + static SceneRegistry &get_scene_registry(); }; +template +void Scene::register_type(const std::string &kw) +{ + get_scene_registry().register_type(kw); +} + +template +void Scene::GenericLoader::CreateScene::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