fixed Box::Extend(Vec3f&)
[MicroTrace.git] / PointLight.cxx
index 2efe585..61e4ec8 100644 (file)
@@ -1,7 +1,7 @@
 #include "PointLight.hxx"
 
 PointLight::PointLight(Scene* scene, const Vec3f& pos, const Vec3f& intensity)
-  : Light(scene),
+  : Light(scene), 
     m_pos(pos),
     m_intensity(intensity)
 {
@@ -12,24 +12,31 @@ PointLight::~PointLight()
 }
 
 PointLight::PointLight()
-  : Light(0),
+  : Light(0), 
     m_pos(Vec3f()),
     m_intensity(Vec3f())
 {
 }
 
 bool
-PointLight::Illuminate(Ray& ray, Vec3f& intensity)
+PointLight::Illuminate(Ray& shadow_ray, Vec3f& intensity)
 {
-  float dist = ((ray.origin() + ray.direction() * ray.t()) - m_pos).norm();
-
-  float c1 = 1, c2 = 0.5, c3 = 0;
-  float f_att = 1 / (c1 + c2*dist + c3*dist*dist);
-
-  intensity = m_intensity * f_att;
-
-  // store direction from light to hitpoint
-  ray.setDir(ray.origin() + ray.direction() * (ray.t()-Epsilon) - m_pos);
+  // distance to light source
+  Vec3f dir = m_pos-shadow_ray.origin();
+  float r = dir.norm()-Epsilon;
+  float falloff = 1.0f/(r*r);
+  
+  
+  intensity = m_intensity * falloff;
+  
+  // modify ray for shadow computation
+  shadow_ray.setHit(0);
+  // for shadow calculation
+  shadow_ray.setT(r);
+  // set direction to light source
+  dir.normalize();
+  shadow_ray.setDir(dir);
+  
   return true;
 }
 
@@ -45,4 +52,8 @@ PointLight::intensity() const
   return m_intensity;
 }
 
-
+bool
+PointLight::IsArea() 
+{
+  return false;
+}
This page took 0.027937 seconds and 4 git commands to generate.