#ifndef METASCENE_H_
#define METASCENE_H_
-class Scene;
+#include <vector>
+#include <map>
+#include "scene.h"
+#include "mesh.h"
+#include "geom.h"
+#include "audio/ovstream.h"
+#include "datamap.h"
-bool load_scene(Scene *scn, const char *fname);
+
+struct FlatMirror {
+ Plane plane; // plane in local coordinates (original)
+ Plane wplane; // world coords plane (derived, identical to plane if node == 0)
+ float reflect;
+ std::vector<Object*> objects;
+ SceneNode *node;
+
+ FlatMirror *next;
+};
+
+
+class MetaScene {
+public:
+ DataMap datamap;
+
+ std::vector<Scene*> scenes;
+
+ Mesh *walk_mesh;
+ Vec3 start_pos;
+ Quat start_rot;
+
+ std::map<Scene*, void*> scndata;
+
+ FlatMirror *mirrors;
+ std::map<Object*, FlatMirror*> objmirror;
+
+ AudioStream *music;
+
+ MetaScene();
+ ~MetaScene();
+
+ bool load(const char *fname);
+ bool scene_loaded(Scene *scn);
+
+ void update(float dt);
+ void draw() const;
+
+ /* helper functions which end up calling the corresponding Scene functions
+ * for every scene
+ */
+ SceneNode *find_node(const char *name) const;
+ SceneNode *match_node(const char *qstr) const;
+ std::list<SceneNode*> match_nodes(const char *qstr) const;
+
+ Scene *extract_nodes(const char *qstr);
+
+ int calc_mirror_planes();
+};
#endif // METASCENE_H_