9 #ifndef _TurtleBrains_Matrix_h_
10 #define _TurtleBrains_Matrix_h_
15 #include "../core/tb_configuration.h"
16 #include "../core/tb_error.h"
17 #include "tb_vector.h"
51 float m_f11;
float m_f21;
float m_f31;
52 float m_f12;
float m_f22;
float m_f32;
53 float m_f13;
float m_f23;
float m_f33;
60 inline explicit Matrix3(
float f11 = 0.0f,
float f21 = 0.0f,
float f31 = 0.0f,
61 float f12 = 0.0f,
float f22 = 0.0f,
float f32 = 0.0f,
62 float f13 = 0.0f,
float f23 = 0.0f,
float f33 = 0.0f)
68 mComponents[0] = f11; mComponents[1] = f21; mComponents[2] = f31;
69 mComponents[3] = f12; mComponents[4] = f22; mComponents[5] = f32;
70 mComponents[6] = f13; mComponents[7] = f23; mComponents[8] = f33;
78 inline explicit Matrix3(
const float *
const componentArray)
80 memcpy(mComponents, componentArray,
sizeof(
float) * 9);
99 memcpy(mComponents, other.mComponents,
sizeof(
float) * 9);
109 memcpy(mComponents, other.mComponents,
sizeof(
float) * 9);
118 inline const float&
operator[](
const size_t& index)
const {
return mComponents[index]; }
125 inline float&
operator[](
const size_t& index) {
return mComponents[index]; }
131 inline const float&
operator()(
const size_t& column,
const size_t& row)
const {
return mComponents[column + (row * 3)]; }
138 inline float&
operator()(
const size_t& column,
const size_t& row) {
return mComponents[column + (row * 3)]; }
144 inline const float&
operator()(
int column,
int row)
const {
return mComponents[column + (row * 3)]; }
151 inline float&
operator()(
int column,
int row) {
return mComponents[column + (row * 3)]; }
160 inline operator float*(void) {
return mComponents; }
165 inline operator const float*(void)
const {
return mComponents; }
191 inline void SetBasis(
const size_t& basisIndex,
const Vector3 &basis) { *((
Vector3*)&mComponents[basisIndex * 3]) = basis; }
201 inline void SetBasis(
const size_t& basisIndex,
float basisX,
float basisY,
float basisZ)
203 mComponents[(basisIndex * 3) + 0] = basisX;
204 mComponents[(basisIndex * 3) + 1] = basisY;
205 mComponents[(basisIndex * 3) + 2] = basisZ;
238 float mComponents[16];
240 float m_f11;
float m_f21;
float m_f31;
float m_f41;
241 float m_f12;
float m_f22;
float m_f32;
float m_f42;
242 float m_f13;
float m_f23;
float m_f33;
float m_f43;
243 float m_f14;
float m_f24;
float m_f34;
float m_f44;
250 inline explicit Matrix4(
float f11 = 0.0f,
float f21 = 0.0f,
float f31 = 0.0f,
float f41 = 0.0f,
251 float f12 = 0.0f,
float f22 = 0.0f,
float f32 = 0.0f,
float f42 = 0.0f,
252 float f13 = 0.0f,
float f23 = 0.0f,
float f33 = 0.0f,
float f43 = 0.0f,
253 float f14 = 0.0f,
float f24 = 0.0f,
float f34 = 0.0f,
float f44 = 0.0f)
260 mComponents[0] = f11; mComponents[1] = f21; mComponents[2] = f31; mComponents[3] = f41;
261 mComponents[4] = f12; mComponents[5] = f22; mComponents[6] = f32; mComponents[7] = f42;
262 mComponents[8] = f13; mComponents[9] = f23; mComponents[10]= f33; mComponents[11]= f43;
263 mComponents[12]= f14; mComponents[13]= f24; mComponents[14]= f34; mComponents[15]= f44;
271 inline explicit Matrix4(
const float *
const componentArray)
273 memcpy(mComponents, componentArray,
sizeof(
float) << 4);
292 memcpy(mComponents, other.mComponents,
sizeof(
float) << 4);
302 memcpy(mComponents, other.mComponents,
sizeof(
float) << 4);
311 inline const float&
operator[](
const size_t& index)
const {
return mComponents[index]; }
318 inline float&
operator[](
const size_t& index) {
return mComponents[index]; }
324 inline const float&
operator()(
const size_t& column,
const size_t& row)
const {
return mComponents[column + (row << 2)]; }
331 inline float&
operator()(
const size_t& column,
const size_t& row) {
return mComponents[column + (row << 2)]; }
337 inline const float&
operator()(
int column,
int row)
const {
return mComponents[column + (row << 2)]; }
344 inline float&
operator()(
int column,
int row) {
return mComponents[column + (row << 2)]; }
354 inline operator float*(void) {
return mComponents; }
359 inline operator const float*(void)
const {
return mComponents; }
386 inline void SetBasis(
const size_t& basisIndex,
const Vector3 &basis) { *((
Vector3*)&mComponents[basisIndex<<2]) = basis; }
396 inline void SetBasis(
const size_t& basisIndex,
float basisX,
float basisY,
float basisZ)
398 mComponents[(basisIndex<<2) + 0] = basisX;
399 mComponents[(basisIndex<<2) + 1] = basisY;
400 mComponents[(basisIndex<<2) + 2] = basisZ;
403 #ifndef tb_math_less_operators
426 inline void SetPosition(
float x,
float y,
float z) { m_f14 = x; m_f24 = y; m_f34 = z; }
440 temp(0, 0) =
self(0, 0); temp(0, 1) =
self(1, 0); temp(0, 2) =
self(2, 0); temp(0, 3) =
self(3, 0);
441 temp(1, 0) =
self(0, 1); temp(1, 1) =
self(1, 1); temp(1, 2) =
self(2, 1); temp(1, 3) =
self(3, 1);
442 temp(2, 0) =
self(0, 2); temp(2, 1) =
self(1, 2); temp(2, 2) =
self(2, 2); temp(2, 3) =
self(3, 2);
443 temp(3, 0) =
self(0, 3); temp(3, 1) =
self(1, 3); temp(3, 2) =
self(2, 3); temp(3, 3) =
self(3, 3);
482 tb_error(
true,
"Not yet implemented / tested.");
502 result->m_f14 = translation->x;
503 result->m_f24 = translation->y;
504 result->m_f34 = translation->z;
520 result->m_f14 = translationX;
521 result->m_f24 = translationY;
522 result->m_f34 = translationZ;
535 memset(result->mComponents, 0,
sizeof(
float) << 4);
536 result->m_f11 = scale->x;
537 result->m_f22 = scale->y;
538 result->m_f33 = scale->z;
539 result->m_f44 = 1.0f;
554 memset(result->mComponents, 0,
sizeof(
float) << 4);
555 result->m_f11 = scaleX;
556 result->m_f22 = scaleY;
557 result->m_f33 = scaleZ;
558 result->m_f44 = 1.0f;
571 const float rotationInRadians(tbMath::Convert::DegreesToRadians(rotationInDegrees));
574 result->m_f22 = cos(rotationInRadians);
575 result->m_f32 = -sin(rotationInRadians);
576 result->m_f23 = sin(rotationInRadians);
577 result->m_f33 = cos(rotationInRadians);
590 const float rotationInRadians(tbMath::Convert::DegreesToRadians(rotationInDegrees));
593 result->m_f11 = cos(rotationInRadians);
594 result->m_f31 = sin(rotationInRadians);
595 result->m_f13 = -sin(rotationInRadians);
596 result->m_f33 = cos(rotationInRadians);
609 const float rotationInRadians(tbMath::Convert::DegreesToRadians(rotationInDegrees));
612 result->m_f11 = cos(rotationInRadians);
613 result->m_f21 = -sin(rotationInRadians);
614 result->m_f12 = sin(rotationInRadians);
615 result->m_f22 = cos(rotationInRadians);
629 const float rotationInRadians(tbMath::Convert::DegreesToRadians(rotationInDegrees));
632 const float s = sinf(rotationInRadians);
633 const float c = cosf(rotationInRadians);
634 const float t = 1.0f - c;
636 float x = rotationAxis->x;
637 float y = rotationAxis->y;
638 float z = rotationAxis->z;
640 const float tx = t * rotationAxis->x;
641 const float ty = t * rotationAxis->y;
642 const float tz = t * rotationAxis->z;
643 const float sx = s * rotationAxis->x;
644 const float sy = s * rotationAxis->y;
645 const float sz = s * rotationAxis->z;
647 result->mComponents[0] = tx * x + c;
648 result->mComponents[1] = tx * y + sz;
649 result->mComponents[2] = tx * z - sy;
650 result->mComponents[3] = 0.0f;
652 result->mComponents[4] = tx * y - sz;
653 result->mComponents[5] = ty * y + c;
654 result->mComponents[6] = ty * z + sx;
655 result->mComponents[7] = 0.0f;
657 result->mComponents[8] = tx * z + sy;
658 result->mComponents[9] = ty * z - sx;
659 result->mComponents[10] = tz * z + c;
660 result->mComponents[11] = 0.0f;
662 result->mComponents[12] = 0.0f;
663 result->mComponents[13] = 0.0f;
664 result->mComponents[14] = 0.0f;
665 result->mComponents[15] = 1.0f;
680 const float nearPlane,
const float farPlane)
682 memset(result->mComponents, 0,
sizeof(
float) << 4);
684 const float f = 1.0f / tanf(fieldOfView / 2.0f);
685 result->m_f11 = f / aspectRatio;
687 result->m_f33 = (farPlane) / (nearPlane - farPlane);
688 result->m_f43 = -1.0f;
689 result->m_f34 = (nearPlane * farPlane) / (nearPlane - farPlane);
704 const float nearPlane,
const float farPlane)
706 memset(result->mComponents, 0,
sizeof(
float) << 4);
708 const float f = 1.0f / tanf(fieldOfView / 2.0f);
709 result->m_f11 = f / aspectRatio;
711 result->m_f33 = (farPlane) / (farPlane - nearPlane);
712 result->m_f43 = 1.0f;
713 result->m_f34 = -(nearPlane * farPlane) / (farPlane - nearPlane);
734 const float nearPlane,
const float farPlane)
736 memset(result->mComponents, 0,
sizeof(
float) << 4);
738 result->m_f11 = 2.0f / width;
739 result->m_f22 = 2.0f / height;
740 result->m_f33 = 1.0f / (nearPlane - farPlane);
741 result->m_f34 = nearPlane / (nearPlane - farPlane);
742 result->m_f44 = 1.0f;
763 const float nearPlane,
const float farPlane)
765 memset(result->mComponents, 0,
sizeof(
float) << 4);
773 result->m_f11 = 2.0f / width;
774 result->m_f22 = 2.0f / height;
775 result->m_f33 = 1.0f / (farPlane - nearPlane);
776 result->m_f34 = nearPlane / (nearPlane - farPlane);
777 result->m_f44 = 1.0f;
791 float *r = result->mComponents;
792 const float *m1 = leftSide->mComponents;
793 const float *m2 = rightSide->mComponents;
795 r[0] = m1[0] + m2[0]; r[1] = m1[1] + m2[1]; r[2] = m1[2] + m2[2]; r[3] = m1[3] + m2[3];
796 r[4] = m1[4] + m2[4]; r[5] = m1[5] + m2[5]; r[6] = m1[6] + m2[6]; r[7] = m1[7] + m2[7];
797 r[8] = m1[8] + m2[8]; r[9] = m1[9] + m2[9]; r[10] = m1[10] + m2[10]; r[11] = m1[11] + m2[11];
798 r[12] = m1[12] + m2[12]; r[13] = m1[13] + m2[13]; r[14] = m1[14] + m2[14]; r[15] = m1[15] + m2[15];
811 float *r = result->mComponents;
812 const float *m1 = leftSide->mComponents;
813 const float *m2 = rightSide->mComponents;
815 r[0] = m1[0] - m2[0]; r[1] = m1[1] - m2[1]; r[2] = m1[2] - m2[2]; r[3] = m1[3] - m2[3];
816 r[4] = m1[4] - m2[4]; r[5] = m1[5] - m2[5]; r[6] = m1[6] - m2[6]; r[7] = m1[7] - m2[7];
817 r[8] = m1[8] - m2[8]; r[9] = m1[9] - m2[9]; r[10] = m1[10] - m2[10]; r[11] = m1[11] - m2[11];
818 r[12] = m1[12] - m2[12]; r[13] = m1[13] - m2[13]; r[14] = m1[14] - m2[14]; r[15] = m1[15] - m2[15];
830 tb_error_if(result == input,
"tbExternalError: Invalid parameter; expected result to be different than input");
831 result->m_f11 = input->m_f11; result->m_f12 = input->m_f21; result->m_f13 = input->m_f31; result->m_f14 = input->m_f41;
832 result->m_f21 = input->m_f12; result->m_f22 = input->m_f22; result->m_f23 = input->m_f32; result->m_f24 = input->m_f42;
833 result->m_f31 = input->m_f13; result->m_f32 = input->m_f23; result->m_f33 = input->m_f33; result->m_f34 = input->m_f43;
834 result->m_f41 = input->m_f14; result->m_f42 = input->m_f24; result->m_f43 = input->m_f34; result->m_f44 = input->m_f44;
850 tb_error_if(result == leftSide || result == rightSide,
"tbExternalError: Invalid parameter; expected result to be different than leftSide and rightSide");
851 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);
852 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);
853 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);
854 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);
855 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);
856 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);
857 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);
858 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);
859 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);
860 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);
861 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);
862 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);
863 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);
864 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);
865 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);
866 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);
881 tb_error_if(result == inputVector ,
"tbExternalError: Invalid parameter; expected result to be different than inputVector.");
882 result->x = (inputVector->x * inputMatrix->m_f11) + (inputVector->y * inputMatrix->m_f12) + (inputVector->z * inputMatrix->m_f13) + (inputVector->w * inputMatrix->m_f14);
883 result->y = (inputVector->x * inputMatrix->m_f21) + (inputVector->y * inputMatrix->m_f22) + (inputVector->z * inputMatrix->m_f23) + (inputVector->w * inputMatrix->m_f24);
884 result->z = (inputVector->x * inputMatrix->m_f31) + (inputVector->y * inputMatrix->m_f32) + (inputVector->z * inputMatrix->m_f33) + (inputVector->w * inputMatrix->m_f34);
885 result->w = (inputVector->x * inputMatrix->m_f41) + (inputVector->y * inputMatrix->m_f42) + (inputVector->z * inputMatrix->m_f43) + (inputVector->w * inputMatrix->m_f44);
916 tb_error_if(result == inputVector,
"tbExternalError: Invalid parameter; expected result to be different than inputVector");
917 result->x = (inputVector->x * inputMatrix->m_f11) + (inputVector->y * inputMatrix->m_f12) + (inputVector->z * inputMatrix->m_f13) + inputMatrix->m_f14;
918 result->y = (inputVector->x * inputMatrix->m_f21) + (inputVector->y * inputMatrix->m_f22) + (inputVector->z * inputMatrix->m_f23) + inputMatrix->m_f24;
919 result->z = (inputVector->x * inputMatrix->m_f31) + (inputVector->y * inputMatrix->m_f32) + (inputVector->z * inputMatrix->m_f33) + inputMatrix->m_f34;
950 tb_error_if(result == inputVector,
"tbExternalError: Invalid parameter; expected result to be different than inputVector");
951 result->x = (inputVector->x * inputMatrix->m_f11) + (inputVector->y * inputMatrix->m_f12) + (inputVector->z * inputMatrix->m_f13);
952 result->y = (inputVector->x * inputMatrix->m_f21) + (inputVector->y * inputMatrix->m_f22) + (inputVector->z * inputMatrix->m_f23);
953 result->z = (inputVector->x * inputMatrix->m_f31) + (inputVector->y * inputMatrix->m_f32) + (inputVector->z * inputMatrix->m_f33);
961 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)
963 return f11 * (f22 * f33 - f32 * f23) - f12 * (f21 * f33 - f31 * f23) + f13 * (f21 * f32 - f31 * f22);
972 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) -
973 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) +
974 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) -
975 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);
991 tb_error_if(result == input,
"tbExternalError: Invalid parameter, expected result to be different than input.");
993 if (
true ==
IsZero(determinant))
999 const float inverseDeterminant = 1.0f / determinant;
1001 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;
1002 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;
1003 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;
1004 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;
1005 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;
1006 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;
1007 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;
1008 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;
1009 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;
1010 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;
1011 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;
1012 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;
1013 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;
1014 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;
1015 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;
1016 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;
Matrix4 * MatrixCreateOrthoLH(Matrix4 *result, const float width, const float height, const float nearPlane, const float farPlane)
Definition: tb_matrix.h:762
Matrix4 * MatrixCreateOrthoRH(Matrix4 *result, const float width, const float height, const float nearPlane, const float farPlane)
Definition: tb_matrix.h:733
const float & operator()(int column, int row) const
Definition: tb_matrix.h:144
Contains objects and functions for dealing with Vector and Matrix math.
float MatrixDeterminant(const Matrix4 *input)
Definition: tb_matrix.h:970
Vector3 * Vector3TransformNormal(Vector3 *result, const Vector3 *inputVector, const Matrix4 *inputMatrix)
Definition: tb_matrix.h:948
#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:324
Definition: tb_vector.h:296
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:60
Definition: tb_matrix.h:30
Matrix4 * MatrixCreateRotationY(Matrix4 *result, const float rotationInDegrees)
Definition: tb_matrix.h:588
float & operator()(int column, int row)
Definition: tb_matrix.h:344
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:961
Matrix4 * MatrixCreateFromForward(Matrix4 *result, const Vector3 *forward, const Vector3 *up=NULL)
Definition: tb_matrix.h:480
float & operator[](const size_t &index)
Definition: tb_matrix.h:125
Matrix4 * MatrixMultiply(Matrix4 *result, const Matrix4 *leftSide, const Matrix4 *rightSide)
Definition: tb_matrix.h:848
Matrix4 * MatrixComputeInverse(Matrix4 *result, const Matrix4 *input)
Definition: tb_matrix.h:989
Contains all functions, classes and helpers related to game/application development written by Tim "B...
Definition: tb_application_dialog.h:21
Matrix4 * MatrixCreateTranslation(Matrix4 *result, const Vector3 *translation)
Definition: tb_matrix.h:499
Matrix4 * MatrixCreateRotationA(Matrix4 *result, const Vector3 *rotationAxis, const float rotationInDegrees)
Definition: tb_matrix.h:627
#define tb_unused(parameter)
Definition: tb_defines.h:19
static const Matrix4 kZero
Definition: tb_matrix.h:224
const Vector3 * GetBasis(const size_t &basisIndex) const
Definition: tb_matrix.h:378
Definition: tb_matrix.h:217
SkipInitialization
Definition: tb_vector.h:30
static const Matrix3 kIdentity
Definition: tb_matrix.h:45
float & operator[](const size_t &index)
Definition: tb_matrix.h:318
Matrix3(const Matrix3 &other)
Definition: tb_matrix.h:97
float & operator()(const size_t &column, const size_t &row)
Definition: tb_matrix.h:331
Vector3 GetPosition(void) const
Definition: tb_matrix.h:409
static const Matrix4 kIdentity
Definition: tb_matrix.h:234
Matrix4 * MatrixCreatePerspectiveLH(Matrix4 *result, const float fieldOfView, const float aspectRatio, const float nearPlane, const float farPlane)
Definition: tb_matrix.h:703
static const Matrix3 kZero
Definition: tb_matrix.h:36
Matrix4 * MatrixTranspose(Matrix4 *result, const Matrix4 *input)
Definition: tb_matrix.h:828
Vector4 * Vector4MatrixMultiply(Vector4 *result, const Vector4 *inputVector, const Matrix4 *inputMatrix)
Definition: tb_matrix.h:879
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:250
Matrix4 * MatrixCreatePerspectiveRH(Matrix4 *result, const float fieldOfView, const float aspectRatio, const float nearPlane, const float farPlane)
Definition: tb_matrix.h:679
Matrix4(const float *const componentArray)
Definition: tb_matrix.h:271
Vector3 * GetBasis(const size_t &basisIndex)
Definition: tb_matrix.h:369
void SetBasis(const size_t &basisIndex, float basisX, float basisY, float basisZ)
Definition: tb_matrix.h:201
Vector3 * Vector3TransformCoord(Vector3 *result, const Vector3 *inputVector, const Matrix4 *inputMatrix)
Definition: tb_matrix.h:914
Matrix4 * MatrixCreateScale(Matrix4 *result, Vector3 *scale)
Definition: tb_matrix.h:533
Matrix4 & operator=(const Matrix4 &other)
Definition: tb_matrix.h:298
Matrix4 * MatrixSubtract(Matrix4 *result, const Matrix4 *leftSide, const Matrix4 *rightSide)
Definition: tb_matrix.h:809
Matrix4 * MatrixCreateRotationX(Matrix4 *result, const float rotationInDegrees)
Definition: tb_matrix.h:569
const float & operator[](const size_t &index) const
Definition: tb_matrix.h:118
void SetBasis(const size_t &basisIndex, const Vector3 &basis)
Definition: tb_matrix.h:191
const float & operator()(int column, int row) const
Definition: tb_matrix.h:337
bool IsZero(const float value, const float tolerance=tbMath::kTolerance)
Definition: tb_math.h:41
Matrix3(const SkipInitialization &fastAndStupid)
Definition: tb_matrix.h:89
Vector3 * Vector3CrossProduct(Vector3 *result, const Vector3 *leftSide, const Vector3 *rightSide)
Definition: tb_vector.h:1174
const Vector3 * GetBasis(const size_t &basisIndex) const
Definition: tb_matrix.h:183
void SetPosition(float x, float y, float z)
Definition: tb_matrix.h:426
Matrix3 & operator=(const Matrix3 &other)
Definition: tb_matrix.h:105
Vector3 * GetBasis(const size_t &basisIndex)
Definition: tb_matrix.h:174
float & operator()(const size_t &column, const size_t &row)
Definition: tb_matrix.h:138
Matrix4 GetTransposed(void) const
Definition: tb_matrix.h:431
const float & operator()(const size_t &column, const size_t &row) const
Definition: tb_matrix.h:131
void SetBasis(const size_t &basisIndex, const Vector3 &basis)
Definition: tb_matrix.h:386
void SetBasis(const size_t &basisIndex, float basisX, float basisY, float basisZ)
Definition: tb_matrix.h:396
#define tb_error_if(errorTest, message,...)
Definition: tb_error.h:37
Matrix4(const Matrix4 &other)
Definition: tb_matrix.h:290
Matrix4 * MatrixAdd(Matrix4 *result, const Matrix4 *leftSide, const Matrix4 *rightSide)
Definition: tb_matrix.h:789
Matrix4 * MatrixCreateIdentity(Matrix4 *result)
Definition: tb_matrix.h:458
float & operator()(int column, int row)
Definition: tb_matrix.h:151
const float & operator[](const size_t &index) const
Definition: tb_matrix.h:311
Matrix4 * MatrixCreateRotationZ(Matrix4 *result, const float rotationInDegrees)
Definition: tb_matrix.h:607
void SetPosition(const Vector3 &position)
Definition: tb_matrix.h:415
Matrix3(const float *const componentArray)
Definition: tb_matrix.h:78
Definition: tb_vector.h:587
Matrix4(const SkipInitialization &fastAndStupid)
Definition: tb_matrix.h:282