#include #include #include "Scene.h" #include "Light.h" #include "parser/parser.h" #include "parser/nodes.h" using namespace std; void Scene::load(const char * filename) { refptr node = parse(filename); processNode(node); /* TODO: parse file somehow */ refptr plane = new Plane(0, 0, 1, -2); m_shapes.push_back(plane); refptr m = new Material(); m->setDiffuseColor(Color::red); m->setAmbientColor(Color::red); refptr shape = new Sphere(1.0); m_transform.translate(1.0, 5.0, 0.5); shape->setTransform(m_transform); shape->setMaterial(m); m_shapes.push_back(shape); m = new Material(); m->setDiffuseColor(Color::blue); m->setAmbientColor(Color::blue); shape = new Box(new Vector(1.8, 1.8, 0.5)); m_transform.translate(0, 0, -2.0); shape->setTransform(m_transform); shape->setMaterial(m); m_shapes.push_back(shape); m = new Material(); m->setDiffuseColor(Color::cyan); m->setAmbientColor(Color::cyan); shape = new Cyl(1.0, 0.0, 2.0); m_transform.translate(-1.3, 2.5, 3.5); m_transform.rotate(45, 1, 0, 0); shape->setTransform(m_transform); shape->setMaterial(m); m_shapes.push_back(shape); m = new Material(); m->setDiffuseColor(Color::yellow); m->setAmbientColor(Color::yellow); shape = new Box(new Vector(1, 1, 1)); m_transform.rotate(-45, 1, 0, 0); m_transform.translate(-1.7, -0.5, -2.0); m_transform.rotate(45, 0, 0, 1); m_transform.rotate(45, 1, 0, 0); shape->setTransform(m_transform); shape->setMaterial(m); m_shapes.push_back(shape); refptr light = new PointLight(); light->setPosition(Vector(2, -1, 2)); m_lights.push_back(light); } void Scene::processNode(refptr node) { if (node.isNull()) return; if ( typeid(*node) == typeid(SceneNode) ) { processChildren(node); } else if ( typeid(*node) == typeid(BoxNode) ) { cout << "saw a box" << endl; } else if ( typeid(*node) == typeid(PlaneNode) ) { cout << "saw a plane" << endl; } else if ( typeid(*node) == typeid(SphereNode) ) { cout << "saw a sphere" << endl; } } void Scene::processChildren(refptr node) { std::vector< refptr > & children = node->getChildren(); for (int i = 0, sz = children.size(); i < sz; i++) { processNode(children[i]); } } refptr processMaterial(refptr node) { if (typeid(*node) != typeid(MaterialNode)) return refptr(NULL); refptr material = new Material(); /* TODO: finish */ return material; } refptr processBox(refptr node) { /* TODO: finish */ return refptr(NULL); } refptr processCyl(refptr node) { /* TODO: finish */ return refptr(NULL); } refptr processLight(refptr node) { /* TODO: finish */ return refptr(NULL); } refptr processPlane(refptr node) { /* TODO: finish */ return refptr(NULL); } refptr processSphere(refptr node) { /* TODO: finish */ return refptr(NULL); }