The raytracer now uses doubles for everything except colour (float is used for color). This change has fixed the issue where some pixels were black because of the limited precision of float compared to double (!!!).

Also, an issue with shadows has been fixed. When shadows were tested, a ray from the hit surface was traced to each light source. The problem was that the origin of the new ray was on the hit surface, so it hit itself at t = 0. A test case was added in triangle.hit() that tests if t == 0 and returns 'false' (no intersection) when it is true.