/******************************************************************/ /* 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 { // HW5: Implement this. Computes the intensity from a spot // light source toward the 'point' taking in account // attenuation, cutoff angle, and sharpness. // Modifies: nothing. // Returns: light sample (pass 1) direction, 2) power/color // of the incident lighting, and 3) distance between // the light source and the point). vec3d direction = (point - _position).normalize(); float dl_dot = direction.dot(_direction); float distance = _position.distance(point); color emittance; if (dl_dot > _cutoff) { emittance = _power * pow(dl_dot, _sharpness) / ( _attenuation.x + _attenuation.y * distance + _attenuation.z * _position.squared_distance(point)); } else { emittance = color(0); } return lightSample(direction, emittance, distance); } ///////////////////// // 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; }