From: Roland Hieber Date: Thu, 21 Jan 2010 01:14:15 +0000 (+0100) Subject: WORKING ReflectiveEyelightShader \o/ X-Git-Url: https://git.rohieb.name/MicroTrace.git/commitdiff_plain/430ddbc0e443b60b6d0c7893a96e045411368dbf WORKING ReflectiveEyelightShader \o/ --- diff --git a/Ray.cxx b/Ray.cxx index 584db26..e0a1ab5 100644 --- a/Ray.cxx +++ b/Ray.cxx @@ -2,13 +2,13 @@ #include "Ray.hxx" -#define MAX_RECURSION_DEPTH 5 +#define MAX_RECURSION_DEPTH 10 Ray::Ray() : m_org(Vec3f()), m_dir(Vec3f()), - m_hit(0), - m_level(MAX_RECURSION_DEPTH) + m_level(MAX_RECURSION_DEPTH), + m_hit(0) { m_t = std::numeric_limits::max(); } @@ -17,8 +17,8 @@ Ray::Ray(const Vec3f& org, const Vec3f& dir) : m_org(org), m_dir(dir), - m_hit(0), - m_level(MAX_RECURSION_DEPTH) + m_level(MAX_RECURSION_DEPTH), + m_hit(0) { m_t = std::numeric_limits::max(); } diff --git a/ReflectiveEyeLightShader.cxx b/ReflectiveEyeLightShader.cxx index 87369bd..b681e47 100644 --- a/ReflectiveEyeLightShader.cxx +++ b/ReflectiveEyeLightShader.cxx @@ -26,23 +26,17 @@ ReflectiveEyeLightShader::Shade(Ray& ray) Vec3f eyeColor = EyeLightShader::Shade(ray); Vec3f reflColor; - // get normal and turn towards ray if angle > 90° - Vec3f n = ray.hit()->GetNormal(ray); - float cos_theta = n.dot(ray.direction()); - // we just need the sign, no value - if( cos_theta > 0 ) { - std::cout << "cos_theta="< 0) { + m_scene->Intersect(ray); + // intersection, - Epsilon to avoid numerical problems and getting the + // reflection on the object's inside ;-) + Vec3f i = ray.origin() + ray.direction() * (ray.t() - Epsilon); + Vec3f r = ray.direction(); + Vec3f n = (ray.hit()->GetNormal(ray)); - if(sec.recursionDepth() + 1 > 0) { + Ray sec(i, r + n * (2 * r.dot(n * -1))); + sec.setRecursionDepth(ray.recursionDepth() - 1); reflColor = m_scene->RayTrace(sec); - //reflColor = Shade(sec); } - return eyeColor + (reflColor * m_reflectivity); + return eyeColor + reflColor * m_reflectivity; }