TurtleBrains  0.3.1
High quality, portable, C++ framework for rapid 2D game development.
tb_matrix.h
1 
9 #ifndef _TurtleBrains_Matrix_h_
10 #define _TurtleBrains_Matrix_h_
11 
12 #include "tb_vector.h"
13 #include "../core/tb_error.h"
14 #include "../core/tb_defines.h"
15 
16 #include <cmath>
17 #include <cstring> //memcpy / memset
18 
19 //
20 // TODO: TIM: TurtleBrains: NOW:
21 // Matrix identity constant should be removed and replaced with Identity() constexpr static member fucntion.
22 // readup on constexpr
23 //
24 
25 namespace TurtleBrains
26 {
27  namespace Math
28  {
29  //Forward Declarations used in Matrix4 class.
30  class Matrix4;
31  Vector3* Vector3TransformCoord(Vector3* result, const Vector3* inputVector, const Matrix4* inputMatrix);
32  Vector3* Vector3TransformNormal(Vector3* result, const Vector3* inputVector, const Matrix4* inputMatrix);
33 
40  class Matrix3
41  {
42  public:
46  static Matrix3 Zero(void)
47  {
48  return Matrix3(
49  0.0f, 0.0f, 0.0f,
50  0.0f, 0.0f, 0.0f,
51  0.0f, 0.0f, 0.0f);
52  }
53 
58  static Matrix3 Identity(void)
59  {
60  return Matrix3(
61  1.0f, 0.0f, 0.0f,
62  0.0f, 1.0f, 0.0f,
63  0.0f, 0.0f, 1.0f);
64  }
65 
66  union
67  {
68  float mComponents[9];
69 
70 #if defined(tb_visual_cpp)
71 #pragma warning(push)
72 #pragma warning(disable: 4201)
73  struct { //May be deprecating!?
74  float m_f11; float m_f21; float m_f31;
75  float m_f12; float m_f22; float m_f32;
76  float m_f13; float m_f23; float m_f33;
77  };
78 #pragma warning(pop)
79 #else
80  struct { //May be deprecating!?
81  float m_f11; float m_f21; float m_f31;
82  float m_f12; float m_f22; float m_f32;
83  float m_f13; float m_f23; float m_f33;
84  };
85 #endif
86  };
87 
91  inline explicit Matrix3( float f11 = 0.0f, float f21 = 0.0f, float f31 = 0.0f,
92  float f12 = 0.0f, float f22 = 0.0f, float f32 = 0.0f,
93  float f13 = 0.0f, float f23 = 0.0f, float f33 = 0.0f)
94  {
95  //m_f11 = f11; m_f21 = f21; m_f31 = f31;
96  //m_f12 = f12; m_f22 = f22; m_f32 = f32;
97  //m_f13 = f13; m_f23 = f23; m_f33 = f33;
98 
99  mComponents[0] = f11; mComponents[1] = f21; mComponents[2] = f31;
100  mComponents[3] = f12; mComponents[4] = f22; mComponents[5] = f32;
101  mComponents[6] = f13; mComponents[7] = f23; mComponents[8] = f33;
102  }
103 
109  inline explicit Matrix3(const float * const componentArray)
110  {
111  memcpy(mComponents, componentArray, sizeof(float) * 9);
112  }
113 
120  inline explicit Matrix3(const SkipInitialization& fastAndStupid)
121  {
122  tb_unused(fastAndStupid);
123  }
124 
128  inline Matrix3(const Matrix3& other)
129  {
130  memcpy(mComponents, other.mComponents, sizeof(float) * 9);
131  }
132 
136  inline Matrix3& operator=(const Matrix3& other)
137  {
138  if (this != &other)
139  {
140  memcpy(mComponents, other.mComponents, sizeof(float) * 9);
141  }
142  return (*this);
143  }
144 
155  inline bool operator==(const Matrix3& other) const
156  {
157  for (size_t index(0); index < 9; ++index)
158  {
159  if (false == IsEqual(mComponents[index], other[index]))
160  {
161  return false;
162  }
163  }
164 
165  return true;
166  }
167 
173  inline bool operator!=(const Matrix3& other) const
174  {
175  for (size_t index(0); index < 9; ++index)
176  {
177  if (false == IsEqual(mComponents[index], other[index]))
178  {
179  return true;
180  }
181  }
182 
183  return false;
184  }
185 
190  inline const float& operator[](const size_t& index) const { return mComponents[index]; }
191 
197  inline float& operator[](const size_t& index) { return mComponents[index]; }
198 
203  inline const float& operator()(const size_t& column, const size_t& row) const { return mComponents[column + (row * 3)]; }
204 
210  inline float& operator()(const size_t& column, const size_t& row) { return mComponents[column + (row * 3)]; }
211 
216  inline const float& operator()(int column, int row) const { return mComponents[column + (row * 3)]; }
217 
223  inline float& operator()(int column, int row) { return mComponents[column + (row * 3)]; }
224 
232  inline operator float*(void) { return mComponents; }
233 
237  inline operator const float*(void) const { return mComponents; }
238 
246  inline Vector3* GetBasis(const size_t& basisIndex) { return (Vector3*)&mComponents[basisIndex * 3]; }
247 
255  inline const Vector3* GetBasis(const size_t& basisIndex) const { return (const Vector3*)&mComponents[basisIndex * 3]; }
256 
263  inline void SetBasis(const size_t& basisIndex, const Vector3 &basis) { *((Vector3*)&mComponents[basisIndex * 3]) = basis; }
264 
273  inline void SetBasis(const size_t& basisIndex, float basisX, float basisY, float basisZ)
274  {
275  mComponents[(basisIndex * 3) + 0] = basisX;
276  mComponents[(basisIndex * 3) + 1] = basisY;
277  mComponents[(basisIndex * 3) + 2] = basisZ;
278  }
279 
280 
281 #if defined(tb_with_math_operators)
282  inline Matrix3 operator*(float scalar) const
283  {
284  return Matrix3(
285  (*this)(0, 0) * scalar, (*this)(1, 0) * scalar, (*this)(2, 0) * scalar,
286  (*this)(0, 1) * scalar, (*this)(1, 1) * scalar, (*this)(2, 1) * scalar,
287  (*this)(0, 2) * scalar, (*this)(1, 2) * scalar, (*this)(2, 2) * scalar);
288  }
289 #endif /* tb_with_math_operators */
290 
291  };
292 
296 
297  class Matrix4;
298  Matrix4* MatrixComputeInverse(Matrix4* result, const Matrix4* input);
299 
304  class Matrix4
305  {
306  public:
307 
311  static Matrix4 Zero(void)
312  {
313  return Matrix4(
314  0.0f, 0.0f, 0.0f, 0.0f,
315  0.0f, 0.0f, 0.0f, 0.0f,
316  0.0f, 0.0f, 0.0f, 0.0f,
317  0.0f, 0.0f, 0.0f, 0.0f);
318  }
319 
324  static Matrix4 Identity(void)
325  {
326  return Matrix4(
327  1.0f, 0.0f, 0.0f, 0.0f,
328  0.0f, 1.0f, 0.0f, 0.0f,
329  0.0f, 0.0f, 1.0f, 0.0f,
330  0.0f, 0.0f, 0.0f, 1.0f);
331  }
332 
333  union
334  {
335  float mComponents[16];
336 
337 #if defined(tb_visual_cpp)
338 #pragma warning(push)
339 #pragma warning(disable: 4201)
340  struct { //May be deprecating!?
341  float m_f11; float m_f21; float m_f31; float m_f41;
342  float m_f12; float m_f22; float m_f32; float m_f42;
343  float m_f13; float m_f23; float m_f33; float m_f43;
344  float m_f14; float m_f24; float m_f34; float m_f44;
345  };
346 #pragma warning(pop)
347 #else
348  struct { //May be deprecating!?
349  float m_f11; float m_f21; float m_f31; float m_f41;
350  float m_f12; float m_f22; float m_f32; float m_f42;
351  float m_f13; float m_f23; float m_f33; float m_f43;
352  float m_f14; float m_f24; float m_f34; float m_f44;
353  };
354 #endif
355  };
356 
360  inline explicit Matrix4( float f11 = 0.0f, float f21 = 0.0f, float f31 = 0.0f, float f41 = 0.0f,
361  float f12 = 0.0f, float f22 = 0.0f, float f32 = 0.0f, float f42 = 0.0f,
362  float f13 = 0.0f, float f23 = 0.0f, float f33 = 0.0f, float f43 = 0.0f,
363  float f14 = 0.0f, float f24 = 0.0f, float f34 = 0.0f, float f44 = 0.0f)
364  {
365  //m_f11 = f11; m_f21 = f21; m_f31 = f31; m_f41 = f41;
366  //m_f12 = f12; m_f22 = f22; m_f32 = f32; m_f42 = f42;
367  //m_f13 = f13; m_f23 = f23; m_f33 = f33; m_f43 = f43;
368  //m_f14 = f14; m_f24 = f24; m_f34 = f34; m_f44 = f44;
369 
370  mComponents[0] = f11; mComponents[1] = f21; mComponents[2] = f31; mComponents[3] = f41;
371  mComponents[4] = f12; mComponents[5] = f22; mComponents[6] = f32; mComponents[7] = f42;
372  mComponents[8] = f13; mComponents[9] = f23; mComponents[10]= f33; mComponents[11]= f43;
373  mComponents[12]= f14; mComponents[13]= f24; mComponents[14]= f34; mComponents[15]= f44;
374  }
375 
381  inline explicit Matrix4(const float * const componentArray)
382  {
383  memcpy(mComponents, componentArray, sizeof(float) << 4); //Same as (sizeof(float) * 16)
384  }
385 
392  inline explicit Matrix4(const SkipInitialization& fastAndStupid)
393  {
394  tb_unused(fastAndStupid);
395  }
396 
400  inline Matrix4(const Matrix4& other)
401  {
402  memcpy(mComponents, other.mComponents, sizeof(float) << 4); //Same as (sizeof(float) * 16)
403  }
404 
408  inline Matrix4& operator=(const Matrix4& other)
409  {
410  if (this != &other)
411  {
412  memcpy(mComponents, other.mComponents, sizeof(float) << 4); //Same as (sizeof(float) * 16)
413  }
414  return (*this);
415  }
416 
427  inline bool operator==(const Matrix4& other) const
428  {
429  for (size_t index(0); index < 16; ++index)
430  {
431  if (false == IsEqual(mComponents[index], other[index]))
432  {
433  return false;
434  }
435  }
436 
437  return true;
438  }
439 
445  inline bool operator!=(const Matrix4& other) const
446  {
447  for (size_t index(0); index < 16; ++index)
448  {
449  if (false == IsEqual(mComponents[index], other[index]))
450  {
451  return true;
452  }
453  }
454 
455  return false;
456  }
457 
462  inline const float& operator[](const size_t& index) const { return mComponents[index]; }
463 
469  inline float& operator[](const size_t& index) { return mComponents[index]; }
470 
475  inline const float& operator()(const size_t& column, const size_t& row) const { return mComponents[column + (row << 2)]; }
476 
482  inline float& operator()(const size_t& column, const size_t& row) { return mComponents[column + (row << 2)]; }
483 
488  inline const float& operator()(int column, int row) const { return mComponents[column + (row << 2)]; }
489 
495  inline float& operator()(int column, int row) { return mComponents[column + (row << 2)]; }
496 
497 
505  inline operator float*(void) { return mComponents; }
506 
510  inline operator const float*(void) const { return mComponents; }
511 
512 
520  inline Vector3* GetBasis(const size_t& basisIndex) { return (Vector3*)&mComponents[basisIndex << 2]; }
521 
529  inline const Vector3* GetBasis(const size_t& basisIndex) const { return (const Vector3*)&mComponents[basisIndex<<2]; }
530 
537  inline void SetBasis(const size_t& basisIndex, const Vector3 &basis) { *((Vector3*)&mComponents[basisIndex<<2]) = basis; }
538 
547  inline void SetBasis(const size_t& basisIndex, float basisX, float basisY, float basisZ)
548  {
549  mComponents[(basisIndex<<2) + 0] = basisX;
550  mComponents[(basisIndex<<2) + 1] = basisY;
551  mComponents[(basisIndex<<2) + 2] = basisZ;
552  }
553 
554 #if defined(tb_with_math_operators)
555  inline Vector3 GetPosition(void) const
561  {
562  return Vector3((*this)(0, 3), (*this)(1, 3), (*this)(2, 3));
563  }
564 
569  inline void SetPosition(const Vector3& position)
570  {
571  (*this)(0, 3) = position.x;
572  (*this)(1, 3) = position.y;
573  (*this)(2, 3) = position.z;
574  }
575 
580  inline void SetPosition(float x, float y, float z)
581  {
582  (*this)(0, 3) = x;
583  (*this)(1, 3) = y;
584  (*this)(2, 3) = z;
585  }
586 
590  inline Matrix4 GetTransposed(void) const
591  {
592  //result->m_f11 = input->m_f11; result->m_f12 = input->m_f21; result->m_f13 = input->m_f31; result->m_f14 = input->m_f41;
593  //result->m_f21 = input->m_f12; result->m_f22 = input->m_f22; result->m_f23 = input->m_f32; result->m_f24 = input->m_f42;
594  //result->m_f31 = input->m_f13; result->m_f32 = input->m_f23; result->m_f33 = input->m_f33; result->m_f34 = input->m_f43;
595  //result->m_f41 = input->m_f14; result->m_f42 = input->m_f24; result->m_f43 = input->m_f34; result->m_f44 = input->m_f44;
596 
597  Matrix4 temp;
598  const Matrix4& self(*this);
599  temp(0, 0) = self(0, 0); temp(0, 1) = self(1, 0); temp(0, 2) = self(2, 0); temp(0, 3) = self(3, 0);
600  temp(1, 0) = self(0, 1); temp(1, 1) = self(1, 1); temp(1, 2) = self(2, 1); temp(1, 3) = self(3, 1);
601  temp(2, 0) = self(0, 2); temp(2, 1) = self(1, 2); temp(2, 2) = self(2, 2); temp(2, 3) = self(3, 2);
602  temp(3, 0) = self(0, 3); temp(3, 1) = self(1, 3); temp(3, 2) = self(2, 3); temp(3, 3) = self(3, 3);
603  return temp;
604  }
605 
611  inline Matrix4 ComputeInverse(void) const
612  {
613  Matrix4 temp;
614  MatrixComputeInverse(&temp, this);
615  return temp;
616  }
617 
622  inline Vector3 TransformCoordinate(const Vector3& inputVector) const
623  {
624  Vector3 result;
625  Vector3TransformCoord(&result, &inputVector, this);
626  return result;
627  }
628 
633  inline Vector3 TransformNormal(const Vector3& inputVector) const
634  {
635  Vector3 result;
636  Vector3TransformNormal(&result, &inputVector, this);
637  return result;
638  }
639 
640 #endif /* tb_with_math_operators */
641  };
642 
646 
653  {
654  *result = Matrix4::Identity();
655  return result;
656  }
657 
667  inline Matrix4* MatrixCreateFromForward(Matrix4* result, const Vector3* forward, const Vector3* up = nullptr)
668  {
669  tb_error("Not yet implemented / tested.");
670  MatrixCreateIdentity(result);
671 
672  Vector3 realUp((nullptr == up) ? Vector3(0.0f, 1.0f, 0.0f) : *up);
673  Vector3 right, finalUp;
674  Vector3CrossProduct(&right, &realUp, forward);
675  Vector3CrossProduct(&finalUp, &right, forward);
676  //TODO: TIM: Implementation: This would be useful, implement it for future usage!
677  return result;
678  }
679 
686  inline Matrix4* MatrixCreateTranslation(Matrix4* result, const Vector3* translation)
687  { //Changed September 19, 2010
688  MatrixCreateIdentity(result);
689  result->m_f14 = translation->x;//matR->m_f41 = vT->x;
690  result->m_f24 = translation->y;//matR->m_f42 = vT->y;
691  result->m_f34 = translation->z;//matR->m_f43 = vT->z;
692  return result;
693  }
694 
704  inline Matrix4* MatrixCreateTranslation(Matrix4* result, const float translationX, const float translationY, const float translationZ)
705  { //Changed September 19, 2010
706  MatrixCreateIdentity(result);
707  result->m_f14 = translationX;//matR->m_f41 = fX;
708  result->m_f24 = translationY;//matR->m_f42 = fY;
709  result->m_f34 = translationZ;//matR->m_f43 = fZ;
710  return result;
711  }
712 
720  inline Matrix4* MatrixCreateScale(Matrix4* result, const Vector3* scale)
721  {
722  memset(result->mComponents, 0, sizeof(float) << 4);
723  result->m_f11 = scale->x;
724  result->m_f22 = scale->y;
725  result->m_f33 = scale->z;
726  result->m_f44 = 1.0f;
727  return result;
728  }
729 
739  inline Matrix4* MatrixCreateScale(Matrix4* result, const float scaleX, const float scaleY, const float scaleZ)
740  {
741  memset(result->mComponents, 0, sizeof(float) << 4);
742  result->m_f11 = scaleX;
743  result->m_f22 = scaleY;
744  result->m_f33 = scaleZ;
745  result->m_f44 = 1.0f;
746  return result;
747  }
748 
756  inline Matrix4* MatrixCreateRotationX(Matrix4* result, const float rotationInDegrees)
757  {
758  const float rotationInRadians(tbMath::Convert::DegreesToRadians(rotationInDegrees));
759 
760  MatrixCreateIdentity(result);
761  result->m_f22 = cos(rotationInRadians);
762  result->m_f32 = -sin(rotationInRadians);
763  result->m_f23 = sin(rotationInRadians);
764  result->m_f33 = cos(rotationInRadians);
765  return result;
766  }
767 
775  inline Matrix4* MatrixCreateRotationY(Matrix4* result, const float rotationInDegrees)
776  {
777  const float rotationInRadians(tbMath::Convert::DegreesToRadians(rotationInDegrees));
778 
779  MatrixCreateIdentity(result);
780  result->m_f11 = cos(rotationInRadians);
781  result->m_f31 = sin(rotationInRadians);
782  result->m_f13 = -sin(rotationInRadians);
783  result->m_f33 = cos(rotationInRadians);
784  return result;
785  }
786 
794  inline Matrix4* MatrixCreateRotationZ(Matrix4* result, const float rotationInDegrees)
795  {
796  const float rotationInRadians(tbMath::Convert::DegreesToRadians(rotationInDegrees));
797 
798  MatrixCreateIdentity(result);
799  result->m_f11 = cos(rotationInRadians);
800  result->m_f21 = -sin(rotationInRadians);
801  result->m_f12 = sin(rotationInRadians);
802  result->m_f22 = cos(rotationInRadians);
803  return result;
804  }
805 
814  inline Matrix4* MatrixCreateRotationA(Matrix4* result, const Vector3* rotationAxis, const float rotationInDegrees)
815  {
816  const float rotationInRadians(tbMath::Convert::DegreesToRadians(rotationInDegrees));
817 
818  // Rotations.
819  const float s = sinf(rotationInRadians);
820  const float c = cosf(rotationInRadians);
821  const float t = 1.0f - c;
822 
823  float x = rotationAxis->x;
824  float y = rotationAxis->y;
825  float z = rotationAxis->z;
826 
827  const float tx = t * rotationAxis->x;
828  const float ty = t * rotationAxis->y;
829  const float tz = t * rotationAxis->z;
830  const float sx = s * rotationAxis->x;
831  const float sy = s * rotationAxis->y;
832  const float sz = s * rotationAxis->z;
833 
834  result->mComponents[0] = tx * x + c;
835  result->mComponents[1] = tx * y + sz;
836  result->mComponents[2] = tx * z - sy;
837  result->mComponents[3] = 0.0f;
838 
839  result->mComponents[4] = tx * y - sz;
840  result->mComponents[5] = ty * y + c;
841  result->mComponents[6] = ty * z + sx;
842  result->mComponents[7] = 0.0f;
843 
844  result->mComponents[8] = tx * z + sy;
845  result->mComponents[9] = ty * z - sx;
846  result->mComponents[10] = tz * z + c;
847  result->mComponents[11] = 0.0f;
848 
849  result->mComponents[12] = 0.0f;
850  result->mComponents[13] = 0.0f;
851  result->mComponents[14] = 0.0f;
852  result->mComponents[15] = 1.0f;
853 
854  return result;
855  }
856 
866  inline Matrix4* MatrixCreatePerspectiveRH(Matrix4* result, const float fieldOfView, const float aspectRatio,
867  const float nearPlane, const float farPlane)
868  {
869  memset(result->mComponents, 0, sizeof(float) << 4);
870 
871  const float f = 1.0f / tanf(fieldOfView / 2.0f);
872  result->m_f11 = f / aspectRatio;
873  result->m_f22 = f;
874  result->m_f33 = (farPlane) / (nearPlane - farPlane);
875  result->m_f43 = -1.0f;
876  result->m_f34 = (nearPlane * farPlane) / (nearPlane - farPlane);
877 
878  return result;
879  }
880 
890  inline Matrix4* MatrixCreatePerspectiveLH(Matrix4* result, const float fieldOfView, const float aspectRatio,
891  const float nearPlane, const float farPlane)
892  {
893  memset(result->mComponents, 0, sizeof(float) << 4);
894 
895  const float f = 1.0f / tanf(fieldOfView / 2.0f);
896  result->m_f11 = f / aspectRatio;
897  result->m_f22 = f;
898  result->m_f33 = (farPlane) / (farPlane - nearPlane);
899  result->m_f43 = 1.0f;
900  result->m_f34 = -(nearPlane * farPlane) / (farPlane - nearPlane);
901 
902  return result;
903  }
904 
920  inline Matrix4* MatrixCreateOrthoRH(Matrix4* result, const float width, const float height,
921  const float nearPlane, const float farPlane)
922  {
923  memset(result->mComponents, 0, sizeof(float) << 4);
924 
925  result->m_f11 = 2.0f / width;
926  result->m_f22 = 2.0f / height;
927  result->m_f33 = 1.0f / (nearPlane - farPlane);
928  result->m_f34 = nearPlane / (nearPlane - farPlane);
929  result->m_f44 = 1.0f;
930 
931  return result;
932  }
933 
949  inline Matrix4* MatrixCreateOrthoLH(Matrix4* result, const float width, const float height,
950  const float nearPlane, const float farPlane)
951  {
952  memset(result->mComponents, 0, sizeof(float) << 4);
953 
954  //matR->m_f11 = 2.0f / fWidth;
955  //matR->m_f22 = 2.0f / fHeight;
956  //matR->m_f33 = 1 / (fFar - fNear);
957  //matR->m_f34 = fNear / (fNear - fFar);
958  //matR->m_f44 = 1;
959 
960  result->m_f11 = 2.0f / width;
961  result->m_f22 = 2.0f / height;
962  result->m_f33 = 1.0f / (farPlane - nearPlane);
963  result->m_f34 = nearPlane / (nearPlane - farPlane);
964  result->m_f44 = 1.0f;
965 
966  return result;
967  }
968 
976  inline Matrix4* MatrixAdd(Matrix4 *result, const Matrix4 *leftSide, const Matrix4 *rightSide)
977  {
978  float *r = result->mComponents;
979  const float *m1 = leftSide->mComponents;
980  const float *m2 = rightSide->mComponents;
981 
982  r[0] = m1[0] + m2[0]; r[1] = m1[1] + m2[1]; r[2] = m1[2] + m2[2]; r[3] = m1[3] + m2[3];
983  r[4] = m1[4] + m2[4]; r[5] = m1[5] + m2[5]; r[6] = m1[6] + m2[6]; r[7] = m1[7] + m2[7];
984  r[8] = m1[8] + m2[8]; r[9] = m1[9] + m2[9]; r[10] = m1[10] + m2[10]; r[11] = m1[11] + m2[11];
985  r[12] = m1[12] + m2[12]; r[13] = m1[13] + m2[13]; r[14] = m1[14] + m2[14]; r[15] = m1[15] + m2[15];
986  return result;
987  }
988 
996  inline Matrix4* MatrixSubtract(Matrix4* result, const Matrix4* leftSide, const Matrix4* rightSide)
997  {
998  float *r = result->mComponents;
999  const float *m1 = leftSide->mComponents;
1000  const float *m2 = rightSide->mComponents;
1001 
1002  r[0] = m1[0] - m2[0]; r[1] = m1[1] - m2[1]; r[2] = m1[2] - m2[2]; r[3] = m1[3] - m2[3];
1003  r[4] = m1[4] - m2[4]; r[5] = m1[5] - m2[5]; r[6] = m1[6] - m2[6]; r[7] = m1[7] - m2[7];
1004  r[8] = m1[8] - m2[8]; r[9] = m1[9] - m2[9]; r[10] = m1[10] - m2[10]; r[11] = m1[11] - m2[11];
1005  r[12] = m1[12] - m2[12]; r[13] = m1[13] - m2[13]; r[14] = m1[14] - m2[14]; r[15] = m1[15] - m2[15];
1006  return result;
1007  }
1008 
1015  inline Matrix4* MatrixTranspose(Matrix4* result, const Matrix4* input)
1016  {
1017  tb_error_if(result == input, "tbExternalError: Invalid parameter; expected result to be different than input");
1018  result->m_f11 = input->m_f11; result->m_f12 = input->m_f21; result->m_f13 = input->m_f31; result->m_f14 = input->m_f41;
1019  result->m_f21 = input->m_f12; result->m_f22 = input->m_f22; result->m_f23 = input->m_f32; result->m_f24 = input->m_f42;
1020  result->m_f31 = input->m_f13; result->m_f32 = input->m_f23; result->m_f33 = input->m_f33; result->m_f34 = input->m_f43;
1021  result->m_f41 = input->m_f14; result->m_f42 = input->m_f24; result->m_f43 = input->m_f34; result->m_f44 = input->m_f44;
1022  return result;
1023  }
1024 
1035  inline Matrix4* MatrixMultiply(Matrix4* result, const Matrix4* leftSide, const Matrix4* rightSide)
1036  {
1037  tb_error_if(result == leftSide || result == rightSide, "tbExternalError: Invalid parameter; expected result to be different than leftSide and rightSide");
1038  result->m_f11 = (leftSide->m_f11 * rightSide->m_f11) + (leftSide->m_f21 * rightSide->m_f12) + (leftSide->m_f31 * rightSide->m_f13) + (leftSide->m_f41 * rightSide->m_f14);
1039  result->m_f21 = (leftSide->m_f11 * rightSide->m_f21) + (leftSide->m_f21 * rightSide->m_f22) + (leftSide->m_f31 * rightSide->m_f23) + (leftSide->m_f41 * rightSide->m_f24);
1040  result->m_f31 = (leftSide->m_f11 * rightSide->m_f31) + (leftSide->m_f21 * rightSide->m_f32) + (leftSide->m_f31 * rightSide->m_f33) + (leftSide->m_f41 * rightSide->m_f34);
1041  result->m_f41 = (leftSide->m_f11 * rightSide->m_f41) + (leftSide->m_f21 * rightSide->m_f42) + (leftSide->m_f31 * rightSide->m_f43) + (leftSide->m_f41 * rightSide->m_f44);
1042  result->m_f12 = (leftSide->m_f12 * rightSide->m_f11) + (leftSide->m_f22 * rightSide->m_f12) + (leftSide->m_f32 * rightSide->m_f13) + (leftSide->m_f42 * rightSide->m_f14);
1043  result->m_f22 = (leftSide->m_f12 * rightSide->m_f21) + (leftSide->m_f22 * rightSide->m_f22) + (leftSide->m_f32 * rightSide->m_f23) + (leftSide->m_f42 * rightSide->m_f24);
1044  result->m_f32 = (leftSide->m_f12 * rightSide->m_f31) + (leftSide->m_f22 * rightSide->m_f32) + (leftSide->m_f32 * rightSide->m_f33) + (leftSide->m_f42 * rightSide->m_f34);
1045  result->m_f42 = (leftSide->m_f12 * rightSide->m_f41) + (leftSide->m_f22 * rightSide->m_f42) + (leftSide->m_f32 * rightSide->m_f43) + (leftSide->m_f42 * rightSide->m_f44);
1046  result->m_f13 = (leftSide->m_f13 * rightSide->m_f11) + (leftSide->m_f23 * rightSide->m_f12) + (leftSide->m_f33 * rightSide->m_f13) + (leftSide->m_f43 * rightSide->m_f14);
1047  result->m_f23 = (leftSide->m_f13 * rightSide->m_f21) + (leftSide->m_f23 * rightSide->m_f22) + (leftSide->m_f33 * rightSide->m_f23) + (leftSide->m_f43 * rightSide->m_f24);
1048  result->m_f33 = (leftSide->m_f13 * rightSide->m_f31) + (leftSide->m_f23 * rightSide->m_f32) + (leftSide->m_f33 * rightSide->m_f33) + (leftSide->m_f43 * rightSide->m_f34);
1049  result->m_f43 = (leftSide->m_f13 * rightSide->m_f41) + (leftSide->m_f23 * rightSide->m_f42) + (leftSide->m_f33 * rightSide->m_f43) + (leftSide->m_f43 * rightSide->m_f44);
1050  result->m_f14 = (leftSide->m_f14 * rightSide->m_f11) + (leftSide->m_f24 * rightSide->m_f12) + (leftSide->m_f34 * rightSide->m_f13) + (leftSide->m_f44 * rightSide->m_f14);
1051  result->m_f24 = (leftSide->m_f14 * rightSide->m_f21) + (leftSide->m_f24 * rightSide->m_f22) + (leftSide->m_f34 * rightSide->m_f23) + (leftSide->m_f44 * rightSide->m_f24);
1052  result->m_f34 = (leftSide->m_f14 * rightSide->m_f31) + (leftSide->m_f24 * rightSide->m_f32) + (leftSide->m_f34 * rightSide->m_f33) + (leftSide->m_f44 * rightSide->m_f34);
1053  result->m_f44 = (leftSide->m_f14 * rightSide->m_f41) + (leftSide->m_f24 * rightSide->m_f42) + (leftSide->m_f34 * rightSide->m_f43) + (leftSide->m_f44 * rightSide->m_f44);
1054  return result;
1055  }
1056 
1066  inline Vector3* Vector3MatrixMultiply(Vector3* result, const Vector3* inputVector, const Matrix3* inputMatrix)
1067  {
1068  tb_error_if(result == inputVector, "tbExternalError: Invalid parameter; expected result to be different than inputVector.");
1069  result->x = (inputVector->x * inputMatrix->m_f11) + (inputVector->y * inputMatrix->m_f12) + (inputVector->z * inputMatrix->m_f13);
1070  result->y = (inputVector->x * inputMatrix->m_f21) + (inputVector->y * inputMatrix->m_f22) + (inputVector->z * inputMatrix->m_f23);
1071  result->z = (inputVector->x * inputMatrix->m_f31) + (inputVector->y * inputMatrix->m_f32) + (inputVector->z * inputMatrix->m_f33);
1072  return result;
1073  }
1074 
1084  inline Vector4* Vector4MatrixMultiply(Vector4* result, const Vector4* inputVector, const Matrix4* inputMatrix)
1085  {
1086  tb_error_if(result == inputVector , "tbExternalError: Invalid parameter; expected result to be different than inputVector.");
1087  result->x = (inputVector->x * inputMatrix->m_f11) + (inputVector->y * inputMatrix->m_f12) + (inputVector->z * inputMatrix->m_f13) + (inputVector->w * inputMatrix->m_f14);
1088  result->y = (inputVector->x * inputMatrix->m_f21) + (inputVector->y * inputMatrix->m_f22) + (inputVector->z * inputMatrix->m_f23) + (inputVector->w * inputMatrix->m_f24);
1089  result->z = (inputVector->x * inputMatrix->m_f31) + (inputVector->y * inputMatrix->m_f32) + (inputVector->z * inputMatrix->m_f33) + (inputVector->w * inputMatrix->m_f34);
1090  result->w = (inputVector->x * inputMatrix->m_f41) + (inputVector->y * inputMatrix->m_f42) + (inputVector->z * inputMatrix->m_f43) + (inputVector->w * inputMatrix->m_f44);
1091  return result;
1092  }
1093 
1104  inline Vector3* Vector3TransformCoord(Vector3* result, const Vector3* inputVector, const Matrix4* inputMatrix)
1105  {
1106  tb_error_if(result == inputVector, "tbExternalError: Invalid parameter; expected result to be different than inputVector");
1107  result->x = (inputVector->x * inputMatrix->m_f11) + (inputVector->y * inputMatrix->m_f12) + (inputVector->z * inputMatrix->m_f13) + inputMatrix->m_f14;
1108  result->y = (inputVector->x * inputMatrix->m_f21) + (inputVector->y * inputMatrix->m_f22) + (inputVector->z * inputMatrix->m_f23) + inputMatrix->m_f24;
1109  result->z = (inputVector->x * inputMatrix->m_f31) + (inputVector->y * inputMatrix->m_f32) + (inputVector->z * inputMatrix->m_f33) + inputMatrix->m_f34;
1110  return result;
1111  }
1112 
1123  inline Vector3* Vector3TransformNormal(Vector3* result, const Vector3* inputVector, const Matrix4* inputMatrix)
1124  {
1125  tb_error_if(result == inputVector, "tbExternalError: Invalid parameter; expected result to be different than inputVector");
1126  result->x = (inputVector->x * inputMatrix->m_f11) + (inputVector->y * inputMatrix->m_f12) + (inputVector->z * inputMatrix->m_f13);
1127  result->y = (inputVector->x * inputMatrix->m_f21) + (inputVector->y * inputMatrix->m_f22) + (inputVector->z * inputMatrix->m_f23);
1128  result->z = (inputVector->x * inputMatrix->m_f31) + (inputVector->y * inputMatrix->m_f32) + (inputVector->z * inputMatrix->m_f33);
1129  return result;
1130  }
1131 
1136  inline float Matrix3x3Determinant(const float f11, const float f12, const float f13, const float f21, const float f22, const float f23, const float f31, const float f32, const float f33)
1137  {
1138  return f11 * (f22 * f33 - f32 * f23) - f12 * (f21 * f33 - f31 * f23) + f13 * (f21 * f32 - f31 * f22);
1139  }
1140 
1145  inline float MatrixDeterminant(const Matrix4* input)
1146  {
1147  return input->m_f11 * Matrix3x3Determinant(input->m_f22, input->m_f32, input->m_f42, input->m_f23, input->m_f33, input->m_f43, input->m_f24, input->m_f34, input->m_f44) -
1148  input->m_f21 * Matrix3x3Determinant(input->m_f12, input->m_f32, input->m_f42, input->m_f13, input->m_f33, input->m_f43, input->m_f14, input->m_f34, input->m_f44) +
1149  input->m_f31 * Matrix3x3Determinant(input->m_f12, input->m_f22, input->m_f42, input->m_f13, input->m_f23, input->m_f43, input->m_f14, input->m_f24, input->m_f44) -
1150  input->m_f41 * Matrix3x3Determinant(input->m_f12, input->m_f22, input->m_f32, input->m_f13, input->m_f23, input->m_f33, input->m_f14, input->m_f24, input->m_f34);
1151  }
1152 
1164  inline Matrix4* MatrixComputeInverse(Matrix4* result, const Matrix4* input)
1165  {
1166  tb_error_if(result == input, "tbExternalError: Invalid parameter, expected result to be different than input.");
1167  const float determinant = MatrixDeterminant(input);
1168  if (true == IsZero(determinant))
1169  {
1170  *result = *input;
1171  return result;
1172  }
1173 
1174  const float inverseDeterminant = 1.0f / determinant;
1175 
1176  result->m_f11 = (Matrix3x3Determinant (input->m_f22, input->m_f32, input->m_f42, input->m_f23, input->m_f33, input->m_f43, input->m_f24, input->m_f34, input->m_f44)) * inverseDeterminant;
1177  result->m_f21 = (-Matrix3x3Determinant(input->m_f21, input->m_f31, input->m_f41, input->m_f23, input->m_f33, input->m_f43, input->m_f24, input->m_f34, input->m_f44)) * inverseDeterminant;
1178  result->m_f31 = (Matrix3x3Determinant (input->m_f21, input->m_f31, input->m_f41, input->m_f22, input->m_f32, input->m_f42, input->m_f24, input->m_f34, input->m_f44)) * inverseDeterminant;
1179  result->m_f41 = (-Matrix3x3Determinant(input->m_f21, input->m_f31, input->m_f41, input->m_f22, input->m_f32, input->m_f42, input->m_f23, input->m_f33, input->m_f43)) * inverseDeterminant;
1180  result->m_f12 = (-Matrix3x3Determinant(input->m_f12, input->m_f32, input->m_f42, input->m_f13, input->m_f33, input->m_f43, input->m_f14, input->m_f34, input->m_f44)) * inverseDeterminant;
1181  result->m_f22 = (Matrix3x3Determinant (input->m_f11, input->m_f31, input->m_f41, input->m_f13, input->m_f33, input->m_f43, input->m_f14, input->m_f34, input->m_f44)) * inverseDeterminant;
1182  result->m_f32 = (-Matrix3x3Determinant(input->m_f11, input->m_f31, input->m_f41, input->m_f12, input->m_f32, input->m_f42, input->m_f14, input->m_f34, input->m_f44)) * inverseDeterminant;
1183  result->m_f42 = (Matrix3x3Determinant (input->m_f11, input->m_f31, input->m_f41, input->m_f12, input->m_f32, input->m_f42, input->m_f13, input->m_f33, input->m_f43)) * inverseDeterminant;
1184  result->m_f13 = (Matrix3x3Determinant (input->m_f12, input->m_f22, input->m_f42, input->m_f13, input->m_f23, input->m_f43, input->m_f14, input->m_f24, input->m_f44)) * inverseDeterminant;
1185  result->m_f23 = (-Matrix3x3Determinant(input->m_f11, input->m_f21, input->m_f41, input->m_f13, input->m_f23, input->m_f43, input->m_f14, input->m_f24, input->m_f44)) * inverseDeterminant;
1186  result->m_f33 = (Matrix3x3Determinant (input->m_f11, input->m_f21, input->m_f41, input->m_f12, input->m_f22, input->m_f42, input->m_f14, input->m_f24, input->m_f44)) * inverseDeterminant;
1187  result->m_f43 = (-Matrix3x3Determinant(input->m_f11, input->m_f21, input->m_f41, input->m_f12, input->m_f22, input->m_f42, input->m_f13, input->m_f23, input->m_f43)) * inverseDeterminant;
1188  result->m_f14 = (-Matrix3x3Determinant(input->m_f12, input->m_f22, input->m_f32, input->m_f13, input->m_f23, input->m_f33, input->m_f14, input->m_f24, input->m_f34)) * inverseDeterminant;
1189  result->m_f24 = (Matrix3x3Determinant (input->m_f11, input->m_f21, input->m_f31, input->m_f13, input->m_f23, input->m_f33, input->m_f14, input->m_f24, input->m_f34)) * inverseDeterminant;
1190  result->m_f34 = (-Matrix3x3Determinant(input->m_f11, input->m_f21, input->m_f31, input->m_f12, input->m_f22, input->m_f32, input->m_f14, input->m_f24, input->m_f34)) * inverseDeterminant;
1191  result->m_f44 = (Matrix3x3Determinant (input->m_f11, input->m_f21, input->m_f31, input->m_f12, input->m_f22, input->m_f32, input->m_f13, input->m_f24, input->m_f33)) * inverseDeterminant;
1192 
1193  return result;
1194  }
1195 
1199  namespace Unstable {
1200  inline Matrix4* FastInverse(Matrix4* result, const Matrix4* input)
1201  {
1202  (*result)(0, 0) = (*input)(0, 0); //Diagonal is equal
1203  (*result)(1, 1) = (*input)(1, 1);
1204  (*result)(2, 2) = (*input)(2, 2);
1205  (*result)(3, 3) = (*input)(3, 3);
1206 
1207  (*result)(1, 0) = (*input)(0, 1); //Rotation is transposed
1208  (*result)(2, 0) = (*input)(0, 2);
1209  (*result)(0, 1) = (*input)(1, 0);
1210  (*result)(2, 1) = (*input)(1, 2);
1211  (*result)(0, 2) = (*input)(2, 0);
1212  (*result)(1, 2) = (*input)(2, 1);
1213 
1214  (*result)(3, 0) = -(*input)(3, 0); //Translation is negated
1215  (*result)(3, 1) = -(*input)(3, 1);
1216  (*result)(3, 2) = -(*input)(3, 2);
1217 
1218  (*result)(0, 3) = 0.0f;
1219  (*result)(1, 3) = 0.0f;
1220  (*result)(2, 3) = 0.0f;
1221 
1222  return result;
1223  }
1224  };
1225 
1226  namespace Unstable
1227  {
1228  inline Matrix4 Translate(const Matrix4& originalMatrix, const Vector3& translation)
1229  {
1230  Matrix4 outputMatrix(kSkipInitialization);
1231  Matrix4 translationMatrix(kSkipInitialization);
1232 
1233  MatrixCreateTranslation(&translationMatrix, &translation);
1234  const Matrix4 translationTransposed(translationMatrix.GetTransposed());
1235  MatrixMultiply(&outputMatrix, &originalMatrix, &translationTransposed);
1236 
1237  return outputMatrix;
1238  }
1239 
1240  inline Matrix4 Translate(const Matrix4& originalMatrix, float x, float y, float z)
1241  {
1242  return Translate(originalMatrix, tbMath::Vector3(x, y, z));
1243  }
1244 
1248  inline Matrix4 TranslateLocal(const Matrix4& originalMatrix, const Vector3& translation)
1249  {
1250  Matrix4 outputMatrix(kSkipInitialization);
1251  Matrix4 translationMatrix(kSkipInitialization);
1252 
1253  MatrixCreateTranslation(&translationMatrix, &translation);
1254  MatrixMultiply(&outputMatrix, &originalMatrix, &translationMatrix);
1255 
1256  return outputMatrix;
1257  }
1258 
1259  inline Matrix4 TranslateLocal(const Matrix4& originalMatrix, float x, float y, float z)
1260  {
1261  return TranslateLocal(originalMatrix, tbMath::Vector3(x, y, z));
1262  }
1263 
1264 
1268  inline Matrix4 Rotate(const Matrix4& originalMatrix, const Vector3& aroundAxis, const float rotationInDegrees)
1269  {
1270  Matrix4 outputMatrix(kSkipInitialization);
1271  Matrix4 rotationMatrix(kSkipInitialization);
1272 
1273  //Negating here for positive rotationInDegrees to spin clockwise around the axis.
1274  MatrixCreateRotationA(&rotationMatrix, &aroundAxis, -rotationInDegrees);
1275  //const Matrix4 rotationTransposed(rotationMatrix.GetTransposed());
1276  //MatrixMultiply(&outputMatrix, &originalMatrix, &rotationTransposed);
1277  MatrixMultiply(&outputMatrix, &originalMatrix, &rotationMatrix);
1278 
1279  return outputMatrix;
1280  }
1281 
1282  inline Matrix4 Rotate(const size_t& axisIndex, const Matrix4& originalMatrix, const float rotationInDegrees)
1283  {
1284  return Rotate(originalMatrix, *originalMatrix.GetBasis(axisIndex), rotationInDegrees);
1285  }
1286 
1287  inline Matrix4 RotateWorldSpace(const size_t& axisIndex, const Matrix4& originalMatrix, const float rotationInDegrees)
1288  {
1289  Matrix4 outputMatrix(kSkipInitialization);
1290  Matrix4 rotationMatrix(kSkipInitialization);
1291 
1292  //Negating here for positive rotationInDegrees to spin clockwise around the axis.
1293  MatrixCreateRotationA(&rotationMatrix, Matrix4::Identity().GetBasis(axisIndex), rotationInDegrees);
1294  const Matrix4 rotationTransposed(rotationMatrix.GetTransposed());
1295  MatrixMultiply(&outputMatrix, &originalMatrix, &rotationTransposed);
1296 
1297  return outputMatrix;
1298  }
1299 
1300  inline Matrix4 Scale(const Matrix4& originalMatrix, const Vector3& scale)
1301  {
1302  Matrix4 outputMatrix(kSkipInitialization);
1303  Matrix4 scalingMatrix(kSkipInitialization);
1304 
1305  MatrixCreateScale(&scalingMatrix, &scale);
1306  MatrixMultiply(&outputMatrix, &originalMatrix, &scalingMatrix);
1307 
1308  return outputMatrix;
1309  }
1310 
1311  inline Matrix4 Scale(const Matrix4& originalMatrix, float x, float y, float z)
1312  {
1313  return Scale(originalMatrix, Vector3(x, y, z));
1314  }
1315 
1316  }; /* namespace Unstable */
1317 
1318  }; /* namespace Math */
1319 }; /* namespace TurtleBrains */
1320 
1321 namespace tbMath = TurtleBrains::Math;
1322 
1323 #endif /* _TurtleBrains_Matrix_h_ */
Matrix4 * MatrixCreateOrthoLH(Matrix4 *result, const float width, const float height, const float nearPlane, const float farPlane)
Definition: tb_matrix.h:949
static Matrix4 Identity(void)
Definition: tb_matrix.h:324
Matrix4 * MatrixCreateOrthoRH(Matrix4 *result, const float width, const float height, const float nearPlane, const float farPlane)
Definition: tb_matrix.h:920
static Matrix3 Identity(void)
Definition: tb_matrix.h:58
Vector3 * Vector3MatrixMultiply(Vector3 *result, const Vector3 *inputVector, const Matrix3 *inputMatrix)
Definition: tb_matrix.h:1066
const float & operator()(int column, int row) const
Definition: tb_matrix.h:216
Contains objects and functions for dealing with Vector and Matrix math.
float MatrixDeterminant(const Matrix4 *input)
Definition: tb_matrix.h:1145
static Matrix4 Zero(void)
Definition: tb_matrix.h:311
#define tb_error(message,...)
Definition: tb_error.h:23
const float & operator()(const size_t &column, const size_t &row) const
Definition: tb_matrix.h:475
bool operator!=(const Matrix3 &other) const
Definition: tb_matrix.h:173
Definition: tb_vector.h:303
Matrix3(float f11=0.0f, float f21=0.0f, float f31=0.0f, float f12=0.0f, float f22=0.0f, float f32=0.0f, float f13=0.0f, float f23=0.0f, float f33=0.0f)
Definition: tb_matrix.h:91
Definition: tb_matrix.h:40
Matrix4 * MatrixCreateRotationY(Matrix4 *result, const float rotationInDegrees)
Definition: tb_matrix.h:775
float & operator()(int column, int row)
Definition: tb_matrix.h:495
Matrix4 ComputeInverse(void) const
Definition: tb_matrix.h:611
float Matrix3x3Determinant(const float f11, const float f12, const float f13, const float f21, const float f22, const float f23, const float f31, const float f32, const float f33)
Definition: tb_matrix.h:1136
Vector3 * Vector3TransformCoord(Vector3 *result, const Vector3 *inputVector, const Matrix4 *inputMatrix)
Definition: tb_matrix.h:1104
float & operator[](const size_t &index)
Definition: tb_matrix.h:197
Matrix4 * MatrixMultiply(Matrix4 *result, const Matrix4 *leftSide, const Matrix4 *rightSide)
Definition: tb_matrix.h:1035
Vector3 TransformNormal(const Vector3 &inputVector) const
Definition: tb_matrix.h:633
bool operator!=(const Matrix4 &other) const
Definition: tb_matrix.h:445
Here is some information about the primary namespace.
Definition: tb_application_dialog.h:21
Matrix4 * MatrixCreateTranslation(Matrix4 *result, const Vector3 *translation)
Definition: tb_matrix.h:686
Matrix4 * MatrixCreateRotationA(Matrix4 *result, const Vector3 *rotationAxis, const float rotationInDegrees)
Definition: tb_matrix.h:814
#define tb_unused(parameter)
Definition: tb_defines.h:19
Matrix4 * MatrixCreateScale(Matrix4 *result, const Vector3 *scale)
Definition: tb_matrix.h:720
const Vector3 * GetBasis(const size_t &basisIndex) const
Definition: tb_matrix.h:529
Definition: tb_matrix.h:304
SkipInitialization
Definition: tb_vector.h:29
float & operator[](const size_t &index)
Definition: tb_matrix.h:469
Matrix3(const Matrix3 &other)
Definition: tb_matrix.h:128
float & operator()(const size_t &column, const size_t &row)
Definition: tb_matrix.h:482
Matrix4 * MatrixCreateFromForward(Matrix4 *result, const Vector3 *forward, const Vector3 *up=nullptr)
Definition: tb_matrix.h:667
Vector3 GetPosition(void) const
Definition: tb_matrix.h:560
Matrix4 * MatrixCreatePerspectiveLH(Matrix4 *result, const float fieldOfView, const float aspectRatio, const float nearPlane, const float farPlane)
Definition: tb_matrix.h:890
Matrix4 * MatrixTranspose(Matrix4 *result, const Matrix4 *input)
Definition: tb_matrix.h:1015
Vector4 * Vector4MatrixMultiply(Vector4 *result, const Vector4 *inputVector, const Matrix4 *inputMatrix)
Definition: tb_matrix.h:1084
Matrix4(float f11=0.0f, float f21=0.0f, float f31=0.0f, float f41=0.0f, float f12=0.0f, float f22=0.0f, float f32=0.0f, float f42=0.0f, float f13=0.0f, float f23=0.0f, float f33=0.0f, float f43=0.0f, float f14=0.0f, float f24=0.0f, float f34=0.0f, float f44=0.0f)
Definition: tb_matrix.h:360
Matrix4 * MatrixCreatePerspectiveRH(Matrix4 *result, const float fieldOfView, const float aspectRatio, const float nearPlane, const float farPlane)
Definition: tb_matrix.h:866
bool operator==(const Matrix3 &other) const
Definition: tb_matrix.h:155
Matrix4(const float *const componentArray)
Definition: tb_matrix.h:381
Vector3 * GetBasis(const size_t &basisIndex)
Definition: tb_matrix.h:520
void SetBasis(const size_t &basisIndex, float basisX, float basisY, float basisZ)
Definition: tb_matrix.h:273
bool operator==(const Matrix4 &other) const
Definition: tb_matrix.h:427
Matrix4 & operator=(const Matrix4 &other)
Definition: tb_matrix.h:408
Matrix4 * MatrixSubtract(Matrix4 *result, const Matrix4 *leftSide, const Matrix4 *rightSide)
Definition: tb_matrix.h:996
Matrix4 * MatrixCreateRotationX(Matrix4 *result, const float rotationInDegrees)
Definition: tb_matrix.h:756
const float & operator[](const size_t &index) const
Definition: tb_matrix.h:190
Matrix4 * MatrixComputeInverse(Matrix4 *result, const Matrix4 *input)
Definition: tb_matrix.h:1164
void SetBasis(const size_t &basisIndex, const Vector3 &basis)
Definition: tb_matrix.h:263
const float & operator()(int column, int row) const
Definition: tb_matrix.h:488
bool IsZero(const float value, const float tolerance=tbMath::kTolerance)
Definition: tb_math.h:49
bool IsEqual(const float leftValue, const float rightValue, const float tolerance=tbMath::kTolerance)
Definition: tb_math.h:30
static Matrix3 Zero(void)
Definition: tb_matrix.h:46
Matrix3(const SkipInitialization &fastAndStupid)
Definition: tb_matrix.h:120
Vector3 * Vector3CrossProduct(Vector3 *result, const Vector3 *leftSide, const Vector3 *rightSide)
Definition: tb_vector.h:1193
const Vector3 * GetBasis(const size_t &basisIndex) const
Definition: tb_matrix.h:255
void SetPosition(float x, float y, float z)
Definition: tb_matrix.h:580
Matrix3 & operator=(const Matrix3 &other)
Definition: tb_matrix.h:136
Vector3 * GetBasis(const size_t &basisIndex)
Definition: tb_matrix.h:246
float & operator()(const size_t &column, const size_t &row)
Definition: tb_matrix.h:210
Matrix4 GetTransposed(void) const
Definition: tb_matrix.h:590
Vector3 TransformCoordinate(const Vector3 &inputVector) const
Definition: tb_matrix.h:622
Vector3 * Vector3TransformNormal(Vector3 *result, const Vector3 *inputVector, const Matrix4 *inputMatrix)
Definition: tb_matrix.h:1123
const float & operator()(const size_t &column, const size_t &row) const
Definition: tb_matrix.h:203
void SetBasis(const size_t &basisIndex, const Vector3 &basis)
Definition: tb_matrix.h:537
void SetBasis(const size_t &basisIndex, float basisX, float basisY, float basisZ)
Definition: tb_matrix.h:547
#define tb_error_if(errorTest, message,...)
Definition: tb_error.h:37
Matrix4(const Matrix4 &other)
Definition: tb_matrix.h:400
Matrix4 * MatrixAdd(Matrix4 *result, const Matrix4 *leftSide, const Matrix4 *rightSide)
Definition: tb_matrix.h:976
Matrix4 * MatrixCreateIdentity(Matrix4 *result)
Definition: tb_matrix.h:652
float & operator()(int column, int row)
Definition: tb_matrix.h:223
const float & operator[](const size_t &index) const
Definition: tb_matrix.h:462
Matrix4 * MatrixCreateRotationZ(Matrix4 *result, const float rotationInDegrees)
Definition: tb_matrix.h:794
void SetPosition(const Vector3 &position)
Definition: tb_matrix.h:569
Matrix3(const float *const componentArray)
Definition: tb_matrix.h:109
Definition: tb_vector.h:599
Matrix4(const SkipInitialization &fastAndStupid)
Definition: tb_matrix.h:392