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