#ifndef RAVEN_LIGHT_H #define RAVEN_LIGHT_H #include "common.h" #include "vector.h" // generic optic componets to be used for lighting type stuff enum OpticComponent { RAVEN_OPTICS_AMBIENT_COMPONENT, RAVEN_OPTICS_DIFFUSE_COMPONENT, RAVEN_OPTICS_SPECULAR_COMPONENT }; // light types enum LightType { RAVEN_LIGHT_NONE, RAVEN_LIGHT_POINT, // radiate from a single point RAVEN_LIGHT_DIRECTIONAL // rays in a single direction }; // a simple interface class for lighting stuff designed to be extended by lighting related classes class Optics { protected: Vector3 ambient; Vector3 diffuse; Vector3 specular; public: Optics(): ambient(0,0,0), diffuse(1,1,1), specular(0,0,0) {} Optics(Vector3 ka,Vector3 kd,Vector3 ks): ambient(ka), diffuse(kd), specular(ks) {} virtual ~Optics() {} virtual void GetComponent(OpticComponent component,Vector3 &val); virtual void SetComponent(OpticComponent component,const Vector3 &val); virtual void GetComponent(OpticComponent component,Vector4 &val); virtual void SetComponent(OpticComponent component,const Vector4 &val); }; // basic light object API class Light: public Optics // uses common optics class { protected: LightType lighttype; public: Light(): Optics(), lighttype(RAVEN_LIGHT_NONE) {} Light(Vector3 ka,Vector3 kd,Vector3 ks): Optics(ka,kd,ks), lighttype(RAVEN_LIGHT_NONE) {} virtual ~Light() {} // get/set position; only applicable to non-directional sources virtual void Position(Vector3 pos)=0; virtual Vector3 Position()=0; // get/set direction; only applicable to directional sources (spotlight not yet implemented) virtual void Direction(Vector3 dir)=0; virtual Vector3 Direction()=0; // get/set attenuation; attenuation is linear in this system virtual void Attenuation(float atten)=0; virtual float Attenuation()=0; virtual LightType GetType() {return lighttype;} // what the fuck type is it }; // the point variety of lights class PointLight: public Light { protected: float attenuation; Vector3 position; public: PointLight(): Light(), position(0,0,0), attenuation(0) {lighttype=RAVEN_LIGHT_POINT;} PointLight(Vector3 ka,Vector3 kd,Vector3 ks): Light(ka,kd,ks), position(0,0,0), attenuation(0) {lighttype=RAVEN_LIGHT_POINT;} PointLight(Vector3 ka,Vector3 kd,Vector3 ks,float atten): Light(ka,kd,ks), position(0,0,0), attenuation(atten) {lighttype=RAVEN_LIGHT_POINT;} virtual ~PointLight() {} virtual void Position(Vector3 pos); virtual Vector3 Position(); virtual void Direction(Vector3 dir); virtual Vector3 Direction(); virtual void Attenuation(float atten); virtual float Attenuation(); }; // the directional variety of lights class DirectionalLight: public Light { protected: Vector3 direction; public: DirectionalLight(): Light(), direction(0,-1,0) {lighttype=RAVEN_LIGHT_DIRECTIONAL;} DirectionalLight(Vector3 ka,Vector3 kd,Vector3 ks): Light(ka,kd,ks), direction(0,-1,0) {lighttype=RAVEN_LIGHT_DIRECTIONAL;} virtual ~DirectionalLight() {} virtual void Position(Vector3 pos); virtual Vector3 Position(); virtual void Direction(Vector3 dir); virtual Vector3 Direction(); virtual void Attenuation(float atten); virtual float Attenuation(); }; #endif