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