1 /* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ 2 3 #ifndef _GL_LIGHT_H 4 #define _GL_LIGHT_H 5 6 #include "System/Object.h" 7 #include "System/float3.h" 8 #include "System/float4.h" 9 10 namespace GL { 11 struct Light: public CObject { 12 public: LightLight13 Light() 14 : position(0.0f, 0.0f, 1.0f, 1.0f) 15 , direction(ZeroVector) 16 17 , ambientColor(0.0f, 0.0f, 0.0f, 1.0f) 18 , diffuseColor(0.0f, 0.0f, 0.0f, 1.0f) 19 , specularColor(0.0f, 0.0f, 0.0f, 1.0f) 20 , intensityWeight(1.0f, 1.0f, 1.0f) 21 , ambientDecayRate(1.0f, 1.0f, 1.0f) 22 , diffuseDecayRate(1.0f, 1.0f, 1.0f) 23 , specularDecayRate(1.0f, 1.0f, 1.0f) 24 , decayFunctionType(1.0f, 1.0f, 1.0f) 25 26 , radius(0.0f) 27 , fov(180.0f) 28 29 , ignoreLOS(true) 30 31 , id(-1U) 32 , ttl(0) 33 , relTime(0) 34 , absTime(0) 35 , priority(0) 36 37 , trackPosition(NULL) 38 , trackDirection(NULL) 39 { 40 } 41 42 // a light can only depend on one object DependentDiedLight43 void DependentDied(CObject* o) { 44 trackPosition = NULL; 45 trackDirection = NULL; 46 } 47 GetPositionLight48 const float4& GetPosition() const { return position; } GetDirectionLight49 const float3& GetDirection() const { return direction; } GetTrackPositionLight50 const float3* GetTrackPosition() const { return trackPosition; } GetTrackDirectionLight51 const float3* GetTrackDirection() const { return trackDirection; } GetAmbientColorLight52 const float4& GetAmbientColor() const { return ambientColor; } GetDiffuseColorLight53 const float4& GetDiffuseColor() const { return diffuseColor; } GetSpecularColorLight54 const float4& GetSpecularColor() const { return specularColor; } GetIntensityWeightLight55 const float3& GetIntensityWeight() const { return intensityWeight; } GetAttenuationLight56 const float3& GetAttenuation() const { return attenuation; } GetAmbientDecayRateLight57 const float3& GetAmbientDecayRate() const { return ambientDecayRate; } GetDiffuseDecayRateLight58 const float3& GetDiffuseDecayRate() const { return diffuseDecayRate; } GetSpecularDecayRateLight59 const float3& GetSpecularDecayRate() const { return specularDecayRate; } GetDecayFunctionTypeLight60 const float3& GetDecayFunctionType() const { return decayFunctionType; } 61 SetPositionLight62 void SetPosition(const float array[3]) { position = array; } SetDirectionLight63 void SetDirection(const float array[3]) { direction = array; } SetTrackPositionLight64 void SetTrackPosition(const float3* pos) { trackPosition = pos; } SetTrackDirectionLight65 void SetTrackDirection(const float3* dir) { trackDirection = dir; } SetAmbientColorLight66 void SetAmbientColor(const float array[3]) { ambientColor = array; } SetDiffuseColorLight67 void SetDiffuseColor(const float array[3]) { diffuseColor = array; } SetSpecularColorLight68 void SetSpecularColor(const float array[3]) { specularColor = array; } SetIntensityWeightLight69 void SetIntensityWeight(const float array[3]) { intensityWeight = array; } SetAttenuationLight70 void SetAttenuation(const float array[3]) { attenuation = array; } SetAmbientDecayRateLight71 void SetAmbientDecayRate(const float array[3]) { ambientDecayRate = array; } SetDiffuseDecayRateLight72 void SetDiffuseDecayRate(const float array[3]) { diffuseDecayRate = array; } SetSpecularDecayRateLight73 void SetSpecularDecayRate(const float array[3]) { specularDecayRate = array; } SetDecayFunctionTypeLight74 void SetDecayFunctionType(const float array[3]) { decayFunctionType = array; } 75 SetAmbientColorLight76 void SetAmbientColor(const float3& ac) { ambientColor = ac; } SetDiffuseColorLight77 void SetDiffuseColor(const float3& dc) { diffuseColor = dc; } SetSpecularColorLight78 void SetSpecularColor(const float3& sc) { specularColor = sc; } 79 GetRadiusLight80 float GetRadius() const { return radius; } GetFOVLight81 float GetFOV() const { return fov; } SetRadiusLight82 void SetRadius(float r) { radius = r; } SetFOVLight83 void SetFOV(float f) { fov = f; } 84 SetIgnoreLOSLight85 void SetIgnoreLOS(bool b) { ignoreLOS = b; } GetIgnoreLOSLight86 bool GetIgnoreLOS() const { return ignoreLOS; } 87 GetIDLight88 const unsigned int GetID() const { return id; } GetTTLLight89 unsigned int GetTTL() const { return ttl; } GetRelativeTimeLight90 unsigned int GetRelativeTime() const { return relTime; } GetAbsoluteTimeLight91 unsigned int GetAbsoluteTime() const { return absTime; } GetPriorityLight92 unsigned int GetPriority() const { return priority; } SetIDLight93 void SetID(unsigned int n) { id = n; } SetTTLLight94 void SetTTL(unsigned int n) { ttl = n; } SetRelativeTimeLight95 void SetRelativeTime(unsigned int n) { relTime = n; } SetAbsoluteTimeLight96 void SetAbsoluteTime(unsigned int n) { absTime = n; } SetPriorityLight97 void SetPriority(unsigned int n) { priority = n; } 98 DecayColorsLight99 void DecayColors() { 100 const bool expAmbientDecay = (decayFunctionType.x != 0.0f); 101 const bool expDiffuseDecay = (decayFunctionType.y != 0.0f); 102 const bool expSpecularDecay = (decayFunctionType.z != 0.0f); 103 104 if (expAmbientDecay) { 105 ambientColor *= ambientDecayRate; 106 } else { 107 ambientColor -= ambientDecayRate; 108 } 109 110 if (expDiffuseDecay) { 111 diffuseColor *= diffuseDecayRate; 112 } else { 113 diffuseColor -= diffuseDecayRate; 114 } 115 116 if (expSpecularDecay) { 117 specularColor *= specularDecayRate; 118 } else { 119 specularColor -= specularDecayRate; 120 } 121 } 122 ClampColorsLight123 void ClampColors() { 124 ambientColor.x = std::max(0.0f, ambientColor.x); 125 ambientColor.y = std::max(0.0f, ambientColor.y); 126 ambientColor.z = std::max(0.0f, ambientColor.z); 127 128 diffuseColor.x = std::max(0.0f, diffuseColor.x); 129 diffuseColor.y = std::max(0.0f, diffuseColor.y); 130 diffuseColor.z = std::max(0.0f, diffuseColor.z); 131 132 specularColor.x = std::max(0.0f, specularColor.x); 133 specularColor.y = std::max(0.0f, specularColor.y); 134 specularColor.z = std::max(0.0f, specularColor.z); 135 } 136 137 private: 138 float4 position; // world-space, w == 1 (non-directional) 139 float3 direction; // world-space 140 float4 ambientColor; // RGB[A] 141 float4 diffuseColor; // RGB[A] 142 float4 specularColor; // RGB[A] 143 float3 intensityWeight; // x=ambientRGB, y=diffuseRGB, z=specularRGB 144 float3 attenuation; // x=constantAtt, y=linearAtt, z=quadraticAtt 145 146 float3 ambientDecayRate; // x=ambientR, y=ambientG, z=ambientB (per-frame decay of ambientColor) 147 float3 diffuseDecayRate; // x=diffuseR, y=diffuseG, z=diffuseB (per-frame decay of diffuseColor) 148 float3 specularDecayRate; // x=specularR, y=specularG, z=specularB (per-frame decay of specularColor) 149 float3 decayFunctionType; // x=ambientDT, y=diffuseDT, z=specularDT (0.0f=linear, 1.0f=exponential) 150 151 float radius; // elmos 152 float fov; // degrees ([0.0 - 90.0] or 180.0) 153 154 bool ignoreLOS; // if true, we can be seen out of LOS 155 156 unsigned int id; // GL_LIGHT[id] we are bound to 157 unsigned int ttl; // maximum lifetime in sim-frames 158 unsigned int relTime; // current lifetime in sim-frames 159 unsigned int absTime; // current sim-frame this light is at 160 unsigned int priority; 161 162 const float3* trackPosition; 163 const float3* trackDirection; 164 }; 165 } 166 167 #endif // _GL_LIGHT_H 168