//---------------------------------------------------------------------------- // William Baxter III's Ray Tracer // // Project for Comp 238, Raster Graphics // University of North Carolina at Chapel Hill // // $Id:$ //---------------------------------------------------------------------------- #ifndef WB3LIGHT_H #define WB3LIGHT_H #include #include "ray3f.hpp" //---------------------------------------------------------------------------- class wb3Scene; class wb3Artifact; class wb3Light { public: wb3Light(const Vec3f& positon); wb3Light(const Vec3f& positon, const Vec3f& color); wb3Light(const Vec3f& positon, const Vec3f& AmbientColor, const Vec3f& DiffuseColor, const Vec3f& SpecularColor); ~wb3Light() {}; const Vec3f& GetAmbientColor() const; const Vec3f& GetDiffuseColor() const; const Vec3f& GetSpecularColor() const; void SetAmbientColor(const Vec3f& color); void SetDiffuseColor(const Vec3f& color); void SetSpecularColor(const Vec3f& color); const Vec3f& GetPosition() const; void SetPosition(const Vec3f& pos); // Attenuation = 1/(Axd^2 + Bxd + C) void GetAttenuationFactors(float *A, float *B, float *C) const; void SetAttenuationFactors(float A, float B, float C); float ComputeAttenuation(float dist) const; void Contribute(const wb3Scene *scene, const wb3Artifact *hit, const Ray3f& r, const Vec3f &isect, const Vec3f &N, Vec3f& color) const; protected: Vec3f m_pos; Vec3f m_AColor; Vec3f m_DColor; Vec3f m_SColor; float m_fA, m_fB, m_fC; }; //---------------------------------------------------------------------------- inline const Vec3f& wb3Light::GetAmbientColor() const { return m_AColor; } //---------------------------------------------------------------------------- inline void wb3Light::SetAmbientColor(const Vec3f& color) { m_AColor = color; } //---------------------------------------------------------------------------- inline const Vec3f& wb3Light::GetDiffuseColor() const { return m_DColor; } //---------------------------------------------------------------------------- inline void wb3Light::SetDiffuseColor(const Vec3f& color) { m_DColor = color; } //---------------------------------------------------------------------------- inline const Vec3f& wb3Light::GetSpecularColor() const { return m_SColor; } //---------------------------------------------------------------------------- inline void wb3Light::SetSpecularColor(const Vec3f& color) { m_SColor = color; } //---------------------------------------------------------------------------- inline const Vec3f& wb3Light::GetPosition() const { return m_pos; } //---------------------------------------------------------------------------- inline void wb3Light::SetPosition(const Vec3f& pos) { m_pos = pos; } //---------------------------------------------------------------------------- inline void wb3Light::SetAttenuationFactors(float A, float B, float C) { m_fA = A; m_fB = B; m_fC = C; } //---------------------------------------------------------------------------- inline void wb3Light::GetAttenuationFactors(float*A, float*B, float*C) const { *A = m_fA; *B = m_fB; *C = m_fC; } //---------------------------------------------------------------------------- inline float wb3Light::ComputeAttenuation(float dist) const { return 1.0f/(m_fA * dist * dist + m_fB * float(fabs(dist)) + m_fC); } //---------------------------------------------------------------------------- #endif