X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Frender%2Fscene.h;fp=source%2Frender%2Fscene.h;h=305bf62aefd5a2ed3fb4748bf9258772643eb52b;hb=83ab54cf1339fcac560daa90496e6d4e956f7367;hp=639a467fa849cb526c19ac31744b957f820af7ea;hpb=05b77ce8469134f6dd6fad497f3ab21cdd4129b1;p=libs%2Fgl.git diff --git a/source/render/scene.h b/source/render/scene.h index 639a467f..305bf62a 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: @@ -36,6 +37,38 @@ public: void object_tagged(const std::string &, 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 +88,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