solution for assignment 2.2: working flat shader
authorRoland Hieber <rohieb@rohieb.name>
Mon, 18 Jan 2010 05:03:21 +0000 (06:03 +0100)
committerRoland Hieber <rohieb@rohieb.name>
Mon, 18 Jan 2010 05:03:21 +0000 (06:03 +0100)
FlatShader.cxx
Ray.cxx
Ray.hxx
Scene.cxx

index fcae006..3699cd4 100644 (file)
@@ -12,7 +12,7 @@ FlatShader::~FlatShader()
 }
 
 FlatShader::FlatShader()
 }
 
 FlatShader::FlatShader()
-  : Shader(0), 
+  : Shader(0),
     m_color(Vec3f())
 {
 }
     m_color(Vec3f())
 {
 }
@@ -20,5 +20,5 @@ FlatShader::FlatShader()
 Vec3f
 FlatShader::Shade(Ray& ray)
 {
 Vec3f
 FlatShader::Shade(Ray& ray)
 {
-  return Vec3f(); 
+  return m_color;
 }
 }
diff --git a/Ray.cxx b/Ray.cxx
index b7e5457..86b1294 100644 (file)
--- a/Ray.cxx
+++ b/Ray.cxx
@@ -10,7 +10,7 @@ Ray::Ray()
   m_t = std::numeric_limits<float>::max();
 }
 
   m_t = std::numeric_limits<float>::max();
 }
 
-Ray::Ray(const Vec3f& org, 
+Ray::Ray(const Vec3f& org,
         const Vec3f& dir)
   : m_org(org),
     m_dir(dir),
         const Vec3f& dir)
   : m_org(org),
     m_dir(dir),
@@ -80,13 +80,19 @@ Ray::setT(float t)
   m_t = t;
 }
 
   m_t = t;
 }
 
+void
+Ray::setHit(Primitive * p)
+{
+   m_hit = p;
+}
+
 Primitive*
 Ray::hit()
 {
   return m_hit;
 }
 
 Primitive*
 Ray::hit()
 {
   return m_hit;
 }
 
-unsigned int 
+unsigned int
 Ray::recursionDepth() const
 {
   return m_level;
 Ray::recursionDepth() const
 {
   return m_level;
diff --git a/Ray.hxx b/Ray.hxx
index f37425c..0b4e796 100644 (file)
--- a/Ray.hxx
+++ b/Ray.hxx
@@ -13,10 +13,11 @@ public:
   ~Ray();
   Ray(const Ray& r);
   Ray& operator=(const Ray& r);
   ~Ray();
   Ray(const Ray& r);
   Ray& operator=(const Ray& r);
-  
+
   const Vec3f& origin() const;
   const Vec3f& direction() const;
   float t() const;
   const Vec3f& origin() const;
   const Vec3f& direction() const;
   float t() const;
+  void setHit(Primitive * p);
   Primitive* hit();
   unsigned int recursionDepth() const;
 
   Primitive* hit();
   unsigned int recursionDepth() const;
 
@@ -29,9 +30,9 @@ private:
   Vec3f m_org; //!< ray origin
   Vec3f m_dir; //!< ray direction
   float m_t;   //!< current/maximum hit distance
   Vec3f m_org; //!< ray origin
   Vec3f m_dir; //!< ray direction
   float m_t;   //!< current/maximum hit distance
-   
+
   unsigned int m_level; //!< level of recursion
   unsigned int m_level; //!< level of recursion
-  
+
   Primitive* m_hit;
 };
 
   Primitive* m_hit;
 };
 
index 69ea9ed..4998bd1 100644 (file)
--- a/Scene.cxx
+++ b/Scene.cxx
@@ -1,12 +1,13 @@
 #include "Scene.hxx"
 #include "PerspectiveCamera.hxx"
 #include "Scene.hxx"
 #include "PerspectiveCamera.hxx"
+#include <limits>
 
 Scene::Scene()
 
 Scene::Scene()
-  : m_camera(new PerspectiveCamera(Vec3f(0,0,8), 
-                                  Vec3f(0,0,-1), 
-                                  Vec3f(0,1,0), 
-                                  50, 
-                                  640, 
+  : m_camera(new PerspectiveCamera(Vec3f(0,0,8),
+                                  Vec3f(0,0,-1),
+                                  Vec3f(0,1,0),
+                                  50,
+                                  640,
                                   480)
             ),
     m_bgColor(Vec3f(0,0,0))
                                   480)
             ),
     m_bgColor(Vec3f(0,0,0))
@@ -29,7 +30,7 @@ Scene::operator=(const Scene& s)
   return *this;
 }
 
   return *this;
 }
 
-void 
+void
 Scene::Add(Primitive* p)
 {
   m_primitives.push_back(p);
 Scene::Add(Primitive* p)
 {
   m_primitives.push_back(p);
@@ -40,9 +41,16 @@ bool
 Scene::Intersect(Ray& ray)
 {
   bool hit = false;
 Scene::Intersect(Ray& ray)
 {
   bool hit = false;
-  for( std::vector<Primitive*>::iterator i = m_primitives.begin();
-    i != m_primitives.end(); i++ ) {
-    hit |= (*i)->Intersect(ray);
+  float t = std::numeric_limits<float>::max();
+  for (std::vector<Primitive*>::iterator i = m_primitives.begin();
+    i != m_primitives.end(); i++) {
+    // store closest object hit
+    if (hit |= (*i)->Intersect(ray)) {
+      if (ray.t() < t) {
+        ray.setHit(*i);
+        t = ray.t();
+      }
+    }
   }
   return hit;
 }
   }
   return hit;
 }
@@ -56,10 +64,14 @@ Scene::Occluded(Ray& ray)
 Vec3f
 Scene::RayTrace(Ray& ray)
 {
 Vec3f
 Scene::RayTrace(Ray& ray)
 {
-  return (Intersect(ray)) ? Vec3f(255,255,255) : Vec3f(0,0,0);
+  if (Intersect(ray)) {
+    return ray.hit()->shader()->Shade(ray);
+  } else {
+    return Vec3f(0,0,0);
+  }
 }
 
 }
 
-const Camera* 
+const Camera*
 Scene::camera() const
 {
   return m_camera;
 Scene::camera() const
 {
   return m_camera;
This page took 0.028878 seconds and 4 git commands to generate.