assimp
[laserbrain_demo] / src / scene.cc
diff --git a/src/scene.cc b/src/scene.cc
new file mode 100644 (file)
index 0000000..27be807
--- /dev/null
@@ -0,0 +1,63 @@
+#include "scene.h"
+
+static void destroy_node_tree(SceneNode *n);
+
+Scene::Scene()
+{
+       nodes = 0;
+}
+
+Scene::~Scene()
+{
+       destroy();
+}
+
+void Scene::destroy()
+{
+       destroy_node_tree(nodes);
+       nodes = 0;
+}
+
+// Scene::load defined in sceneload.cc
+
+void Scene::update(float dt)
+{
+       if(nodes) {
+               nodes->update(dt);
+       }
+
+       int nobj = objects.size();
+       for(int i=0; i<nobj; i++) {
+               if(!objects[i]->node) {
+                       // only update objects which don't belong to a scenegraph node
+                       // to avoid updating objects twice
+                       objects[i]->update(dt);
+               }
+       }
+}
+
+void Scene::draw() const
+{
+       if(!objects.empty()) {
+               int nobj = objects.size();
+               for(int i=0; i<nobj; i++) {
+                       objects[i]->draw();
+               }
+       } else {
+               int nmesh = meshes.size();
+               for(int i=0; i<nmesh; i++) {
+                       meshes[i]->draw();
+               }
+       }
+}
+
+static void destroy_node_tree(SceneNode *n)
+{
+       if(!n) return;
+
+       int nsub = n->get_num_children();
+       for(int i=0; i<nsub; i++) {
+               destroy_node_tree(n->get_child(i));
+       }
+       delete n;
+}