absence_thelab

annotate src/common/n3dmath.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 _N3DMATH_H_
nuclear@0 2 #define _N3DMATH_H_
nuclear@0 3
nuclear@0 4 // - n3dmath.h -
nuclear@0 5 // Nuc3D 2 Header File
nuclear@0 6 // written by: John Tsiombikas (10 Sep 2002)
nuclear@0 7 // Last Modification: 14 April 2002
nuclear@0 8 // ---------------------------
nuclear@0 9 // Mathematical stuff
nuclear@0 10
nuclear@0 11 #include <iostream>
nuclear@0 12 #include <cmath>
nuclear@0 13
nuclear@0 14 #ifdef NUC3D_VER_DIRECT3D
nuclear@0 15 #include "d3d8.h" // Direct3D type definitions (D3DMATRIX)
nuclear@0 16 #endif //NUC3D_VER_DIRECT3D
nuclear@0 17
nuclear@0 18 // forward declarations
nuclear@0 19 class Matrix4x4;
nuclear@0 20 class Matrix3x3;
nuclear@0 21 class Vector3;
nuclear@0 22 class Vector2;
nuclear@0 23 class Vector4;
nuclear@0 24 class Quaternion;
nuclear@0 25
nuclear@0 26 // mathematical constants
nuclear@0 27 const float Pi = 3.1415926535897932f;
nuclear@0 28 const float TwoPi = 6.2831853071795865f;// Pi * 2.0f;
nuclear@0 29 const float HalfPi = 1.5707963267948965f; //Pi * 0.5f;
nuclear@0 30 const float QuarterPi = 0.7853981633974483f; //Pi * 0.25f;
nuclear@0 31 const float ThreeQuartersPi = 2.3561944901923450f; //QuarterPi * 3.0f;
nuclear@0 32
nuclear@0 33 const float XSmallNumber = 1.e-8f;
nuclear@0 34 const float SmallNumber = 1.e-4f;
nuclear@0 35
nuclear@0 36 // basis vectors
nuclear@0 37 #define VECTOR3_I (Vector3(1.0f, 0.0f, 0.0f))
nuclear@0 38 #define VECTOR3_J (Vector3(0.0f, 1.0f, 0.0f))
nuclear@0 39 #define VECTOR3_K (Vector3(0.0f, 0.0f, 1.0f))
nuclear@0 40
nuclear@0 41 #define VECTOR2_I (Vector2(1.0f, 0.0f))
nuclear@0 42 #define VECTOR2_J (Vector2(0.0f, 1.0f))
nuclear@0 43
nuclear@0 44 // angle conversion
nuclear@0 45 #define DEGTORAD(a) (Pi * (a) / 180)
nuclear@0 46 #define RADTODEG(a) ((a) * 180 / Pi)
nuclear@0 47
nuclear@0 48
nuclear@0 49
nuclear@0 50 // ------------- Vector3 class -------------
nuclear@0 51
nuclear@0 52 #ifdef NUC3D_VER_DIRECT3D // if we are using Direct3D version
nuclear@0 53
nuclear@0 54 class Vector3 : public D3DVECTOR {
nuclear@0 55 public:
nuclear@0 56
nuclear@0 57 #else // not D3D
nuclear@0 58
nuclear@0 59 class Vector3 {
nuclear@0 60 public:
nuclear@0 61 float x, y, z;
nuclear@0 62
nuclear@0 63 #endif //NUC3D_VER_DIRECT3D
nuclear@0 64
nuclear@0 65 Vector3();
nuclear@0 66 Vector3(float x, float y, float z);
nuclear@0 67
nuclear@0 68 inline float DotProduct(const Vector3 &vec) const;
nuclear@0 69 inline Vector3 CrossProduct(const Vector3 &vec) const;
nuclear@0 70
nuclear@0 71 inline Vector3 operator +(const Vector3 &vec) const;
nuclear@0 72 inline Vector3 operator -(const Vector3 &vec) const;
nuclear@0 73 inline Vector3 operator *(float scalar) const;
nuclear@0 74 inline Vector3 operator /(float scalar) const;
nuclear@0 75 inline void operator +=(const Vector3 &vec);
nuclear@0 76 inline void operator -=(const Vector3 &vec);
nuclear@0 77 inline void operator *=(float scalar);
nuclear@0 78 inline void operator /=(float scalar);
nuclear@0 79 inline Vector3 operator -() const; // unary minus for inversion
nuclear@0 80
nuclear@0 81 inline bool operator >(const Vector3 &vec) const;
nuclear@0 82 inline bool operator <(const Vector3 &vec) const;
nuclear@0 83 inline bool operator >(float len) const;
nuclear@0 84 inline bool operator <(float len) const;
nuclear@0 85 inline bool operator ==(const Vector3 &vec) const;
nuclear@0 86 inline bool operator ==(float len) const;
nuclear@0 87
nuclear@0 88 inline operator Vector2() const;
nuclear@0 89 inline operator Vector4() const;
nuclear@0 90
nuclear@0 91 inline float Length() const;
nuclear@0 92 inline float LengthSq() const;
nuclear@0 93
nuclear@0 94 inline void Normalize();
nuclear@0 95 inline Vector3 Normalized() const;
nuclear@0 96
nuclear@0 97 inline Vector3 Reflection(const Vector3 &normal) const;
nuclear@0 98 Vector3 Refraction(const Vector3 &normal, float FromIOR, float ToIOR) const;
nuclear@0 99
nuclear@0 100 void Transform(const Matrix4x4 &mat); // transform a vector using a transformation matrix
nuclear@0 101 void Transform(const Quaternion &quat); // transform by a quaternion
nuclear@0 102
nuclear@0 103 // Direct transformations on the vector
nuclear@0 104 void Translate(float x, float y, float z);
nuclear@0 105 void Rotate(float x, float y, float z);
nuclear@0 106 void Rotate(const Vector3 &axis, float angle);
nuclear@0 107 void Scale(float x, float y, float z);
nuclear@0 108
nuclear@0 109 float &operator [](int index);
nuclear@0 110
nuclear@0 111 friend std::ostream &operator <<(std::ostream &out, const Vector3 &vec);
nuclear@0 112 };
nuclear@0 113
nuclear@0 114 inline float DotProduct(const Vector3 &vec1, const Vector3 &vec2);
nuclear@0 115 inline Vector3 CrossProduct(const Vector3 &vec1, const Vector3 &vec2);
nuclear@0 116
nuclear@0 117 ////////////////////// 4-dimensional vectors ////////////////////////////
nuclear@0 118 class Vector4 {
nuclear@0 119 public:
nuclear@0 120 float x, y, z, w;
nuclear@0 121
nuclear@0 122 Vector4();
nuclear@0 123 Vector4(const Vector4 &vec);
nuclear@0 124 Vector4(const Vector3 &vec); // create from a 3 dimensional vector setting w=1
nuclear@0 125 Vector4(float x, float y, float z, float w);
nuclear@0 126
nuclear@0 127 float DotProduct(const Vector4 &vec) const;
nuclear@0 128 Vector4 CrossProduct(const Vector4 &vec1, const Vector4 &vec2) const;
nuclear@0 129
nuclear@0 130 Vector4 operator +(const Vector4 &vec) const;
nuclear@0 131 Vector4 operator -(const Vector4 &vec) const;
nuclear@0 132 Vector4 operator *(float scalar) const;
nuclear@0 133 Vector4 operator /(float scalar) const;
nuclear@0 134 void operator +=(const Vector4 &vec);
nuclear@0 135 void operator -=(const Vector4 &vec);
nuclear@0 136 void operator *=(float scalar);
nuclear@0 137 void operator /=(float scalar);
nuclear@0 138 Vector4 operator -() const; // unary minus for inversion
nuclear@0 139
nuclear@0 140 bool operator >(const Vector4 &vec) const;
nuclear@0 141 bool operator <(const Vector4 &vec) const;
nuclear@0 142 bool operator >(float len) const;
nuclear@0 143 bool operator <(float len) const;
nuclear@0 144 bool operator ==(const Vector4 &vec) const;
nuclear@0 145 bool operator ==(float len) const;
nuclear@0 146
nuclear@0 147 operator Vector3() const;
nuclear@0 148
nuclear@0 149 float Length() const;
nuclear@0 150 float LengthSq() const;
nuclear@0 151
nuclear@0 152 void Normalize();
nuclear@0 153 Vector4 Normalized() const;
nuclear@0 154
nuclear@0 155 void Transform(const Matrix4x4 &mat); // transform a vector using a transformation matrix
nuclear@0 156
nuclear@0 157 // Direct transformations on the vector
nuclear@0 158 void Translate(float x, float y, float z, float w);
nuclear@0 159 void Rotate(float x, float y, float z);
nuclear@0 160 void Rotate(const Vector3 &axis, float angle);
nuclear@0 161 void Scale(float x, float y, float z, float w);
nuclear@0 162
nuclear@0 163 float &operator [](int index);
nuclear@0 164
nuclear@0 165 friend std::ostream &operator <<(std::ostream &out, const Vector3 &vec);
nuclear@0 166 };
nuclear@0 167
nuclear@0 168 float DotProduct(const Vector4 &vec1, const Vector4 &vec2);
nuclear@0 169 Vector4 CrossProduct(const Vector4 &vec1, const Vector4 &vec2, const Vector4 &vec3);
nuclear@0 170
nuclear@0 171 ///////////////////////////
nuclear@0 172
nuclear@0 173 class Vector2 {
nuclear@0 174 public:
nuclear@0 175 float x, y;
nuclear@0 176
nuclear@0 177 Vector2();
nuclear@0 178 Vector2(const Vector2 &vec);
nuclear@0 179 Vector2(float x, float y);
nuclear@0 180
nuclear@0 181 float DotProduct(const Vector2 &vec) const;
nuclear@0 182 //Vector2 CrossProduct(const Vector2 &vec) const;
nuclear@0 183
nuclear@0 184 Vector2 operator +(const Vector2 &vec) const;
nuclear@0 185 Vector2 operator -(const Vector2 &vec) const;
nuclear@0 186 Vector2 operator *(float scalar) const;
nuclear@0 187 Vector2 operator /(float scalar) const;
nuclear@0 188 void operator +=(const Vector2 &vec);
nuclear@0 189 void operator -=(const Vector2 &vec);
nuclear@0 190 void operator *=(float scalar);
nuclear@0 191 void operator /=(float scalar);
nuclear@0 192 Vector2 operator -() const; // unary minus for inversion
nuclear@0 193
nuclear@0 194 bool operator >(const Vector2 &vec) const;
nuclear@0 195 bool operator <(const Vector2 &vec) const;
nuclear@0 196 bool operator >(float len) const;
nuclear@0 197 bool operator <(float len) const;
nuclear@0 198 bool operator ==(const Vector2 &vec) const;
nuclear@0 199 bool operator ==(float len) const;
nuclear@0 200
nuclear@0 201 operator Vector3() const;
nuclear@0 202
nuclear@0 203 float Length() const;
nuclear@0 204 float LengthSq() const;
nuclear@0 205
nuclear@0 206 void Normalize();
nuclear@0 207 Vector2 Normalized() const;
nuclear@0 208
nuclear@0 209 Vector2 Reflection(const Vector2 &normal) const;
nuclear@0 210 Vector2 Refraction(const Vector2 &normal, float FromIOR, float ToIOR) const;
nuclear@0 211
nuclear@0 212 void Transform(const Matrix3x3 &mat); // transform a vector using a transformation matrix
nuclear@0 213
nuclear@0 214 // Direct transformations on the vector
nuclear@0 215 void Translate(float x, float y);
nuclear@0 216 void Rotate(float angle);
nuclear@0 217 void Scale(float x, float y);
nuclear@0 218
nuclear@0 219 float &operator [](int index);
nuclear@0 220
nuclear@0 221 friend std::ostream &operator <<(std::ostream &out, const Vector2 &vec);
nuclear@0 222 };
nuclear@0 223
nuclear@0 224 float DotProduct(const Vector3 &vec1, const Vector3 &vec2);
nuclear@0 225
nuclear@0 226
nuclear@0 227 struct Vector2i {
nuclear@0 228 int x, y;
nuclear@0 229
nuclear@0 230 Vector2i(int x=0, int y=0) {this->x = x; this->y = y;}
nuclear@0 231 };
nuclear@0 232
nuclear@0 233
nuclear@0 234 ////////////////// Quaternion ///////////////////////
nuclear@0 235
nuclear@0 236 class Quaternion {
nuclear@0 237 public:
nuclear@0 238 float s;
nuclear@0 239 Vector3 v;
nuclear@0 240
nuclear@0 241 Quaternion();
nuclear@0 242 Quaternion(float s, const Vector3 &v);
nuclear@0 243 Quaternion(float s, float x, float y, float z);
nuclear@0 244
nuclear@0 245 Quaternion operator +(const Quaternion &quat) const;
nuclear@0 246 Quaternion operator -(const Quaternion &quat) const;
nuclear@0 247 Quaternion operator -() const;
nuclear@0 248 Quaternion operator *(const Quaternion &quat) const;
nuclear@0 249
nuclear@0 250 void operator +=(const Quaternion &quat);
nuclear@0 251 void operator -=(const Quaternion &quat);
nuclear@0 252 void operator *=(const Quaternion &quat);
nuclear@0 253
nuclear@0 254 void ResetIdentity();
nuclear@0 255
nuclear@0 256 Quaternion Conjugate() const;
nuclear@0 257
nuclear@0 258 float Length() const;
nuclear@0 259 float LengthSq() const;
nuclear@0 260
nuclear@0 261 void Normalize();
nuclear@0 262 Quaternion Normalized() const;
nuclear@0 263
nuclear@0 264 Quaternion Inverse() const;
nuclear@0 265
nuclear@0 266 void SetRotation(const Vector3 &axis, float angle);
nuclear@0 267 void Rotate(const Vector3 &axis, float angle);
nuclear@0 268
nuclear@0 269 Matrix3x3 GetRotationMatrix() const;
nuclear@0 270 };
nuclear@0 271
nuclear@0 272
nuclear@0 273
nuclear@0 274 ////////////////////////// Matrices //////////////////////////////
nuclear@0 275
nuclear@0 276 #ifdef NUC3D_VER_DIRECT3D // if we are using Direct3D version
nuclear@0 277
nuclear@0 278 class Matrix4x4 : public D3DMATRIX {
nuclear@0 279 public:
nuclear@0 280
nuclear@0 281 #else // Software or OpenGL version
nuclear@0 282
nuclear@0 283 class Matrix4x4 {
nuclear@0 284 public:
nuclear@0 285 float m[4][4];
nuclear@0 286
nuclear@0 287 #endif //NUC3D_VER_DIRECT3D
nuclear@0 288
nuclear@0 289 Matrix4x4();
nuclear@0 290 Matrix4x4(const Matrix4x4 &mat);
nuclear@0 291 Matrix4x4(const Matrix3x3 &mat);
nuclear@0 292 Matrix4x4( float m00, float m01, float m02, float m03,
nuclear@0 293 float m10, float m11, float m12, float m13,
nuclear@0 294 float m20, float m21, float m22, float m23,
nuclear@0 295 float m30, float m31, float m32, float m33 );
nuclear@0 296
nuclear@0 297 // basic operations on matrices
nuclear@0 298 Matrix4x4 operator +(const Matrix4x4 &mat) const;
nuclear@0 299 Matrix4x4 operator -(const Matrix4x4 &mat) const;
nuclear@0 300 Matrix4x4 operator *(const Matrix4x4 &mat) const;
nuclear@0 301 Matrix4x4 operator *(float scalar) const;
nuclear@0 302 void operator +=(const Matrix4x4 &mat);
nuclear@0 303 void operator -=(const Matrix4x4 &mat);
nuclear@0 304 void operator *=(const Matrix4x4 &mat);
nuclear@0 305 void operator *=(float scalar);
nuclear@0 306
nuclear@0 307 void ResetIdentity();
nuclear@0 308
nuclear@0 309 // concatenate various transformation matrices with our current matrix
nuclear@0 310 void Translate(float x, float y, float z);
nuclear@0 311 void Rotate(float x, float y, float z);
nuclear@0 312 void Rotate(const Vector3 &axis, float rads);
nuclear@0 313 void Scale(float x, float y, float z);
nuclear@0 314
nuclear@0 315 // set the matrix to a specific transformation matrix
nuclear@0 316 void SetTranslation(float x, float y, float z);
nuclear@0 317 void SetRotation(float x, float y, float z);
nuclear@0 318 void SetRotation(const Vector3 &axis, float angle);
nuclear@0 319 void SetScaling(float x, float y, float z);
nuclear@0 320
nuclear@0 321 // row and column accessors
nuclear@0 322 void SetColumnVector(const Vector4 &vec, int columnindex);
nuclear@0 323 void SetRowVector(const Vector4 &vec, int rowindex);
nuclear@0 324 Vector4 GetColumnVector(int columnindex) const;
nuclear@0 325 Vector4 GetRowVector(int rowindex) const;
nuclear@0 326
nuclear@0 327 // other operations on matrices
nuclear@0 328 void Transpose();
nuclear@0 329 Matrix4x4 Transposed() const;
nuclear@0 330
nuclear@0 331 float Determinant() const;
nuclear@0 332 Matrix4x4 Adjoint() const;
nuclear@0 333 Matrix4x4 Inverse() const;
nuclear@0 334 };
nuclear@0 335
nuclear@0 336
nuclear@0 337 ////////////////// Matrix3x3 //////////////////
nuclear@0 338 class Matrix3x3 {
nuclear@0 339 public:
nuclear@0 340 float m[3][3];
nuclear@0 341
nuclear@0 342 Matrix3x3();
nuclear@0 343 Matrix3x3(const Matrix3x3 &mat);
nuclear@0 344 Matrix3x3( float m00, float m01, float m02,
nuclear@0 345 float m10, float m11, float m12,
nuclear@0 346 float m20, float m21, float m22 );
nuclear@0 347
nuclear@0 348 // basic operations on matrices
nuclear@0 349 Matrix3x3 operator +(const Matrix3x3 &mat) const;
nuclear@0 350 Matrix3x3 operator -(const Matrix3x3 &mat) const;
nuclear@0 351 Matrix3x3 operator *(const Matrix3x3 &mat) const;
nuclear@0 352 Matrix3x3 operator *(float scalar) const;
nuclear@0 353 void operator +=(const Matrix3x3 &mat);
nuclear@0 354 void operator -=(const Matrix3x3 &mat);
nuclear@0 355 void operator *=(const Matrix3x3 &mat);
nuclear@0 356 void operator *=(float scalar);
nuclear@0 357
nuclear@0 358 void ResetIdentity();
nuclear@0 359
nuclear@0 360 // concatenate various transformation matrices with our current matrix
nuclear@0 361 void Translate(float x, float y);
nuclear@0 362 void Rotate(float angle);
nuclear@0 363 void Scale(float x, float y);
nuclear@0 364
nuclear@0 365 // set the matrix to a specific transformation matrix
nuclear@0 366 void SetTranslation(float x, float y);
nuclear@0 367 void SetRotation(float angle);
nuclear@0 368 void SetScaling(float x, float y);
nuclear@0 369
nuclear@0 370 // row and column accessors
nuclear@0 371 void SetColumnVector(const Vector3 &vec, int columnindex);
nuclear@0 372 void SetRowVector(const Vector3 &vec, int rowindex);
nuclear@0 373 Vector3 GetColumnVector(int columnindex) const;
nuclear@0 374 Vector3 GetRowVector(int rowindex) const;
nuclear@0 375
nuclear@0 376 // other operations on matrices
nuclear@0 377 void Transpose();
nuclear@0 378 Matrix3x3 Transposed() const;
nuclear@0 379
nuclear@0 380 void OrthoNormalize();
nuclear@0 381 Matrix3x3 OrthoNormalized();
nuclear@0 382
nuclear@0 383 //float Determinant() const; // NYI
nuclear@0 384 //Matrix3x3 Adjoint() const;
nuclear@0 385 //Matrix3x3 Inverse() const;
nuclear@0 386 };
nuclear@0 387
nuclear@0 388 ///////////////// ray /////////////////
nuclear@0 389
nuclear@0 390 class Ray {
nuclear@0 391 public:
nuclear@0 392 Vector3 Origin;
nuclear@0 393 Vector3 Direction;
nuclear@0 394 float Energy;
nuclear@0 395 float CurrentIOR;
nuclear@0 396
nuclear@0 397 Ray();
nuclear@0 398 Ray(const Vector3 &origin, const Vector3 &direction);
nuclear@0 399 };
nuclear@0 400
nuclear@0 401 // a coordinate system basis
nuclear@0 402 class Base {
nuclear@0 403 public:
nuclear@0 404 Vector3 i, j, k;
nuclear@0 405
nuclear@0 406 Base();
nuclear@0 407 Base(const Vector3 &i, const Vector3 &j, const Vector3 &k);
nuclear@0 408 Base(const Vector3 &dir, bool LeftHanded=true);
nuclear@0 409
nuclear@0 410 void Rotate(float x, float y, float z);
nuclear@0 411 void Rotate(const Vector3 &axis, float angle);
nuclear@0 412 void Rotate(const Matrix4x4 &mat);
nuclear@0 413 void Rotate(const Quaternion &quat);
nuclear@0 414
nuclear@0 415 Matrix3x3 CreateRotationMatrix() const;
nuclear@0 416 };
nuclear@0 417
nuclear@0 418
nuclear@0 419
nuclear@0 420 float frand(float range);
nuclear@0 421
nuclear@0 422
nuclear@0 423 #include "n3dmath.inl"
nuclear@0 424
nuclear@0 425 #endif // _N3DMATH_H_