X-Git-Url: https://git.rohieb.name/MicroTrace.git/blobdiff_plain/9fa235f6c621a9737be66359dc6bed473f1823d9..d09f84c0fc495347e9f73c362819f5b726b23dda:/PointLight.cxx?ds=sidebyside diff --git a/PointLight.cxx b/PointLight.cxx index 2efe585..61e4ec8 100644 --- a/PointLight.cxx +++ b/PointLight.cxx @@ -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; +}