Colour RayTracer::CalculateLighting(std::vector<Light*>* lights, Vector3* campos, RayHitResult* hitresult) { Colour outcolour; std::vector<Light*>::iterator lit_iter = lights->begin(); //Retrive the material for the intersected primitive Primitive* prim = (Primitive*)hitresult->data; Material* mat = prim->GetMaterial(); //the default output colour is the ambient colour outcolour = mat->GetAmbientColour(); // The hack f***s stuff up. //This is a hack to set a checker pattern on the planes //Do not modify it if (((Primitive*)hitresult->data)->m_primtype == Primitive::PRIMTYPE_Plane) { int dx = (hitresult->point[0]/2.0); int dy = (hitresult->point[1]/2.0); int dz = (hitresult->point[2]/2.0); if (dx % 2 || dy % 2 || dz % 2) { outcolour.red = 1.0; outcolour.green = 1.0; outcolour.blue = 1.0; } else { outcolour.red = 0.0; outcolour.green = 0.0; outcolour.blue = 0.0; } } ////Go through all the light sources in the scene //and calculate the lighting at the intersection point if (m_traceflag & TRACE_DIFFUSE_AND_SPEC) { while (lit_iter != lights->end()) { Vector3 light_pos = (*lit_iter)->GetLightPosition(); //position of the light source Vector3 normal = hitresult->normal; //surface normal at intersection Vector3 surface_point = hitresult->point; //location of the intersection on the surface //TODO: Calculate the surface colour using the illumination model from the lecture notes // 1. Compute the diffuse term // 2. Compute the specular term using either the Phong model or the Blinn-Phong model // 3. store the result in outcolour // DONE outcolour += CalculateDiffuseLighting((light_pos - surface_point).Normalise(), normal, **lit_iter, *mat); outcolour += CalculateSpecularLighting(surface_point, normal, light_pos - surface_point, *campos, **lit_iter, *mat); double dist = (light_pos - surface_point).Norm(); double att = 1.0 / (1.0 + (0 * dist) + (0.002 * dist * dist)); outcolour *= att; lit_iter++; } } // light and surface pont return outcolour; }