X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Frender%2Fscene.h;h=d07a81da80b82fef2998eed732c4d3aca8bef8b3;hp=33678b7998900fac18f25cb113f181f5d654e9f3;hb=HEAD;hpb=fea2752a8abb1de5cc89addc92b804d9ff4fc89a diff --git a/source/render/scene.h b/source/render/scene.h index 33678b79..e6115ae5 100644 --- a/source/render/scene.h +++ b/source/render/scene.h @@ -1,20 +1,25 @@ #ifndef MSP_GL_SCENE_H_ #define MSP_GL_SCENE_H_ -#include -#include +#include +#include #include #include "matrix.h" #include "renderable.h" -#include "vector.h" namespace Msp { namespace GL { /** -Scenes are containers for other Renderables. This is a base class that can't -be instantiated. Examples of available Scene types are SimpleScene, -InstancedScene and OrderedScene. +Container for other renderables. Subclasses provide different ways of +rendering the contents. + +All types of Scenes perform frustum culling on the contents, skipping +renderables whose bounding sphere is fully outside the view volume. If a +bounding sphere cannot be determined, culling is not performed on that +renderable. + +SimpleScene is a good default choice if there are no specific requirements. */ class Scene: public Renderable { @@ -27,74 +32,45 @@ protected: private: ContentMap *content; + static unsigned inline_counter; + public: - Loader(Scene &, Collection &); - Loader(Scene &, Collection &, ContentMap &); + Loader(Scene &s, Collection &c): Loader(s, c, 0) { } + Loader(Scene &s, Collection &c, ContentMap &m) : Loader(s, c, &m) { } private: - void init(); + Loader(Scene &, Collection &, ContentMap *); + void array(const std::string &); void object(const std::string &); void object_tagged(const std::string &, const std::string &); void scene(const std::string &); + void scene_inline(); }; public: - class GenericLoader: public DataFile::Loader + class GenericLoader: public DataFile::DynamicObjectLoader { - private: - template - struct CreateScene - { - void operator()(const std::string &, GenericLoader &) const; - }; - - DataFile::Collection &coll; - Scene *scene; - Loader *scene_loader; - - static ActionMap shared_actions; + friend class Scene; public: - GenericLoader(DataFile::Collection &); - ~GenericLoader(); - - Scene *get_scene() { Scene *s = scene; scene = 0; return s; } - private: - virtual void init_actions(); + GenericLoader(DataFile::Collection &c): DynamicObjectLoader(&c) { } - void type(const DataFile::Symbol &); - - friend class Scene; + protected: + virtual const TypeRegistry &get_type_registry() const { return get_scene_registry(); } }; -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; - mutable Matrix culling_matrix; - mutable Vector4 frustum_edges[6]; - - Scene() { } -private: - Scene(const Scene &); - Scene &operator=(const Scene &); + Scene() = default; public: - virtual ~Scene(); + virtual ~Scene() = default; virtual void add(Renderable &) = 0; virtual void remove(Renderable &) = 0; -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(); + static GenericLoader::TypeRegistry &get_scene_registry(); }; template @@ -103,18 +79,6 @@ 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