absence_thelab
diff 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 |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/3deng/lights.h Thu Oct 23 01:46:07 2014 +0300 1.3 @@ -0,0 +1,296 @@ 1.4 +#ifndef _LIGHTS_H_ 1.5 +#define _LIGHTS_H_ 1.6 + 1.7 +#include <string> 1.8 +#include "switches.h" 1.9 +#include "n3dmath.h" 1.10 +#include "3dengine.h" 1.11 + 1.12 +enum LightType { 1.13 + LTDir = D3DLIGHT_DIRECTIONAL, 1.14 + LTSpot = D3DLIGHT_SPOT, 1.15 + LTPoint = D3DLIGHT_POINT 1.16 +}; 1.17 + 1.18 +///////////////////////////////////////////////////////////////////// 1.19 +// -- Abstract Base class Light -- // 1.20 +// pure virtual functions for every possible light parameter, // 1.21 +// implement non-applicable functions as private in each subclass. // 1.22 +///////////////////////////////////////////////////////////////////// 1.23 + 1.24 +class Light { 1.25 +protected: 1.26 + float intensity; 1.27 + Color ambient_color, diffuse_color, specular_color; 1.28 + bool CastShadows; 1.29 + 1.30 +public: 1.31 + std::string name; 1.32 + 1.33 + Light(); 1.34 + 1.35 + // set parameters 1.36 + virtual void SetPosition(const Vector3 &pos) = 0; 1.37 + virtual void SetDirection(const Vector3 &dir) = 0; 1.38 + virtual void SetColor(const Color &color, PhongComponent comp = (PhongComponent)-1); 1.39 + virtual void SetIntensity(float intensity); 1.40 + virtual void SetRange(float range) = 0; 1.41 + virtual void SetAttenuation(float att0, float att1, float att2) = 0; 1.42 + virtual void SetShadowCasting(bool enable); 1.43 + 1.44 + // get parameters 1.45 + virtual Vector3 GetPosition() const = 0; 1.46 + virtual Vector3 GetDirection() const = 0; 1.47 + virtual const Color &GetColor(PhongComponent comp = Diffuse) const; 1.48 + virtual float GetIntensity() const; 1.49 + virtual float GetRange() const = 0; 1.50 + virtual float GetAttenuation(int degree) const = 0; 1.51 + virtual bool GetShadowCasting() const; 1.52 + 1.53 + virtual LightType GetType() const = 0; 1.54 + 1.55 + virtual void SetCone(float InnerCone, float OuterCone) = 0; 1.56 + virtual float GetInnerCone() const = 0; 1.57 + virtual float GetOuterCone() const = 0; 1.58 + 1.59 + virtual void SetFalloff(float falloff) = 0; 1.60 + virtual float GetFalloff() const = 0; 1.61 + 1.62 + // position transformations 1.63 + virtual void ResetTransform() = 0; 1.64 + virtual void ResetTranslation() = 0; 1.65 + virtual void ResetRotation() = 0; 1.66 + 1.67 + virtual void Transform(const Matrix4x4 &matrix) = 0; 1.68 + virtual void Translate(float x, float y, float z) = 0; 1.69 + virtual void Rotate(float x, float y, float z) = 0; 1.70 + virtual void Rotate(const Vector3 &axis, float angle) = 0; 1.71 + 1.72 + // direction transformations 1.73 + virtual void ResetDirTransform() = 0; 1.74 + virtual void ResetDirRotation() = 0; 1.75 + 1.76 + virtual void TransformDir(const Matrix4x4 &matrix) = 0; 1.77 + virtual void RotateDir(float x, float y, float z) = 0; 1.78 + virtual void RotateDir(const Vector3 &axis, float angle) = 0; 1.79 + 1.80 + // target transformations 1.81 + virtual void ResetTargetTransform() = 0; 1.82 + virtual void ResetTargetTranslation() = 0; 1.83 + virtual void ResetTargetRotation() = 0; 1.84 + virtual void TargetTransform(const Matrix4x4 &matrix) = 0; 1.85 + virtual void TargetTranslate(float x, float y, float z) = 0; 1.86 + virtual void TargetRotate(float x, float y, float z) = 0; 1.87 + virtual void TargetRotate(const Vector3 &axis, float angle) = 0; 1.88 + 1.89 + virtual void SetLight(dword index, GraphicsContext *gc) const = 0; 1.90 + 1.91 + virtual void Draw(GraphicsContext *gc, float size = 1.0f) = 0; 1.92 +}; 1.93 + 1.94 +// Directional Light 1.95 +class DirLight : public Light { 1.96 +private: 1.97 + // Non-Applicable functions for this type of light 1.98 + virtual void SetPosition(const Vector3 &pos); 1.99 + virtual void SetRange(float range); 1.100 + virtual void SetAttenuation(float att0, float att1, float att2); 1.101 + virtual Vector3 GetPosition() const; 1.102 + virtual float GetRange() const; 1.103 + virtual float GetAttenuation(int degree) const; 1.104 + virtual void ResetTransform(); 1.105 + virtual void ResetTranslation(); 1.106 + virtual void ResetRotation(); 1.107 + virtual void Transform(const Matrix4x4 &matrix); 1.108 + virtual void Translate(float x, float y, float z); 1.109 + virtual void Rotate(float x, float y, float z); 1.110 + virtual void Rotate(const Vector3 &axis, float angle); 1.111 + virtual void ResetTargetTransform(); 1.112 + virtual void ResetTargetTranslation(); 1.113 + virtual void ResetTargetRotation(); 1.114 + virtual void TargetTransform(const Matrix4x4 &matrix); 1.115 + virtual void TargetTranslate(float x, float y, float z); 1.116 + virtual void TargetRotate(float x, float y, float z); 1.117 + virtual void TargetRotate(const Vector3 &axis, float angle); 1.118 + virtual void SetCone(float InnerCone, float OuterCone); 1.119 + virtual float GetInnerCone() const; 1.120 + virtual float GetOuterCone() const; 1.121 + virtual void SetFalloff(float falloff); 1.122 + virtual float GetFalloff() const; 1.123 + 1.124 + 1.125 +protected: 1.126 + Vector3 Direction; 1.127 + Matrix4x4 DirRot; 1.128 + 1.129 +public: 1.130 + DirLight(); 1.131 + DirLight(const Vector3 &dir); 1.132 + 1.133 + // accessors 1.134 + virtual void SetDirection(const Vector3 &dir); 1.135 + virtual Vector3 GetDirection() const; 1.136 + 1.137 + virtual LightType GetType() const; 1.138 + 1.139 + // direction transformations 1.140 + virtual void ResetDirTransform(); 1.141 + virtual void ResetDirRotation(); 1.142 + 1.143 + virtual void TransformDir(const Matrix4x4 &matrix); 1.144 + virtual void RotateDir(float x, float y, float z); 1.145 + virtual void RotateDir(const Vector3 &axis, float angle); 1.146 + 1.147 + virtual void SetLight(dword index, GraphicsContext *gc) const; 1.148 + 1.149 + virtual void Draw(GraphicsContext *gc, float size = 1.0f); 1.150 +}; 1.151 + 1.152 +// Point Light (omni) 1.153 +class PointLight : public Light { 1.154 +private: 1.155 + // Non-Applicable member functions 1.156 + virtual void SetDirection(const Vector3 &dir); 1.157 + virtual Vector3 GetDirection() const; 1.158 + virtual void ResetDirTransform(); 1.159 + virtual void ResetDirRotation(); 1.160 + virtual void TransformDir(const Matrix4x4 &matrix); 1.161 + virtual void RotateDir(float x, float y, float z); 1.162 + virtual void RotateDir(const Vector3 &axis, float angle); 1.163 + virtual void ResetTargetTransform(); 1.164 + virtual void ResetTargetTranslation(); 1.165 + virtual void ResetTargetRotation(); 1.166 + virtual void TargetTransform(const Matrix4x4 &matrix); 1.167 + virtual void TargetTranslate(float x, float y, float z); 1.168 + virtual void TargetRotate(float x, float y, float z); 1.169 + virtual void TargetRotate(const Vector3 &axis, float angle); 1.170 + virtual void SetCone(float InnerCone, float OuterCone); 1.171 + virtual float GetInnerCone() const; 1.172 + virtual float GetOuterCone() const; 1.173 + virtual void SetFalloff(float falloff); 1.174 + virtual float GetFalloff() const; 1.175 + 1.176 +protected: 1.177 + Vector3 Position; 1.178 + float Range; 1.179 + float Attenuation[3]; 1.180 + 1.181 + Matrix4x4 PosRot, PosTrans, PosXForm; 1.182 + 1.183 + virtual Matrix4x4 GetTransform() const; 1.184 + 1.185 +public: 1.186 + PointLight(); 1.187 + PointLight(const Vector3 &pos, float range = 1000.0f, float att0 = 1.0f, float att1 = 0.0f, float att2 = 0.0f); 1.188 + 1.189 + // accessors 1.190 + virtual void SetPosition(const Vector3 &pos); 1.191 + virtual void SetRange(float range); 1.192 + virtual void SetAttenuation(float att0, float att1, float att2); 1.193 + 1.194 + virtual Vector3 GetPosition() const; 1.195 + virtual float GetRange() const; 1.196 + virtual float GetAttenuation(int degree) const; 1.197 + 1.198 + virtual LightType GetType() const; 1.199 + 1.200 + // position transformations 1.201 + virtual void ResetTransform(); 1.202 + virtual void ResetTranslation(); 1.203 + virtual void ResetRotation(); 1.204 + 1.205 + virtual void Transform(const Matrix4x4 &matrix); 1.206 + virtual void Translate(float x, float y, float z); 1.207 + virtual void Rotate(float x, float y, float z); 1.208 + virtual void Rotate(const Vector3 &axis, float angle); 1.209 + 1.210 + virtual void SetLight(dword index, GraphicsContext *gc) const; 1.211 + 1.212 + virtual void Draw(GraphicsContext *gc, float size = 100.0f); 1.213 +}; 1.214 + 1.215 +// Spotlight 1.216 +class SpotLight : public PointLight { 1.217 +private: 1.218 + virtual void ResetTargetTransform(); 1.219 + virtual void ResetTargetTranslation(); 1.220 + virtual void ResetTargetRotation(); 1.221 + virtual void TargetTransform(const Matrix4x4 &matrix); 1.222 + virtual void TargetTranslate(float x, float y, float z); 1.223 + virtual void TargetRotate(float x, float y, float z); 1.224 + virtual void TargetRotate(const Vector3 &axis, float angle); 1.225 + 1.226 +protected: 1.227 + Vector3 Direction; 1.228 + Matrix4x4 DirRot; 1.229 + 1.230 + float Falloff; 1.231 + float Theta, Phi; 1.232 + 1.233 +public: 1.234 + SpotLight(); 1.235 + 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); 1.236 + 1.237 + // accessors 1.238 + virtual void SetDirection(const Vector3 &dir); 1.239 + virtual Vector3 GetDirection() const; 1.240 + 1.241 + // direction transformations 1.242 + virtual void ResetDirTransform(); 1.243 + virtual void ResetDirRotation(); 1.244 + 1.245 + virtual void TransformDir(const Matrix4x4 &matrix); 1.246 + virtual void RotateDir(float x, float y, float z); 1.247 + virtual void RotateDir(const Vector3 &axis, float angle); 1.248 + 1.249 + virtual LightType GetType() const; 1.250 + 1.251 + virtual void SetCone(float InnerCone, float OuterCone); 1.252 + virtual float GetInnerCone() const; 1.253 + virtual float GetOuterCone() const; 1.254 + 1.255 + virtual void SetFalloff(float falloff); 1.256 + virtual float GetFalloff() const; 1.257 + 1.258 + virtual void SetLight(dword index, GraphicsContext *gc) const; 1.259 + 1.260 + virtual void Draw(GraphicsContext *gc, float size = 100.0f); 1.261 +}; 1.262 + 1.263 +class TargetSpotLight : public SpotLight { 1.264 +private: 1.265 + // Non-Applicable shit 1.266 + virtual void SetDirection(const Vector3 &dir); 1.267 + virtual Vector3 GetDirection() const; 1.268 + virtual void ResetDirTransform(); 1.269 + virtual void ResetDirRotation(); 1.270 + virtual void TransformDir(const Matrix4x4 &matrix); 1.271 + virtual void RotateDir(float x, float y, float z); 1.272 + virtual void RotateDir(const Vector3 &axis, float angle); 1.273 + 1.274 +protected: 1.275 + Vector3 Target; 1.276 + Matrix4x4 TargRot, TargTrans, TargXForm; 1.277 + 1.278 + virtual Matrix4x4 GetTargetTransform() const; 1.279 + 1.280 +public: 1.281 + 1.282 + TargetSpotLight(); 1.283 + 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); 1.284 + 1.285 + virtual void ResetTargetTransform(); 1.286 + virtual void ResetTargetTranslation(); 1.287 + virtual void ResetTargetRotation(); 1.288 + 1.289 + virtual void TargetTransform(const Matrix4x4 &matrix); 1.290 + virtual void TargetTranslate(float x, float y, float z); 1.291 + virtual void TargetRotate(float x, float y, float z); 1.292 + virtual void TargetRotate(const Vector3 &axis, float angle); 1.293 + 1.294 + virtual void SetLight(dword index, GraphicsContext *gc) const; 1.295 + 1.296 + virtual void Draw(GraphicsContext *gc, float size = 100.0f); 1.297 +}; 1.298 + 1.299 +#endif // _LIGHTS_H_ 1.300 \ No newline at end of file