From db072ad4dc181eca5a1458656b130beb43f475bf Mon Sep 17 00:00:00 2001 From: 53hornet <53hornet@gmail.com> Date: Sat, 2 Feb 2019 23:33:15 -0500 Subject: Init. --- hw5/src/spotLightsource.cpp | 64 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 hw5/src/spotLightsource.cpp (limited to 'hw5/src/spotLightsource.cpp') diff --git a/hw5/src/spotLightsource.cpp b/hw5/src/spotLightsource.cpp new file mode 100644 index 0000000..ab09636 --- /dev/null +++ b/hw5/src/spotLightsource.cpp @@ -0,0 +1,64 @@ +/******************************************************************/ +/* 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; +} -- cgit v1.2.3