/******************************************************************/ /* This file is part of the homework assignments for CSCI-427/527 */ /* at The College of William & Mary and authored by Pieter Peers. */ /* No part of this file, whether altered or in original form, can */ /* be distributed or used outside the context of CSCI-427/527 */ /* without consent of either the College of William & Mary or */ /* Pieter Peers. */ /******************************************************************/ #include #include "constants.h" #include "spotLightsource.h" ////////////////// // Constructors // ////////////////// spotLightsource::spotLightsource(const vec3d& position, const vec3d& direction, float cutoffDegrees, float sharpness, const color& power, const vec3d& attenuation) { _position = position; _direction = normalize(direction); _cutoff = cos(cutoffDegrees * PI / 180.0f); _sharpness = sharpness; _power = power; _attenuation = attenuation; } ///////////// // Methods // ///////////// lightSample spotLightsource::intensityAt(const vec3d& point) const { vec3d direction = point - _position; float distance = direction.length(); float cosAngle = _direction.dot(direction) / distance; // check if outside cone if(cosAngle < _cutoff) return lightSample(direction, color(0.0f, 0.0f, 0.0f), distance); // compute attenuation & scale float attenuation = ((_attenuation[2]*distance + _attenuation[1])*distance + _attenuation[0]); float scale = pow(cosAngle, _sharpness); // Done. return lightSample(direction, _power * scale / attenuation, distance); } lightSample spotLightsource::emittanceAt(const vec3d& point, float r1, float r2) const { vec3d direction = point - _position; float distance = direction.length(); float cosAngle = _direction.dot(direction) / distance; // compute emittance color emittance = (cosAngle < _cutoff) ? color(0.0f, 0.0f, 0.0f) : _power * pow(cosAngle, _sharpness) / (4.0f * PI); // Done. // PDF = 1.0 => there is only a single point // Foreshortening => no normal return lightSample(direction, emittance, distance, 1.0f, 1.0f); } ///////////////////// // Private Methods // ///////////////////// void spotLightsource::_print(std::ostream& s) const { s << "Spot Lightsource: position=" << _position << ", direction=" << _direction << ", cutoff=" << (acos(_cutoff)*180.0f/PI) << ", sharpness=" << _sharpness << ", power=" << _power << ", attenuation=" << _attenuation; }