initial commit
[ld37_one_room] / 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;     // only owned by Scene if own_texset is true
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
45         bool load(const char *fname, unsigned int flags = 0);
46
47         // merge scn into this scene, leaving scn empty and safe to destroy
48         bool merge(Scene *scn);
49
50         void add_object(Object *obj);
51         bool remove_object(Object *obj);
52         bool have_object(Object *obj) const;
53
54         void add_mesh(Mesh *m);
55         bool remove_mesh(Mesh *m);
56         bool have_mesh(Mesh *m) const;
57
58         void add_node(SceneNode *n);
59         bool remove_node(SceneNode *n);
60         bool have_node(SceneNode *n) const;
61
62         /* find and remove all nodes whose names match the regexp
63          * XXX at the moment this has the effect of flattening the hierarchy in the
64          * result scene. If we ever need verbatim extraction of whole subtrees we'll
65          * need to change the algorithm.
66          */
67         Scene *extract_nodes(const char *qstr);
68
69         /* bake all node transformations to their respective meshes and make the
70          * node transformations identity.
71          * XXX this assumes no mesh is shared by two nodes.
72          */
73         void apply_xform();
74
75         void update(float dt);
76         void draw() const;
77 };
78
79 class SceneSet : public DataSet<Scene*> {
80 private:
81         static Scene *create_scene();
82         static bool load_scene(Scene *scn, const char *fname);
83         static bool done_scene(Scene *scn);
84         static void free_scene(Scene *scn);
85
86 public:
87         SceneSet();
88 };
89
90 #endif  // SCENE_H_