diff --git a/.todo b/.todo index fe96460..78cfcaa 100644 --- a/.todo +++ b/.todo @@ -1,5 +1,4 @@ FART To-Do List =============== -- Scan for cameras before scene items - Test subtractions of subtractions - Add built-in timing around Scene::render() diff --git a/main/Scene-load.cc b/main/Scene-load.cc index 2beec47..93b488e 100644 --- a/main/Scene-load.cc +++ b/main/Scene-load.cc @@ -23,7 +23,7 @@ void Scene::processNode(refptr node) if ( typeid(*node) == typeid(SceneNode) ) { - processChildren(node); + processScene(node); } else if ( node->isShape() ) { @@ -37,10 +37,6 @@ void Scene::processNode(refptr node) if ( ! light.isNull() ) m_lights.push_back(light); } - else if ( typeid(*node) == typeid(CameraNode) ) - { - processCamera(node); - } else if ( typeid(*node) == typeid(OptionsNode) ) { processOptions(node); @@ -68,6 +64,47 @@ void Scene::processNode(refptr node) } } +void Scene::processChildren(refptr node) +{ + std::vector< refptr > & children = node->getChildren(); + for (int i = 0, sz = children.size(); i < sz; i++) + { + processNode(children[i]); + } +} + +void Scene::processScene(refptr node) +{ + /* first process any cameras present */ + int cameras_found = 0; + for (Node_Iterator it = node->getChildren().begin(); + it != node->getChildren().end(); + it++) + { + if ( typeid(**it) == typeid(CameraNode) ) + { + cameras_found++; + if (cameras_found == 1) + processCamera(*it); + else + { + cerr << "Error: multiple camera definitions found!" << endl; + exit(5); + } + } + } + + for (Node_Iterator it = node->getChildren().begin(); + it != node->getChildren().end(); + it++) + { + if ( typeid(**it) != typeid(CameraNode) ) + { + processNode(*it); + } + } +} + refptr Scene::processShape(refptr node) { if ( typeid(*node) == typeid(BoxNode) ) @@ -102,15 +139,6 @@ refptr Scene::processShape(refptr node) return refptr(NULL); } -void Scene::processChildren(refptr node) -{ - std::vector< refptr > & children = node->getChildren(); - for (int i = 0, sz = children.size(); i < sz; i++) - { - processNode(children[i]); - } -} - void Scene::processCamera(refptr node) { Vector position(0, 0, 0); diff --git a/main/Scene.h b/main/Scene.h index 62b927e..acbd7d1 100644 --- a/main/Scene.h +++ b/main/Scene.h @@ -63,6 +63,7 @@ class Scene void load(const char * filename); void processNode(refptr node); void processChildren(refptr node); + void processScene(refptr node); refptr processMaterial(refptr node); refptr processBox(refptr node); refptr processCyl(refptr node);