diff --git a/main/Scene-load.cc b/main/Scene-load.cc new file mode 100644 index 0000000..be07aa8 --- /dev/null +++ b/main/Scene-load.cc @@ -0,0 +1,102 @@ + +#include +#include "Scene.h" +#include "Light.h" +#include "PointLight.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]); + } +} + diff --git a/main/Scene.cc b/main/Scene.cc index c9feb4b..10059b2 100644 --- a/main/Scene.cc +++ b/main/Scene.cc @@ -78,98 +78,6 @@ Scene::~Scene() delete m_data; } -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]); - } -} - -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::render() { if (m_verbose) diff --git a/main/Scene.h b/main/Scene.h index a39025c..6739a50 100644 --- a/main/Scene.h +++ b/main/Scene.h @@ -44,10 +44,12 @@ class Scene protected: /* private methods */ - void load(const char * filename); void renderPixel(int x, int y, unsigned char * pixel); Color traceRay(const Ray & ray); std::vector getRayHits(const Ray & ray); + + /* In Scene-load.cc */ + void load(const char * filename); void processNode(refptr node); void processChildren(refptr node);