ColorFloat Shade(Primitive &primitive, int currPrimitiveNum, Ray &ray, float distance, LightSource *lightSources, int numLightSources, Primitive *primitives, int numPrimitives, int depth) { ColorFloat returnColor; returnColor.r=0; returnColor.g=0; returnColor.b=0; Vector intersection = CalculateIntersection(ray,distance); Vector normal = CalculateNormal(primitive, intersection); //specular for(int i=0; i<numLightSources; i++) { Ray rayToLight; float distanceToLight = CalculateLightRay(lightSources[i].location, intersection, rayToLight); // sets rayToLight float lightCoef = CalculateLightingCoef(IsShadowed(currPrimitiveNum, rayToLight, distanceToLight, primitives, numPrimitives) , rayToLight.direction, normal); returnColor.r += primitive.surface.baseColor.r * lightCoef * lightSources[i].color.r; // try checking first if lightCoef is 0... the check will probably be amortized over the returnColor.g += primitive.surface.baseColor.g * lightCoef * lightSources[i].color.g; // cost of all these multiplications returnColor.b += primitive.surface.baseColor.b * lightCoef * lightSources[i].color.b; } //reflective if(primitive.surface.reflectivity!=0) { ColorFloat reflectedColor = CalculateReflection(ray, intersection, normal, currPrimitiveNum, primitives, numPrimitives, lightSources, numLightSources, depth); returnColor.r += reflectedColor.r * primitive.surface.reflectivity; returnColor.g += reflectedColor.g * primitive.surface.reflectivity; returnColor.b += reflectedColor.b * primitive.surface.reflectivity; } return returnColor; }
void CHardwareBuffer::UpdateFromShadow() { if (!IsShadowed()) Error("This hardware buffer is not shadowed."); }