prepare_data now only processes files based on modification time
[laserbrain_demo] / src / scene.h
1 #ifndef SCENE_H_
2 #define SCENE_H_
3
4 #include <vector>
5 #include <list>
6 #include "mesh.h"
7 #include "snode.h"
8 #include "texture.h"
9 #include "dataset.h"
10 #include "datamap.h"
11
12 enum {
13         SCNLOAD_FLIPYZ = 1,
14         SCNLOAD_FLIPTEX = 2,
15
16         SCNLOAD_STAGE_IO = 0x4000,
17         SCNLOAD_STAGE_GL = 0x8000
18 };
19
20 class MetaScene;
21
22 class Scene {
23 public:
24         MetaScene *metascn;
25         DataMap datamap;
26
27         // meshes objects and nodes are owned by Scene
28         std::vector<Mesh*> meshes;
29         std::vector<Object*> objects;
30         SceneNode *nodes;
31
32         Mesh *walk_mesh;
33
34         TextureSet *texset;
35         void *loader_data;
36
37         explicit Scene();
38         ~Scene();
39
40         Scene(const Scene &rhs) = delete;
41         Scene &operator =(const Scene &rhs) = delete;
42
43         void destroy();
44         void clear();   // clear all contents (meshes, objects, and nodes)
45
46         bool load(const char *fname, unsigned int flags = 0);
47
48         // merge scn into this scene, leaving scn empty and safe to destroy
49         bool merge(Scene *scn);
50
51         void add_object(Object *obj);
52         bool remove_object(Object *obj);
53         bool have_object(Object *obj) const;
54
55         void add_mesh(Mesh *m);
56         bool remove_mesh(Mesh *m);
57         bool have_mesh(Mesh *m) const;
58
59         void add_node(SceneNode *n);
60         bool remove_node(SceneNode *n);
61         bool have_node(SceneNode *n) const;
62
63         // find node by name
64         SceneNode *find_node(const char *name) const;
65         // match nodes with regexp and return the first that matches
66         SceneNode *match_node(const char *qstr) const;
67         // match nodes with regexp and return a list of matches
68         std::list<SceneNode*> match_nodes(const char *qstr) const;
69
70         /* find and remove all nodes whose names match the regexp
71          * XXX at the moment this has the effect of flattening the hierarchy in the
72          * result scene. If we ever need verbatim extraction of whole subtrees we'll
73          * need to change the algorithm.
74          */
75         Scene *extract_nodes(const char *qstr);
76
77         /* bake all node transformations to their respective meshes and make the
78          * node transformations identity.
79          * XXX this assumes no mesh is shared by two nodes.
80          */
81         void apply_xform();
82
83         void update(float dt);
84         void draw() const;
85 };
86
87 class SceneSet : public DataSet<Scene*> {
88 private:
89         static Scene *create_scene();
90         static bool load_scene(Scene *scn, const char *fname);
91         static bool done_scene(Scene *scn);
92         static void free_scene(Scene *scn);
93
94 public:
95         SceneSet();
96 };
97
98 #endif  // SCENE_H_