#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<float>::max();
}
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<float>::max();
}
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="<<cos_theta <<", flipping normal" <<std::endl;
- n = n * -1;
- }
-
- // shoot secondary rays from intersection
- Ray sec(ray.origin() + ray.direction() * (ray.t() - Epsilon),
- ray.direction() + n * 2);
- sec.setRecursionDepth(ray.recursionDepth() - 1);
+ if(ray.recursionDepth() > 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;
}