textures, lightmaps, hardcoded texture hack for testing
[laserbrain_demo] / src / scene.cc
1 #include "scene.h"
2
3 static void destroy_node_tree(SceneNode *n);
4
5 Scene::Scene(TextureSet *tset)
6 {
7         nodes = 0;
8
9         if(tset) {
10                 texset = tset;
11                 own_texset = false;
12         } else {
13                 texset = new TextureSet;
14                 own_texset = true;
15         }
16 }
17
18 Scene::~Scene()
19 {
20         destroy();
21 }
22
23 void Scene::destroy()
24 {
25         destroy_node_tree(nodes);
26         nodes = 0;
27
28         if(own_texset) {
29                 delete texset;
30         }
31         texset = 0;
32 }
33
34 // Scene::load defined in sceneload.cc
35
36 void Scene::update(float dt)
37 {
38         if(nodes) {
39                 nodes->update(dt);
40         }
41
42         int nobj = objects.size();
43         for(int i=0; i<nobj; i++) {
44                 if(!objects[i]->node) {
45                         // only update objects which don't belong to a scenegraph node
46                         // to avoid updating objects twice
47                         objects[i]->update(dt);
48                 }
49         }
50 }
51
52 void Scene::draw() const
53 {
54         if(!objects.empty()) {
55                 int nobj = objects.size();
56                 for(int i=0; i<nobj; i++) {
57                         objects[i]->draw();
58                 }
59         } else {
60                 int nmesh = meshes.size();
61                 for(int i=0; i<nmesh; i++) {
62                         meshes[i]->draw();
63                 }
64         }
65 }
66
67 static void destroy_node_tree(SceneNode *n)
68 {
69         if(!n) return;
70
71         int nsub = n->get_num_children();
72         for(int i=0; i<nsub; i++) {
73                 destroy_node_tree(n->get_child(i));
74         }
75         delete n;
76 }