added delayed init call after scenegraph/meshes are done loading
[laserbrain_demo] / src / scene.h
index 066d9dc..65e1a55 100644 (file)
@@ -2,20 +2,41 @@
 #define SCENE_H_
 
 #include <vector>
+#include <list>
+#include <string>
 #include "mesh.h"
 #include "snode.h"
+#include "texture.h"
+#include "dataset.h"
+#include "datamap.h"
 
 enum {
        SCNLOAD_FLIPYZ = 1,
-       SCNLOAD_FLIPTEX = 2
+       SCNLOAD_FLIPTEX = 2,
+
+       SCNLOAD_STAGE_IO = 0x4000,
+       SCNLOAD_STAGE_GL = 0x8000
 };
 
+class MetaScene;
+
 class Scene {
 public:
+       std::string name;
+
+       MetaScene *metascn;
+       DataMap datamap;
+
+       // meshes objects and nodes are owned by Scene
        std::vector<Mesh*> meshes;
        std::vector<Object*> objects;
        SceneNode *nodes;
 
+       Mesh *walk_mesh;
+
+       TextureSet *texset;
+       void *loader_data;
+
        Scene();
        ~Scene();
 
@@ -23,11 +44,59 @@ public:
        Scene &operator =(const Scene &rhs) = delete;
 
        void destroy();
+       void clear();   // clear all contents (meshes, objects, and nodes)
 
        bool load(const char *fname, unsigned int flags = 0);
 
+       // merge scn into this scene, leaving scn empty and safe to destroy
+       bool merge(Scene *scn);
+
+       void add_object(Object *obj);
+       bool remove_object(Object *obj);
+       bool have_object(Object *obj) const;
+
+       void add_mesh(Mesh *m);
+       bool remove_mesh(Mesh *m);
+       bool have_mesh(Mesh *m) const;
+
+       void add_node(SceneNode *n);
+       bool remove_node(SceneNode *n);
+       bool have_node(SceneNode *n) const;
+
+       // find node by name
+       SceneNode *find_node(const char *name) const;
+       // match nodes with regexp and return the first that matches
+       SceneNode *match_node(const char *qstr) const;
+       // match nodes with regexp and return a list of matches
+       std::list<SceneNode*> match_nodes(const char *qstr) const;
+
+       /* find and remove all nodes whose names match the regexp
+        * XXX at the moment this has the effect of flattening the hierarchy in the
+        * result scene. If we ever need verbatim extraction of whole subtrees we'll
+        * need to change the algorithm.
+        */
+       Scene *extract_nodes(const char *qstr);
+
+       /* bake all node transformations to their respective meshes and make the
+        * node transformations identity.
+        * XXX this assumes no mesh is shared by two nodes.
+        */
+       void apply_xform();
+
        void update(float dt);
        void draw() const;
 };
 
+//! Resource manager for Scenes
+class SceneSet : public DataSet<Scene*> {
+private:
+       static Scene *create_scene();
+       static bool load_scene(Scene *scn, const char *fname);
+       static bool done_scene(Scene *scn);
+       static void free_scene(Scene *scn);
+
+public:
+       SceneSet();
+};
+
 #endif // SCENE_H_