diff --git a/main/Scene-load.cc b/main/Scene-load.cc index 050e649..4327eff 100644 --- a/main/Scene-load.cc +++ b/main/Scene-load.cc @@ -10,25 +10,26 @@ 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 node = parse(filename); +// processNode(node); + + refptr shape = new Plane(0, 0, 1, 2); + shape->setTransform(m_transform); + m_shapes.push_back(shape); + + m_transform.translate(1.0, 5.0, 0.5); 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 = 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(-2, -2, -1); + m_transform.translate(-1, 3, -0.5); refptr shape1 = new Sphere(0.8); shape1->setMaterial(m); shape1->setTransform(m_transform); @@ -41,66 +42,64 @@ void Scene::load(const char * filename) shape2->setTransform(m_transform); shape = new Intersect(shape1, shape2); m_shapes.push_back(shape); - m_transform.rotate(-20, 0, 1, 0); - m_transform.translate(2, 2, 1); + 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); - - m_transform.translate(2.5, 1, -1.5); 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(-2.0, 0.5, 1.0); - + 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)); - m_transform.translate(0, 0, -2.0); shape->setTransform(m_transform); shape->setMaterial(m); m_shapes.push_back(shape); + m_transform.translate(-1, -5, 1.5); + m_transform.translate(0.2, 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); - 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_transform.rotate(-45, 1, 0, 0); + m_transform.translate(-0.2, -6.5, -1.5); + m_transform.translate(-1.5, 5.0, 2.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)); - 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); + m_transform.rotate(-45, 1, 0, 0); + m_transform.rotate(-45, 0, 0, 1); + m_transform.translate(1.5, -5.0, -2.5); refptr light = new PointLight(); light->setPosition(Vector(2, -1, 2)); diff --git a/main/Scene.cc b/main/Scene.cc index 3a5c215..929bacb 100644 --- a/main/Scene.cc +++ b/main/Scene.cc @@ -147,17 +147,20 @@ Color Scene::traceRayDepth(const Ray & ray, int depth) ShapeDistance hit = getRayClosestHit(ray); - /* compute the Phong lighting for each hit */ - refptr material = hit.shape->getMaterial(); + if ( ! hit.shape.isNull() ) + { + /* compute the Phong lighting for each hit */ + refptr material = hit.shape->getMaterial(); - Vector surfacePoint = ray[hit.dist]; + Vector surfacePoint = ray[hit.dist]; - color += Lighting::computePhong(material, - m_lights, - ray, - surfacePoint, - hit.shape->getNormalAt(surfacePoint), - m_ambient_light); + color += Lighting::computePhong(material, + m_lights, + ray, + surfacePoint, + hit.shape->getNormalAt(surfacePoint), + m_ambient_light); + } return color; } diff --git a/shapes/Plane.cc b/shapes/Plane.cc index ff18e91..aa6c7b1 100644 --- a/shapes/Plane.cc +++ b/shapes/Plane.cc @@ -38,8 +38,11 @@ Shape::IntersectionList Plane::intersect(refptr _this, const Ray & ray) Solver::Result solutions = solver.solve(); if (solutions.numResults > 0) { - Vector isect_point = ray_inv[solutions.results[0]]; - res.add(Intersection(_this, m_transform.transform_point(isect_point))); + if (solutions.results[0] > 0.0) + { + Vector isect_point = ray_inv[solutions.results[0]]; + res.add(Intersection(_this, m_transform.transform_point(isect_point))); + } } return res; } diff --git a/util/Solver.cc b/util/Solver.cc index 3a48bc8..0e38237 100644 --- a/util/Solver.cc +++ b/util/Solver.cc @@ -16,6 +16,11 @@ Solver::~Solver() { } +Solver::Result::Result() +{ + numResults = 0; +} + /************************************************************************** * LinearSolver methods * @@ -120,7 +125,3 @@ Solver::Result QuarticSolver::solve() return res; } -Solver::Result::Result() -{ - numResults = 0; -}