#include "ReflectiveEyeLightShader.hxx"
+#include "Primitive.hxx"
+#include "Scene.hxx"
ReflectiveEyeLightShader::ReflectiveEyeLightShader(Scene* scene,
float reflectivity,
Vec3f
ReflectiveEyeLightShader::Shade(Ray& ray)
{
- return Vec3f();
+ Vec3f N = ray.hit()->GetNormal(ray);
+ // turn normal to front
+ if(N.dot(ray.direction()) > 0)
+ N *= -1;
+
+ float cos_phi = fabs(ray.direction().dot(N));
+
+ Vec3f color = m_color * cos_phi;
+
+ if(ray.recursionDepth() < RecursionDepth)
+ {
+ // generate reflected ray
+ // ray origin = hitpoint
+ Vec3f origin = ray.origin() + ray.direction()*ray.t();
+ Vec3f dir = ray.direction()-N*2*N.dot(ray.direction());
+ dir.normalize();
+
+ // spawn new ray
+ Ray reflection_ray(origin, dir, ray.recursionDepth()+1);
+ reflection_ray.setT(Infinity);
+
+ // trace reflection ray
+ Vec3f reflected_color = m_scene->RayTrace(reflection_ray);
+ color += reflected_color * m_reflectivity;
+ }
+
+ color.clamp();
+
+ return color;
}