From df8007c9ec4440ac2388c7a4971e708c2b697832 Mon Sep 17 00:00:00 2001 From: Roland Hieber Date: Wed, 3 Feb 2010 03:21:11 +0100 Subject: [PATCH] Scene::CalcBounds(), including Box::Extend(Box&), Box::Clear() --- Box.cxx | 4 ++++ Scene.cxx | 44 ++++++++++++++++++++++++-------------------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/Box.cxx b/Box.cxx index d421525..febe7c7 100644 --- a/Box.cxx +++ b/Box.cxx @@ -31,6 +31,8 @@ Box::operator=(const Box& b) void Box::Clear() { + m_min = Vec3f(Infinity, Infinity, Infinity); + m_max = Vec3f(-Infinity, -Infinity, -Infinity); } void @@ -49,6 +51,8 @@ Box::Extend(const Vec3f& a) void Box::Extend(const Box& box) { + Extend(box.min()); + Extend(box.max()); } bool Box::OverlapsHelper(Box b) const { diff --git a/Scene.cxx b/Scene.cxx index 9d78bc6..3085410 100644 --- a/Scene.cxx +++ b/Scene.cxx @@ -8,11 +8,11 @@ #include "Triangle.hxx" Scene::Scene() - : m_camera(new PerspectiveCamera(Vec3f(0,0,8), - Vec3f(0,0,-1), - Vec3f(0,1,0), - 60, - 640, + : m_camera(new PerspectiveCamera(Vec3f(0,0,8), + Vec3f(0,0,-1), + Vec3f(0,1,0), + 60, + 640, 480) ), m_bgColor(Vec3f(0,0,0)), @@ -45,7 +45,7 @@ Scene::operator=(const Scene& s) return *this; } -void +void Scene::Add(Primitive* p) { m_primitives.push_back(p); @@ -66,7 +66,7 @@ Scene::Intersect(Ray& ray) { intersect |= m_primitives[i]->Intersect(ray); } - + return intersect; } @@ -83,13 +83,13 @@ Scene::RayTrace(Ray& ray) return (intersect) ? ray.hit()->shader()->Shade(ray) : m_bgColor; } -const Camera* +const Camera* Scene::camera() const { return m_camera; } -std::vector +std::vector Scene::lights() const { return m_lights; @@ -107,16 +107,16 @@ void Scene::ParseOBJ(const std::string& file, float scale) { std::cerr << "(Scene): Parsing OBJ file : " << file << std::endl; - + // clear old buffers m_vertices.clear(); m_faces.clear(); - + // for the moment, we will attach a white eyelight shader to each object // in the future, you will extend your parser to also read in material definitiions if(m_shader == 0) // not yet defined m_shader = new EyeLightShader(this, Vec3f(1.0,1.0,1.0)); - + // now open file std::fstream in; @@ -126,7 +126,7 @@ Scene::ParseOBJ(const std::string& file, float scale) std::cerr << "(Scene): Could not open file " << file << std::endl; return; } - + // read lines std::string line; while(!in.eof()) @@ -140,7 +140,7 @@ Scene::ParseOBJ(const std::string& file, float scale) // build triangle list from parsed vertices this->buildTriangleList(scale); - + std::cerr << "(Scene): Finished parsing." << std::endl; } @@ -151,12 +151,12 @@ Scene::parseOBJLine(const std::string& line) std::istringstream iss(line); std::string key; iss >> key; - if (key == "v") + if (key == "v") { // parse vertex // this->parseVertex(iss); } - else if (key == "f") + else if (key == "f") { // parse face // this->parseFace(iss); @@ -189,12 +189,12 @@ Scene::buildTriangleList(float fac) // stores indices of triangle into vertex list // remember: indices start at 1!! Vec3f face_idx = m_faces[f]; - this->Add(new Triangle(m_vertices[ face_idx[0]-1 ] * fac, - m_vertices[ face_idx[1]-1 ] * fac, + this->Add(new Triangle(m_vertices[ face_idx[0]-1 ] * fac, + m_vertices[ face_idx[1]-1 ] * fac, m_vertices[ face_idx[2]-1 ] * fac, m_shader)); - - } + + } m_centroid /= static_cast(m_vertices.size()); std::cerr << "(Scene): Model centroid = " << m_centroid * fac << std::endl; } @@ -202,6 +202,10 @@ Scene::buildTriangleList(float fac) void Scene::CalcBounds() { + for(unsigned int i = 0; i < m_primitives.size(); ++i) + { + m_scene_box.Extend(m_primitives[i]->CalcBounds()); + } } const Box& -- 2.20.1