-/* $Id$
-
-This file is part of libmspgl
-Copyright © 2007 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
#ifndef MSP_GL_SCENE_H_
#define MSP_GL_SCENE_H_
-#include <map>
-#include <set>
+#include <list>
+#include <msp/datafile/objectloader.h>
#include "renderable.h"
namespace Msp {
namespace GL {
-class Object;
-class ObjectInstance;
+class Culler;
+/**
+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.
+*/
class Scene: public Renderable
{
-private:
- typedef std::set<const ObjectInstance *> InstanceSet;
- typedef std::map<const Object *, InstanceSet> ObjectMap;
- typedef std::set<const Renderable *> RenderableSet;
+public:
+ class Loader: public DataFile::CollectionObjectLoader<Scene>
+ {
+ public:
+ Loader(Scene &, Collection &);
- ObjectMap objects;
- RenderableSet renderables;
+ private:
+ void object(const std::string &);
+ };
+protected:
+ std::list<Renderable *> owned_data;
+ std::list<Culler *> cullers;
+
+ Scene() { }
+private:
+ Scene(const Scene &);
+ Scene &operator=(const Scene &);
public:
- void add(const Renderable &);
- void remove(const Renderable &);
+ virtual ~Scene();
+
+ virtual void add(const Renderable &) = 0;
+ virtual void remove(const Renderable &) = 0;
+
+ void add_culler(Culler &);
+ void remove_culler(Culler &);
+
+ using Renderable::render;
+ virtual void render(const Tag & = Tag()) const;
- virtual void render(const Tag &tag=Tag()) const;
+protected:
+ virtual void setup_cullers(const Renderer &) const;
+ virtual bool cull(const Renderer &, const Renderable &) const;
};
} // namespace GL