Example #1
0
RGBColor Matte::shade(Hit& h){
	msgfx::Vector3f wo = -h.ray.Direction();
	RGBColor L = _ambientBRDF->rho(h, wo) * h.scenePtr->ambientLight;
	int numLights = h.scenePtr->myNumberOfLights;
	msgfx::Vector3f wi;

	for(int i = 0; i < numLights; ++i)
	{
		wi = h.scenePtr->myLights[i]->Position() - h.Position();
		float d = wi.length();
		wi.normalize();
		float ndotwi = h.normal.dot(wi);

		if(ndotwi > 0.0){
			// Calculate attenuation factor
			if(h.scenePtr->isPointVisibleToLight(h.Position(), h.scenePtr->myLights[i]))
			{
				float attenuation = 1 / (d*d*h.scenePtr->myLights[i]->Attenuation().r + d*h.scenePtr->myLights[i]->Attenuation().g + h.scenePtr->myLights[i]->Attenuation().b);
				L = L + _diffuseBRDF->f(h, wo, wi) * h.scenePtr->myLights[i]->Color() * ndotwi * attenuation;
			}
		}
			
	}
	
	return L;
}