--- /dev/null
+#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;
+}