diff --git a/main/Scene.cc b/main/Scene.cc index 7df0b48..ff7d9b4 100644 --- a/main/Scene.cc +++ b/main/Scene.cc @@ -4,6 +4,8 @@ #include #include #include "BMP.h" +#include "shapes/Shape.h" +#include "shapes/Sphere.h" using namespace std; Scene::Scene(map options, @@ -50,10 +52,18 @@ Scene::~Scene() { if (m_data != NULL) delete m_data; + for (vector::iterator it = m_shapes.begin(); + it != m_shapes.end(); + it++) + { + delete (*it); + } } void Scene::load(const char * filename) { + /* TODO: parse file somehow */ + m_shapes.push_back(new Sphere(2.0)); } void Scene::render() diff --git a/main/Scene.h b/main/Scene.h index 589cae3..685f628 100755 --- a/main/Scene.h +++ b/main/Scene.h @@ -4,6 +4,8 @@ #include #include +#include +#include "shapes/Shape.h" class Scene { @@ -23,6 +25,7 @@ class Scene std::string m_output_file_name; bool m_verbose; unsigned char * m_data; + std::vector m_shapes; }; #endif diff --git a/shapes/Sphere.cc b/shapes/Sphere.cc index 810aee1..1569792 100644 --- a/shapes/Sphere.cc +++ b/shapes/Sphere.cc @@ -18,5 +18,15 @@ Solver::Result Sphere::intersect(const Ray & ray) + ray.getOrigin()[1] * ray.getOrigin()[1] + ray.getOrigin()[2] * ray.getOrigin()[2] ); Solver::Result quadSolutions = solver.solve(); + int resIdx = 0; + for (int i = 0; i < quadSolutions.numResults; i++) + { + if (quadSolutions.results[i] >= 0.0) + { + res.results[resIdx] = quadSolutions.results[i]; + resIdx++; + res.numResults = resIdx; + } + } return res; } diff --git a/util/Ray.h b/util/Ray.h index 39fa6de..b7221b6 100644 --- a/util/Ray.h +++ b/util/Ray.h @@ -12,6 +12,7 @@ class Ray const Vector & getOrigin() const { return m_origin; } const Vector & getDirection() const { return m_direction; } Vector getPositionAt(double dist) const; + Vector operator[](double dist) const { return getPositionAt(dist); } private: Vector m_origin; diff --git a/util/Solver.cc b/util/Solver.cc index decf408..f1c6151 100644 --- a/util/Solver.cc +++ b/util/Solver.cc @@ -75,3 +75,8 @@ QuarticSolver::QuarticSolver(double a, double b, double c, double d, double e) Solver::Result QuarticSolver::solve() { } + +Solver::Result::Result() +{ + numResults = 0; +} diff --git a/util/Solver.h b/util/Solver.h index 3edc7b1..9795b0b 100644 --- a/util/Solver.h +++ b/util/Solver.h @@ -5,11 +5,13 @@ class Solver { public: - typedef struct + class Result { - int numResults; - double results[4]; - } Result; + public: + Result(); + int numResults; + double results[4]; + }; Solver(double a = 0.0, double b = 0.0,