rev |
line source |
nuclear@0
|
1 #ifndef _LIGHTS_H_
|
nuclear@0
|
2 #define _LIGHTS_H_
|
nuclear@0
|
3
|
nuclear@0
|
4 #include <string>
|
nuclear@0
|
5 #include "switches.h"
|
nuclear@0
|
6 #include "n3dmath.h"
|
nuclear@0
|
7 #include "3dengine.h"
|
nuclear@0
|
8
|
nuclear@0
|
9 enum LightType {
|
nuclear@0
|
10 LTDir = D3DLIGHT_DIRECTIONAL,
|
nuclear@0
|
11 LTSpot = D3DLIGHT_SPOT,
|
nuclear@0
|
12 LTPoint = D3DLIGHT_POINT
|
nuclear@0
|
13 };
|
nuclear@0
|
14
|
nuclear@0
|
15 /////////////////////////////////////////////////////////////////////
|
nuclear@0
|
16 // -- Abstract Base class Light -- //
|
nuclear@0
|
17 // pure virtual functions for every possible light parameter, //
|
nuclear@0
|
18 // implement non-applicable functions as private in each subclass. //
|
nuclear@0
|
19 /////////////////////////////////////////////////////////////////////
|
nuclear@0
|
20
|
nuclear@0
|
21 class Light {
|
nuclear@0
|
22 protected:
|
nuclear@0
|
23 float intensity;
|
nuclear@0
|
24 Color ambient_color, diffuse_color, specular_color;
|
nuclear@0
|
25 bool CastShadows;
|
nuclear@0
|
26
|
nuclear@0
|
27 public:
|
nuclear@0
|
28 std::string name;
|
nuclear@0
|
29
|
nuclear@0
|
30 Light();
|
nuclear@0
|
31
|
nuclear@0
|
32 // set parameters
|
nuclear@0
|
33 virtual void SetPosition(const Vector3 &pos) = 0;
|
nuclear@0
|
34 virtual void SetDirection(const Vector3 &dir) = 0;
|
nuclear@0
|
35 virtual void SetColor(const Color &color, PhongComponent comp = (PhongComponent)-1);
|
nuclear@0
|
36 virtual void SetIntensity(float intensity);
|
nuclear@0
|
37 virtual void SetRange(float range) = 0;
|
nuclear@0
|
38 virtual void SetAttenuation(float att0, float att1, float att2) = 0;
|
nuclear@0
|
39 virtual void SetShadowCasting(bool enable);
|
nuclear@0
|
40
|
nuclear@0
|
41 // get parameters
|
nuclear@0
|
42 virtual Vector3 GetPosition() const = 0;
|
nuclear@0
|
43 virtual Vector3 GetDirection() const = 0;
|
nuclear@0
|
44 virtual const Color &GetColor(PhongComponent comp = Diffuse) const;
|
nuclear@0
|
45 virtual float GetIntensity() const;
|
nuclear@0
|
46 virtual float GetRange() const = 0;
|
nuclear@0
|
47 virtual float GetAttenuation(int degree) const = 0;
|
nuclear@0
|
48 virtual bool GetShadowCasting() const;
|
nuclear@0
|
49
|
nuclear@0
|
50 virtual LightType GetType() const = 0;
|
nuclear@0
|
51
|
nuclear@0
|
52 virtual void SetCone(float InnerCone, float OuterCone) = 0;
|
nuclear@0
|
53 virtual float GetInnerCone() const = 0;
|
nuclear@0
|
54 virtual float GetOuterCone() const = 0;
|
nuclear@0
|
55
|
nuclear@0
|
56 virtual void SetFalloff(float falloff) = 0;
|
nuclear@0
|
57 virtual float GetFalloff() const = 0;
|
nuclear@0
|
58
|
nuclear@0
|
59 // position transformations
|
nuclear@0
|
60 virtual void ResetTransform() = 0;
|
nuclear@0
|
61 virtual void ResetTranslation() = 0;
|
nuclear@0
|
62 virtual void ResetRotation() = 0;
|
nuclear@0
|
63
|
nuclear@0
|
64 virtual void Transform(const Matrix4x4 &matrix) = 0;
|
nuclear@0
|
65 virtual void Translate(float x, float y, float z) = 0;
|
nuclear@0
|
66 virtual void Rotate(float x, float y, float z) = 0;
|
nuclear@0
|
67 virtual void Rotate(const Vector3 &axis, float angle) = 0;
|
nuclear@0
|
68
|
nuclear@0
|
69 // direction transformations
|
nuclear@0
|
70 virtual void ResetDirTransform() = 0;
|
nuclear@0
|
71 virtual void ResetDirRotation() = 0;
|
nuclear@0
|
72
|
nuclear@0
|
73 virtual void TransformDir(const Matrix4x4 &matrix) = 0;
|
nuclear@0
|
74 virtual void RotateDir(float x, float y, float z) = 0;
|
nuclear@0
|
75 virtual void RotateDir(const Vector3 &axis, float angle) = 0;
|
nuclear@0
|
76
|
nuclear@0
|
77 // target transformations
|
nuclear@0
|
78 virtual void ResetTargetTransform() = 0;
|
nuclear@0
|
79 virtual void ResetTargetTranslation() = 0;
|
nuclear@0
|
80 virtual void ResetTargetRotation() = 0;
|
nuclear@0
|
81 virtual void TargetTransform(const Matrix4x4 &matrix) = 0;
|
nuclear@0
|
82 virtual void TargetTranslate(float x, float y, float z) = 0;
|
nuclear@0
|
83 virtual void TargetRotate(float x, float y, float z) = 0;
|
nuclear@0
|
84 virtual void TargetRotate(const Vector3 &axis, float angle) = 0;
|
nuclear@0
|
85
|
nuclear@0
|
86 virtual void SetLight(dword index, GraphicsContext *gc) const = 0;
|
nuclear@0
|
87
|
nuclear@0
|
88 virtual void Draw(GraphicsContext *gc, float size = 1.0f) = 0;
|
nuclear@0
|
89 };
|
nuclear@0
|
90
|
nuclear@0
|
91 // Directional Light
|
nuclear@0
|
92 class DirLight : public Light {
|
nuclear@0
|
93 private:
|
nuclear@0
|
94 // Non-Applicable functions for this type of light
|
nuclear@0
|
95 virtual void SetPosition(const Vector3 &pos);
|
nuclear@0
|
96 virtual void SetRange(float range);
|
nuclear@0
|
97 virtual void SetAttenuation(float att0, float att1, float att2);
|
nuclear@0
|
98 virtual Vector3 GetPosition() const;
|
nuclear@0
|
99 virtual float GetRange() const;
|
nuclear@0
|
100 virtual float GetAttenuation(int degree) const;
|
nuclear@0
|
101 virtual void ResetTransform();
|
nuclear@0
|
102 virtual void ResetTranslation();
|
nuclear@0
|
103 virtual void ResetRotation();
|
nuclear@0
|
104 virtual void Transform(const Matrix4x4 &matrix);
|
nuclear@0
|
105 virtual void Translate(float x, float y, float z);
|
nuclear@0
|
106 virtual void Rotate(float x, float y, float z);
|
nuclear@0
|
107 virtual void Rotate(const Vector3 &axis, float angle);
|
nuclear@0
|
108 virtual void ResetTargetTransform();
|
nuclear@0
|
109 virtual void ResetTargetTranslation();
|
nuclear@0
|
110 virtual void ResetTargetRotation();
|
nuclear@0
|
111 virtual void TargetTransform(const Matrix4x4 &matrix);
|
nuclear@0
|
112 virtual void TargetTranslate(float x, float y, float z);
|
nuclear@0
|
113 virtual void TargetRotate(float x, float y, float z);
|
nuclear@0
|
114 virtual void TargetRotate(const Vector3 &axis, float angle);
|
nuclear@0
|
115 virtual void SetCone(float InnerCone, float OuterCone);
|
nuclear@0
|
116 virtual float GetInnerCone() const;
|
nuclear@0
|
117 virtual float GetOuterCone() const;
|
nuclear@0
|
118 virtual void SetFalloff(float falloff);
|
nuclear@0
|
119 virtual float GetFalloff() const;
|
nuclear@0
|
120
|
nuclear@0
|
121
|
nuclear@0
|
122 protected:
|
nuclear@0
|
123 Vector3 Direction;
|
nuclear@0
|
124 Matrix4x4 DirRot;
|
nuclear@0
|
125
|
nuclear@0
|
126 public:
|
nuclear@0
|
127 DirLight();
|
nuclear@0
|
128 DirLight(const Vector3 &dir);
|
nuclear@0
|
129
|
nuclear@0
|
130 // accessors
|
nuclear@0
|
131 virtual void SetDirection(const Vector3 &dir);
|
nuclear@0
|
132 virtual Vector3 GetDirection() const;
|
nuclear@0
|
133
|
nuclear@0
|
134 virtual LightType GetType() const;
|
nuclear@0
|
135
|
nuclear@0
|
136 // direction transformations
|
nuclear@0
|
137 virtual void ResetDirTransform();
|
nuclear@0
|
138 virtual void ResetDirRotation();
|
nuclear@0
|
139
|
nuclear@0
|
140 virtual void TransformDir(const Matrix4x4 &matrix);
|
nuclear@0
|
141 virtual void RotateDir(float x, float y, float z);
|
nuclear@0
|
142 virtual void RotateDir(const Vector3 &axis, float angle);
|
nuclear@0
|
143
|
nuclear@0
|
144 virtual void SetLight(dword index, GraphicsContext *gc) const;
|
nuclear@0
|
145
|
nuclear@0
|
146 virtual void Draw(GraphicsContext *gc, float size = 1.0f);
|
nuclear@0
|
147 };
|
nuclear@0
|
148
|
nuclear@0
|
149 // Point Light (omni)
|
nuclear@0
|
150 class PointLight : public Light {
|
nuclear@0
|
151 private:
|
nuclear@0
|
152 // Non-Applicable member functions
|
nuclear@0
|
153 virtual void SetDirection(const Vector3 &dir);
|
nuclear@0
|
154 virtual Vector3 GetDirection() const;
|
nuclear@0
|
155 virtual void ResetDirTransform();
|
nuclear@0
|
156 virtual void ResetDirRotation();
|
nuclear@0
|
157 virtual void TransformDir(const Matrix4x4 &matrix);
|
nuclear@0
|
158 virtual void RotateDir(float x, float y, float z);
|
nuclear@0
|
159 virtual void RotateDir(const Vector3 &axis, float angle);
|
nuclear@0
|
160 virtual void ResetTargetTransform();
|
nuclear@0
|
161 virtual void ResetTargetTranslation();
|
nuclear@0
|
162 virtual void ResetTargetRotation();
|
nuclear@0
|
163 virtual void TargetTransform(const Matrix4x4 &matrix);
|
nuclear@0
|
164 virtual void TargetTranslate(float x, float y, float z);
|
nuclear@0
|
165 virtual void TargetRotate(float x, float y, float z);
|
nuclear@0
|
166 virtual void TargetRotate(const Vector3 &axis, float angle);
|
nuclear@0
|
167 virtual void SetCone(float InnerCone, float OuterCone);
|
nuclear@0
|
168 virtual float GetInnerCone() const;
|
nuclear@0
|
169 virtual float GetOuterCone() const;
|
nuclear@0
|
170 virtual void SetFalloff(float falloff);
|
nuclear@0
|
171 virtual float GetFalloff() const;
|
nuclear@0
|
172
|
nuclear@0
|
173 protected:
|
nuclear@0
|
174 Vector3 Position;
|
nuclear@0
|
175 float Range;
|
nuclear@0
|
176 float Attenuation[3];
|
nuclear@0
|
177
|
nuclear@0
|
178 Matrix4x4 PosRot, PosTrans, PosXForm;
|
nuclear@0
|
179
|
nuclear@0
|
180 virtual Matrix4x4 GetTransform() const;
|
nuclear@0
|
181
|
nuclear@0
|
182 public:
|
nuclear@0
|
183 PointLight();
|
nuclear@0
|
184 PointLight(const Vector3 &pos, float range = 1000.0f, float att0 = 1.0f, float att1 = 0.0f, float att2 = 0.0f);
|
nuclear@0
|
185
|
nuclear@0
|
186 // accessors
|
nuclear@0
|
187 virtual void SetPosition(const Vector3 &pos);
|
nuclear@0
|
188 virtual void SetRange(float range);
|
nuclear@0
|
189 virtual void SetAttenuation(float att0, float att1, float att2);
|
nuclear@0
|
190
|
nuclear@0
|
191 virtual Vector3 GetPosition() const;
|
nuclear@0
|
192 virtual float GetRange() const;
|
nuclear@0
|
193 virtual float GetAttenuation(int degree) const;
|
nuclear@0
|
194
|
nuclear@0
|
195 virtual LightType GetType() const;
|
nuclear@0
|
196
|
nuclear@0
|
197 // position transformations
|
nuclear@0
|
198 virtual void ResetTransform();
|
nuclear@0
|
199 virtual void ResetTranslation();
|
nuclear@0
|
200 virtual void ResetRotation();
|
nuclear@0
|
201
|
nuclear@0
|
202 virtual void Transform(const Matrix4x4 &matrix);
|
nuclear@0
|
203 virtual void Translate(float x, float y, float z);
|
nuclear@0
|
204 virtual void Rotate(float x, float y, float z);
|
nuclear@0
|
205 virtual void Rotate(const Vector3 &axis, float angle);
|
nuclear@0
|
206
|
nuclear@0
|
207 virtual void SetLight(dword index, GraphicsContext *gc) const;
|
nuclear@0
|
208
|
nuclear@0
|
209 virtual void Draw(GraphicsContext *gc, float size = 100.0f);
|
nuclear@0
|
210 };
|
nuclear@0
|
211
|
nuclear@0
|
212 // Spotlight
|
nuclear@0
|
213 class SpotLight : public PointLight {
|
nuclear@0
|
214 private:
|
nuclear@0
|
215 virtual void ResetTargetTransform();
|
nuclear@0
|
216 virtual void ResetTargetTranslation();
|
nuclear@0
|
217 virtual void ResetTargetRotation();
|
nuclear@0
|
218 virtual void TargetTransform(const Matrix4x4 &matrix);
|
nuclear@0
|
219 virtual void TargetTranslate(float x, float y, float z);
|
nuclear@0
|
220 virtual void TargetRotate(float x, float y, float z);
|
nuclear@0
|
221 virtual void TargetRotate(const Vector3 &axis, float angle);
|
nuclear@0
|
222
|
nuclear@0
|
223 protected:
|
nuclear@0
|
224 Vector3 Direction;
|
nuclear@0
|
225 Matrix4x4 DirRot;
|
nuclear@0
|
226
|
nuclear@0
|
227 float Falloff;
|
nuclear@0
|
228 float Theta, Phi;
|
nuclear@0
|
229
|
nuclear@0
|
230 public:
|
nuclear@0
|
231 SpotLight();
|
nuclear@0
|
232 SpotLight(const Vector3 &pos, const Vector3 &dir, float InnerCone, float OuterCone, float range = 1000.0f, float att0 = 1.0f, float att1 = 0.0f, float att2 = 0.0f);
|
nuclear@0
|
233
|
nuclear@0
|
234 // accessors
|
nuclear@0
|
235 virtual void SetDirection(const Vector3 &dir);
|
nuclear@0
|
236 virtual Vector3 GetDirection() const;
|
nuclear@0
|
237
|
nuclear@0
|
238 // direction transformations
|
nuclear@0
|
239 virtual void ResetDirTransform();
|
nuclear@0
|
240 virtual void ResetDirRotation();
|
nuclear@0
|
241
|
nuclear@0
|
242 virtual void TransformDir(const Matrix4x4 &matrix);
|
nuclear@0
|
243 virtual void RotateDir(float x, float y, float z);
|
nuclear@0
|
244 virtual void RotateDir(const Vector3 &axis, float angle);
|
nuclear@0
|
245
|
nuclear@0
|
246 virtual LightType GetType() const;
|
nuclear@0
|
247
|
nuclear@0
|
248 virtual void SetCone(float InnerCone, float OuterCone);
|
nuclear@0
|
249 virtual float GetInnerCone() const;
|
nuclear@0
|
250 virtual float GetOuterCone() const;
|
nuclear@0
|
251
|
nuclear@0
|
252 virtual void SetFalloff(float falloff);
|
nuclear@0
|
253 virtual float GetFalloff() const;
|
nuclear@0
|
254
|
nuclear@0
|
255 virtual void SetLight(dword index, GraphicsContext *gc) const;
|
nuclear@0
|
256
|
nuclear@0
|
257 virtual void Draw(GraphicsContext *gc, float size = 100.0f);
|
nuclear@0
|
258 };
|
nuclear@0
|
259
|
nuclear@0
|
260 class TargetSpotLight : public SpotLight {
|
nuclear@0
|
261 private:
|
nuclear@0
|
262 // Non-Applicable shit
|
nuclear@0
|
263 virtual void SetDirection(const Vector3 &dir);
|
nuclear@0
|
264 virtual Vector3 GetDirection() const;
|
nuclear@0
|
265 virtual void ResetDirTransform();
|
nuclear@0
|
266 virtual void ResetDirRotation();
|
nuclear@0
|
267 virtual void TransformDir(const Matrix4x4 &matrix);
|
nuclear@0
|
268 virtual void RotateDir(float x, float y, float z);
|
nuclear@0
|
269 virtual void RotateDir(const Vector3 &axis, float angle);
|
nuclear@0
|
270
|
nuclear@0
|
271 protected:
|
nuclear@0
|
272 Vector3 Target;
|
nuclear@0
|
273 Matrix4x4 TargRot, TargTrans, TargXForm;
|
nuclear@0
|
274
|
nuclear@0
|
275 virtual Matrix4x4 GetTargetTransform() const;
|
nuclear@0
|
276
|
nuclear@0
|
277 public:
|
nuclear@0
|
278
|
nuclear@0
|
279 TargetSpotLight();
|
nuclear@0
|
280 TargetSpotLight(const Vector3 &pos, const Vector3 &target, float InnerCone, float OuterCone, float range = 1000.0f, float att0 = 1.0f, float att1 = 0.0f, float att2 = 0.0f);
|
nuclear@0
|
281
|
nuclear@0
|
282 virtual void ResetTargetTransform();
|
nuclear@0
|
283 virtual void ResetTargetTranslation();
|
nuclear@0
|
284 virtual void ResetTargetRotation();
|
nuclear@0
|
285
|
nuclear@0
|
286 virtual void TargetTransform(const Matrix4x4 &matrix);
|
nuclear@0
|
287 virtual void TargetTranslate(float x, float y, float z);
|
nuclear@0
|
288 virtual void TargetRotate(float x, float y, float z);
|
nuclear@0
|
289 virtual void TargetRotate(const Vector3 &axis, float angle);
|
nuclear@0
|
290
|
nuclear@0
|
291 virtual void SetLight(dword index, GraphicsContext *gc) const;
|
nuclear@0
|
292
|
nuclear@0
|
293 virtual void Draw(GraphicsContext *gc, float size = 100.0f);
|
nuclear@0
|
294 };
|
nuclear@0
|
295
|
nuclear@0
|
296 #endif // _LIGHTS_H_ |