absence_thelab

annotate src/3deng/lights.h @ 0:1cffe3409164

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 23 Oct 2014 01:46:07 +0300
parents
children
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_