//---------------------------------------------------------------------------- // William Baxter III's Ray Tracer // // Project for Comp 238, Raster Graphics // University of North Carolina at Chapel Hill // // $Id:$ //---------------------------------------------------------------------------- #ifndef WB3MATERIAL_H #define WB3MATERIAL_H //---------------------------------------------------------------------------- #include #include "wb3Components.hpp" class wb3Material { public: wb3Material(const Vec3f& KAmbient, const Vec3f& KDiffuse, const Vec3f& KSpecular, const Vec3f& KReflect, const Vec3f& KRefract, float SpecExp = 2.0f, float Index = 1.0f); wb3Material(const Vec3f& K, float SpecExp = 2.0f, float Index = 1.0f); wb3Material(float SpecExp = 2.0f, float Index = 1.0f); ~wb3Material() {}; const Vec3f& GetAmbient() const; const Vec3f& GetDiffuse() const; const Vec3f& GetSpecular() const; const Vec3f& GetReflect() const; const Vec3f& GetRefract() const; void SetAmbient(const Vec3f& KAmb); void SetDiffuse(const Vec3f& KDif); void SetSpecular(const Vec3f& KSpec); void SetReflect(const Vec3f& KRefl); void SetRefract(const Vec3f& KRefr); float GetSpecularity() const; void SetSpecularity(float fSpec); float GetIndex() const; void SetIndex(float fIndexOfRefraction); float GetScalarComponent(wb3Component::ComponentType which); const Vec3f& GetColorComponent(wb3Component::ComponentType which); protected: // wb3Material *m_pNext; Vec3f m_Comps[wb3Component::MAX_COMPONENT]; Vec3f m_KAmbient; Vec3f m_KDiffuse; Vec3f m_KSpecular; Vec3f m_KReflect; Vec3f m_KRefract; float m_fSpecExp; float m_fIndex; // index of refraction }; //---------------------------------------------------------------------------- inline const Vec3f& wb3Material::GetColorComponent( wb3Component::ComponentType type) { using namespace wb3Component; switch (type) { case AMBIENT: return GetAmbient(); case DIFFUSE: return GetDiffuse(); case SPECULAR: return GetSpecular(); case REFLECT: return GetReflect(); case REFRACT: return GetRefract(); default: // error here! return Vec3f::ZERO; } } //---------------------------------------------------------------------------- inline float wb3Material::GetScalarComponent( wb3Component::ComponentType type) { using namespace wb3Component; switch (type) { case SPECPOW: return GetSpecularity(); case BUMP: return 0; // a uniform perturbation is pointless. default: // error here; return 0; } } //---------------------------------------------------------------------------- inline const Vec3f& wb3Material::GetAmbient() const { return m_KAmbient; } inline const Vec3f& wb3Material::GetDiffuse() const { return m_KDiffuse; } inline const Vec3f& wb3Material::GetSpecular() const { return m_KSpecular; } inline const Vec3f& wb3Material::GetReflect() const { return m_KReflect; } inline const Vec3f& wb3Material::GetRefract() const { return m_KRefract; } inline float wb3Material::GetIndex() const { return m_fIndex; } inline void wb3Material::SetAmbient(const Vec3f& KAmb) { m_KAmbient = KAmb; } inline void wb3Material::SetDiffuse(const Vec3f& KDif) { m_KDiffuse = KDif;} inline void wb3Material::SetSpecular(const Vec3f& KSpec) { m_KSpecular=KSpec;} inline void wb3Material::SetReflect(const Vec3f& KRefl) { m_KReflect = KRefl;} inline void wb3Material::SetRefract(const Vec3f& KRefr) { m_KRefract = KRefr;} inline void wb3Material::SetIndex(float fIndex) { m_fIndex = fIndex;} inline float wb3Material::GetSpecularity() const { return m_fSpecExp; } inline void wb3Material::SetSpecularity(float fS) { m_fSpecExp = fS; } //---------------------------------------------------------------------------- #endif