#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) { /* TODO: parse file somehow */ // refptr node = parse(filename); // processNode(node); refptr m = new Material(); m->setDiffuseColor(Color::white); m->setAmbientColor(Color::white); refptr shape = new Plane(0, 0, 1, 2); shape->setTransform(m_transform); shape->setMaterial(m); m_shapes.push_back(shape); m_transform.translate(1.0, 5.0, 0.5); m = new Material(); m->setDiffuseColor(Color::red); m->setAmbientColor(Color::red); shape = new Sphere(1.0); shape->setTransform(m_transform); shape->setMaterial(m); m_shapes.push_back(shape); m_transform.translate(-1.0, -5.0, -0.5); m_transform.translate(-1, 3, -0.5); refptr shape1 = new Sphere(0.8); shape1->setMaterial(m); shape1->setTransform(m_transform); refptr shape2 = new Box(new Vector(2, 2, 0.6)); m = new Material(); m->setDiffuseColor(Color::magenta); m->setAmbientColor(Color::magenta); shape2->setMaterial(m); m_transform.rotate(20, 0, 1, 0); shape2->setTransform(m_transform); shape = new Intersect(shape1, shape2); m_shapes.push_back(shape); m_transform.rotate(-20, 0, 1, 0); m_transform.translate(1, -3, 0.5); m_transform.translate(1.5, 3.2, -0.7); m_transform.rotate(15, 0, 0, 1); m = new Material(); m->setDiffuseColor(Color::magenta); m->setAmbientColor(Color::magenta); shape1 = new Box(new Vector(1, 1, 1)); shape1->setMaterial(m); shape1->setTransform(m_transform); m = new Material(); m->setDiffuseColor(Color::yellow); m->setAmbientColor(Color::yellow); shape2 = new Sphere(0.6); m_transform.translate(-0.5, -0.5, 0.5); shape2->setTransform(m_transform); shape2->setMaterial(m); shape = new Subtract(shape1, shape2); m_shapes.push_back(shape); m_transform.rotate(-15, 0, 0, 1); m_transform.translate(-1.0, -2.7, 0.2); m_transform.translate(1, 5, -1.5); m = new Material(); m->setDiffuseColor(Color::blue); m->setAmbientColor(Color::blue); shape = new Box(new Vector(1.8, 1.8, 0.5)); shape->setTransform(m_transform); shape->setMaterial(m); m_shapes.push_back(shape); m_transform.translate(-1, -5, 1.5); m_transform.translate(-0.5, 6.5, 1.5); m_transform.rotate(45, 1, 0, 0); m = new Material(); m->setDiffuseColor(Color::cyan); m->setAmbientColor(Color::cyan); shape = new Cyl(1.0, 0.0, 2.0); shape->setTransform(m_transform); shape->setMaterial(m); m_shapes.push_back(shape); m_transform.rotate(-45, 1, 0, 0); m_transform.translate(0.5, -6.5, -1.5); m_transform.translate(-2.0, 5.0, 1.5); m_transform.rotate(45, 0, 0, 1); m_transform.rotate(45, 1, 0, 0); m = new Material(); m->setDiffuseColor(Color::yellow); m->setAmbientColor(Color::yellow); shape = new Box(new Vector(1, 1, 1)); shape->setTransform(m_transform); shape->setMaterial(m); m_shapes.push_back(shape); m_transform.rotate(-45, 1, 0, 0); m_transform.rotate(-45, 0, 0, 1); m_transform.translate(2.0, -5.0, -1.5); 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); }