#ifndef __LIGHTS #define __LIGHTS interface Light { float3 illuminate(float3 p, out float3 L); }; struct PointLight : Light { float3 Plight, Clight; float3 illuminate(float3 P, out float3 L) { L = normalize(Plight - P); return Clight; } }; struct SpotLight : Light { float3 Plight, Clight, target; float3 illuminate(float3 P, out float3 L) { L = normalize(Plight - P); float3 shine = normalize(Plight - target); float costheta = dot(L, shine); return Clight * smoothstep(0.98, 1., costheta); } }; #endif