#include "color.h" #include "light.h" // PRIVATE PROTOTYPES static ColorF32 ComputeAmbientLight( ColorF32 surfaceReflectivity, ColorF32 lightIntensity); static ColorF32 ComputeDiffuseLight( ColorF32 surfaceReflectivity, ColorF32 lightIntensity, Point &vertPosition, Vector &vertNormal, Point &lightPosition); // PUBLIC FUNCTIONS ColorF32 ComputeLight(Vertex &vert, Material &material, Light &light) { // Distance from light to vertex Vector d = light.position - vert.point; float distance = d.Length(); // Intensity is a function of the falloff factors and the distance ColorF32 intensity = (light.intensity * light.color) / (light.falloffConstant + light.falloffLinear * distance); // Compute ambient light ColorF32 ambientLight = ComputeAmbientLight( material.ambient, intensity); // Compute diffuse light ColorF32 diffuseLight = ComputeDiffuseLight( material.diffuse, intensity, vert.point, vert.normal, light.position); // Total light is sum of all lights ColorF32 result = ambientLight + diffuseLight; return result; } // PRIVATE FUNCTIONS static ColorF32 ComputeAmbientLight( ColorF32 surfaceReflectivity, ColorF32 lightIntensity) { ColorF32 result; result = surfaceReflectivity * lightIntensity; return result; } static ColorF32 ComputeDiffuseLight( ColorF32 surfaceReflectivity, ColorF32 lightIntensity, Point &vertPosition, Vector &vertNormal, Point &lightPosition) { // Light is a function of the position of the light source and the surface Vector direction = lightPosition - vertPosition; direction.Normalize(); float dot = Vector::Dot(vertNormal, direction); ColorF32 result = surfaceReflectivity * lightIntensity * dot; return result; }