#include "PointLight.hxx"
PointLight::PointLight(Scene* scene, const Vec3f& pos, const Vec3f& intensity)
- : Light(scene),
+ : Light(scene),
m_pos(pos),
m_intensity(intensity)
{
}
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)
{
- Vec3f dir = (ray.origin() + ray.direction() * (ray.t()-Epsilon)) - m_pos;
- float dist = dir.norm();
+ // 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();
-
- float c1 = 1, c2 = 0.5, c3 = 0;
- //float f_att = 1 / (dist*dist);
- float f_att = 1 / (c1 + c2*dist + c3*dist*dist);
-
- intensity = m_intensity * f_att;
-
- // store direction from light to hitpoint
- ray.setDir(dir);
+ shadow_ray.setDir(dir);
+
return true;
}
return m_intensity;
}
-
+bool
+PointLight::IsArea()
+{
+ return false;
+}