00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef LUX_MATRIX3X3_H
00024 #define LUX_MATRIX3X3_H
00025
00026 namespace lux
00027 {
00028
00029 static inline float Determinant3x3(const float matrix[3][3])
00030 {
00031 float temp;
00032 temp = matrix[0][0] * matrix[1][1] * matrix[2][2];
00033 temp -= matrix[0][0] * matrix[1][2] * matrix[2][1];
00034 temp -= matrix[1][0] * matrix[0][1] * matrix[2][2];
00035 temp += matrix[1][0] * matrix[0][2] * matrix[2][1];
00036 temp += matrix[2][0] * matrix[0][1] * matrix[1][2];
00037 temp -= matrix[2][0] * matrix[0][2] * matrix[1][1];
00038 return temp;
00039 }
00040
00041 static inline bool Invert3x3(const float matrix[3][3], float result[3][3])
00042 {
00043 float det = Determinant3x3(matrix);
00044 if (fabsf(det) < 1e-12f)
00045 return false;
00046 float a = matrix[0][0], b = matrix[0][1], c = matrix[0][2],
00047 d = matrix[1][0], e = matrix[1][1], f = matrix[1][2],
00048 g = matrix[2][0], h = matrix[2][1], i = matrix[2][2];
00049
00050 double idet = 1.0 / det;
00051
00052 result[0][0] = (e * i - f * h) * idet;
00053 result[0][1] = (c * h - b * i) * idet;
00054 result[0][2] = (b * f - c * e) * idet;
00055 result[1][0] = (f * g - d * i) * idet;
00056 result[1][1] = (a * i - c * g) * idet;
00057 result[1][2] = (c * d - a * f) * idet;
00058 result[2][0] = (d * h - e * g) * idet;
00059 result[2][1] = (b * g - a * h) * idet;
00060 result[2][2] = (a * e - b * d) * idet;
00061
00062 return true;
00063 }
00064
00065 static inline void Transform3x3(const float matrix[3][3], const float vector[3], float result[3])
00066 {
00067 result[0] = matrix[0][0] * vector[0] + matrix[0][1] * vector[1] + matrix[0][2] * vector[2];
00068 result[1] = matrix[1][0] * vector[0] + matrix[1][1] * vector[1] + matrix[1][2] * vector[2];
00069 result[2] = matrix[2][0] * vector[0] + matrix[2][1] * vector[1] + matrix[2][2] * vector[2];
00070 }
00071
00072 static inline void Multiply3x3(const float a[3][3], const float b[3][3], float result[3][3])
00073 {
00074 result[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0];
00075 result[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1];
00076 result[0][2] = a[0][0] * b[0][2] + a[0][1] * b[1][2] + a[0][2] * b[2][2];
00077 result[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0] + a[1][2] * b[2][0];
00078 result[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1] + a[1][2] * b[2][1];
00079 result[1][2] = a[1][0] * b[0][2] + a[1][1] * b[1][2] + a[1][2] * b[2][2];
00080 result[2][0] = a[2][0] * b[0][0] + a[2][1] * b[1][0] + a[2][2] * b[2][0];
00081 result[2][1] = a[2][0] * b[0][1] + a[2][1] * b[1][1] + a[2][2] * b[2][1];
00082 result[2][2] = a[2][0] * b[0][2] + a[2][1] * b[1][2] + a[2][2] * b[2][2];
00083 }
00084
00085
00086 }
00087
00088 #endif //LUX_MATRIX3X3_H