1
0
mirror of https://github.com/thes3m/XNI synced 2024-12-26 13:26:06 +01:00
Matej Jan d04d7bf8f3 All around update and fixes
git-svn-id: http://xni.googlecode.com/svn/XNI@104 ac433895-eea3-a490-d80a-17149a75e588
2012-05-14 08:40:49 +00:00

281 lines
13 KiB
C

typedef struct {
float m11;
float m12;
float m13;
float m14;
float m21;
float m22;
float m23;
float m24;
float m31;
float m32;
float m33;
float m34;
float m41;
float m42;
float m43;
float m44;
} MatrixStruct;
static inline MatrixStruct MatrixMake(float m11, float m12, float m13, float m14, float m21, float m22, float m23, float m24,
float m31, float m32, float m33, float m34, float m41, float m42, float m43, float m44) {
MatrixStruct matrix;
matrix.m11 = m11;
matrix.m12 = m12;
matrix.m13 = m13;
matrix.m14 = m14;
matrix.m21 = m21;
matrix.m22 = m22;
matrix.m23 = m23;
matrix.m24 = m24;
matrix.m31 = m31;
matrix.m32 = m32;
matrix.m33 = m33;
matrix.m34 = m34;
matrix.m41 = m41;
matrix.m42 = m42;
matrix.m43 = m43;
matrix.m44 = m44;
return matrix;
}
static inline float MatrixDeterminant(MatrixStruct *value) {
float det1 = value->m11 * value->m22 - value->m12 * value->m21;
float det2 = value->m11 * value->m23 - value->m13 * value->m21;
float det3 = value->m11 * value->m24 - value->m14 * value->m21;
float det4 = value->m12 * value->m23 - value->m13 * value->m22;
float det5 = value->m12 * value->m24 - value->m14 * value->m22;
float det6 = value->m13 * value->m24 - value->m14 * value->m23;
float det7 = value->m31 * value->m42 - value->m32 * value->m41;
float det8 = value->m31 * value->m43 - value->m33 * value->m41;
float det9 = value->m31 * value->m44 - value->m34 * value->m41;
float det10 = value->m32 * value->m43 - value->m33 * value->m42;
float det11 = value->m32 * value->m44 - value->m34 * value->m42;
float det12 = value->m33 * value->m44 - value->m34 * value->m43;
return det1*det12 - det2*det11 + det3*det10 + det4*det9 - det5*det8 + det6*det7;
}
static inline void MatrixNegate(MatrixStruct *value) {
value->m11 = -value->m11;
value->m12 = -value->m12;
value->m13 = -value->m13;
value->m14 = -value->m14;
value->m21 = -value->m21;
value->m22 = -value->m22;
value->m23 = -value->m23;
value->m24 = -value->m24;
value->m31 = -value->m31;
value->m32 = -value->m32;
value->m33 = -value->m33;
value->m34 = -value->m34;
value->m41 = -value->m41;
value->m42 = -value->m42;
value->m43 = -value->m43;
value->m44 = -value->m44;
}
static inline void MatrixTranspose(MatrixStruct *value) {
MatrixStruct matrix = *value;
value->m11 = matrix.m11;
value->m12 = matrix.m21;
value->m13 = matrix.m31;
value->m14 = matrix.m41;
value->m21 = matrix.m12;
value->m22 = matrix.m22;
value->m23 = matrix.m32;
value->m24 = matrix.m42;
value->m31 = matrix.m13;
value->m32 = matrix.m23;
value->m33 = matrix.m33;
value->m34 = matrix.m43;
value->m41 = matrix.m14;
value->m42 = matrix.m24;
value->m43 = matrix.m34;
value->m44 = matrix.m44;
}
static inline void MatrixInvert(MatrixStruct *value) {
MatrixStruct matrix = *value;
float det1 = matrix.m11 * matrix.m22 - matrix.m12 * matrix.m21;
float det2 = matrix.m11 * matrix.m23 - matrix.m13 * matrix.m21;
float det3 = matrix.m11 * matrix.m24 - matrix.m14 * matrix.m21;
float det4 = matrix.m12 * matrix.m23 - matrix.m13 * matrix.m22;
float det5 = matrix.m12 * matrix.m24 - matrix.m14 * matrix.m22;
float det6 = matrix.m13 * matrix.m24 - matrix.m14 * matrix.m23;
float det7 = matrix.m31 * matrix.m42 - matrix.m32 * matrix.m41;
float det8 = matrix.m31 * matrix.m43 - matrix.m33 * matrix.m41;
float det9 = matrix.m31 * matrix.m44 - matrix.m34 * matrix.m41;
float det10 = matrix.m32 * matrix.m43 - matrix.m33 * matrix.m42;
float det11 = matrix.m32 * matrix.m44 - matrix.m34 * matrix.m42;
float det12 = matrix.m33 * matrix.m44 - matrix.m34 * matrix.m43;
float detMatrix = (float)(det1*det12 - det2*det11 + det3*det10 + det4*det9 - det5*det8 + det6*det7);
float invDetMatrix = 1.0f / detMatrix;
value->m11 = (matrix.m22*det12 - matrix.m23*det11 + matrix.m24*det10) * invDetMatrix;
value->m12 = (-matrix.m12*det12 + matrix.m13*det11 - matrix.m14*det10) * invDetMatrix;
value->m13 = (matrix.m42*det6 - matrix.m43*det5 + matrix.m44*det4) * invDetMatrix;
value->m14 = (-matrix.m32*det6 + matrix.m33*det5 - matrix.m34*det4) * invDetMatrix;
value->m21 = (-matrix.m21*det12 + matrix.m23*det9 - matrix.m24*det8) * invDetMatrix;
value->m22 = (matrix.m11*det12 - matrix.m13*det9 + matrix.m14*det8) * invDetMatrix;
value->m23 = (-matrix.m41*det6 + matrix.m43*det3 - matrix.m44*det2) * invDetMatrix;
value->m24 = (matrix.m31*det6 - matrix.m33*det3 + matrix.m34*det2) * invDetMatrix;
value->m31 = (matrix.m21*det11 - matrix.m22*det9 + matrix.m24*det7) * invDetMatrix;
value->m32 = (-matrix.m11*det11 + matrix.m12*det9 - matrix.m14*det7) * invDetMatrix;
value->m33 = (matrix.m41*det5 - matrix.m42*det3 + matrix.m44*det1) * invDetMatrix;
value->m34 = (-matrix.m31*det5 + matrix.m32*det3 - matrix.m34*det1) * invDetMatrix;
value->m41 = (-matrix.m21*det10 + matrix.m22*det8 - matrix.m23*det7) * invDetMatrix;
value->m42 = (matrix.m11*det10 - matrix.m12*det8 + matrix.m13*det7) * invDetMatrix;
value->m43 = (-matrix.m41*det4 + matrix.m42*det2 - matrix.m43*det1) * invDetMatrix;
value->m44 = (matrix.m31*det4 - matrix.m32*det2 + matrix.m33*det1) * invDetMatrix;
}
static inline void MatrixAdd(MatrixStruct *value1, MatrixStruct *value2, MatrixStruct *result) {
result->m11 = value1->m11 + value2->m11;
result->m12 = value1->m12 + value2->m12;
result->m13 = value1->m13 + value2->m13;
result->m14 = value1->m14 + value2->m14;
result->m21 = value1->m21 + value2->m21;
result->m22 = value1->m22 + value2->m22;
result->m23 = value1->m23 + value2->m23;
result->m24 = value1->m24 + value2->m24;
result->m31 = value1->m31 + value2->m31;
result->m32 = value1->m32 + value2->m32;
result->m33 = value1->m33 + value2->m33;
result->m34 = value1->m34 + value2->m34;
result->m41 = value1->m41 + value2->m41;
result->m42 = value1->m42 + value2->m42;
result->m43 = value1->m43 + value2->m43;
result->m44 = value1->m44 + value2->m44;
}
static inline void MatrixSubtract(MatrixStruct *value1, MatrixStruct *value2, MatrixStruct *result) {
result->m11 = value1->m11 - value2->m11;
result->m12 = value1->m12 - value2->m12;
result->m13 = value1->m13 - value2->m13;
result->m14 = value1->m14 - value2->m14;
result->m21 = value1->m21 - value2->m21;
result->m22 = value1->m22 - value2->m22;
result->m23 = value1->m23 - value2->m23;
result->m24 = value1->m24 - value2->m24;
result->m31 = value1->m31 - value2->m31;
result->m32 = value1->m32 - value2->m32;
result->m33 = value1->m33 - value2->m33;
result->m34 = value1->m34 - value2->m34;
result->m41 = value1->m41 - value2->m41;
result->m42 = value1->m42 - value2->m42;
result->m43 = value1->m43 - value2->m43;
result->m44 = value1->m44 - value2->m44;
}
static inline void MatrixMultiplyScalar(MatrixStruct *value1, float scaleFactor, MatrixStruct *result) {
result->m11 = value1->m11 * scaleFactor;
result->m12 = value1->m12 * scaleFactor;
result->m13 = value1->m13 * scaleFactor;
result->m14 = value1->m14 * scaleFactor;
result->m21 = value1->m21 * scaleFactor;
result->m22 = value1->m22 * scaleFactor;
result->m23 = value1->m23 * scaleFactor;
result->m24 = value1->m24 * scaleFactor;
result->m31 = value1->m31 * scaleFactor;
result->m32 = value1->m32 * scaleFactor;
result->m33 = value1->m33 * scaleFactor;
result->m34 = value1->m34 * scaleFactor;
result->m41 = value1->m41 * scaleFactor;
result->m42 = value1->m42 * scaleFactor;
result->m43 = value1->m43 * scaleFactor;
result->m44 = value1->m44 * scaleFactor;
}
static inline void MatrixMultiply(MatrixStruct *value1, MatrixStruct *value2, MatrixStruct *result) {
float m11 = value1->m11 * value2->m11 + value1->m12 * value2->m21 + value1->m13 * value2->m31 + value1->m14 * value2->m41;
float m12 = value1->m11 * value2->m12 + value1->m12 * value2->m22 + value1->m13 * value2->m32 + value1->m14 * value2->m42;
float m13 = value1->m11 * value2->m13 + value1->m12 * value2->m23 + value1->m13 * value2->m33 + value1->m14 * value2->m43;
float m14 = value1->m11 * value2->m14 + value1->m12 * value2->m24 + value1->m13 * value2->m34 + value1->m14 * value2->m44;
float m21 = value1->m21 * value2->m11 + value1->m22 * value2->m21 + value1->m23 * value2->m31 + value1->m24 * value2->m41;
float m22 = value1->m21 * value2->m12 + value1->m22 * value2->m22 + value1->m23 * value2->m32 + value1->m24 * value2->m42;
float m23 = value1->m21 * value2->m13 + value1->m22 * value2->m23 + value1->m23 * value2->m33 + value1->m24 * value2->m43;
float m24 = value1->m21 * value2->m14 + value1->m22 * value2->m24 + value1->m23 * value2->m34 + value1->m24 * value2->m44;
float m31 = value1->m31 * value2->m11 + value1->m32 * value2->m21 + value1->m33 * value2->m31 + value1->m34 * value2->m41;
float m32 = value1->m31 * value2->m12 + value1->m32 * value2->m22 + value1->m33 * value2->m32 + value1->m34 * value2->m42;
float m33 = value1->m31 * value2->m13 + value1->m32 * value2->m23 + value1->m33 * value2->m33 + value1->m34 * value2->m43;
float m34 = value1->m31 * value2->m14 + value1->m32 * value2->m24 + value1->m33 * value2->m34 + value1->m34 * value2->m44;
float m41 = value1->m41 * value2->m11 + value1->m42 * value2->m21 + value1->m43 * value2->m31 + value1->m44 * value2->m41;
float m42 = value1->m41 * value2->m12 + value1->m42 * value2->m22 + value1->m43 * value2->m32 + value1->m44 * value2->m42;
float m43 = value1->m41 * value2->m13 + value1->m42 * value2->m23 + value1->m43 * value2->m33 + value1->m44 * value2->m43;
float m44 = value1->m41 * value2->m14 + value1->m42 * value2->m24 + value1->m43 * value2->m34 + value1->m44 * value2->m44;
result->m11 = m11;
result->m12 = m12;
result->m13 = m13;
result->m14 = m14;
result->m21 = m21;
result->m22 = m22;
result->m23 = m23;
result->m24 = m24;
result->m31 = m31;
result->m32 = m32;
result->m33 = m33;
result->m34 = m34;
result->m41 = m41;
result->m42 = m42;
result->m43 = m43;
result->m44 = m44;
}
static inline void MatrixDivideScalar(MatrixStruct *value1, float divider, MatrixStruct *result) {
result->m11 = value1->m11 / divider;
result->m12 = value1->m12 / divider;
result->m13 = value1->m13 / divider;
result->m14 = value1->m14 / divider;
result->m21 = value1->m21 / divider;
result->m22 = value1->m22 / divider;
result->m23 = value1->m23 / divider;
result->m24 = value1->m24 / divider;
result->m31 = value1->m31 / divider;
result->m32 = value1->m32 / divider;
result->m33 = value1->m33 / divider;
result->m34 = value1->m34 / divider;
result->m41 = value1->m41 / divider;
result->m42 = value1->m42 / divider;
result->m43 = value1->m43 / divider;
result->m44 = value1->m44 / divider;
}
static inline void MatrixDivide(MatrixStruct *value1, MatrixStruct *value2, MatrixStruct *result) {
result->m11 = value1->m11 / value2->m11;
result->m12 = value1->m12 / value2->m12;
result->m13 = value1->m13 / value2->m13;
result->m14 = value1->m14 / value2->m14;
result->m21 = value1->m21 / value2->m21;
result->m22 = value1->m22 / value2->m22;
result->m23 = value1->m23 / value2->m23;
result->m24 = value1->m24 / value2->m24;
result->m31 = value1->m31 / value2->m31;
result->m32 = value1->m32 / value2->m32;
result->m33 = value1->m33 / value2->m33;
result->m34 = value1->m34 / value2->m34;
result->m41 = value1->m41 / value2->m41;
result->m42 = value1->m42 / value2->m42;
result->m43 = value1->m43 / value2->m43;
result->m44 = value1->m44 / value2->m44;
}
static inline void MatrixLerp(MatrixStruct *value1, MatrixStruct *value2, float amount, MatrixStruct *result) {
float first = 1 - amount;
result->m11 = value1->m11 * first + value2->m11 * amount;
result->m12 = value1->m12 * first + value2->m12 * amount;
result->m13 = value1->m13 * first + value2->m13 * amount;
result->m14 = value1->m14 * first + value2->m14 * amount;
result->m21 = value1->m21 * first + value2->m21 * amount;
result->m22 = value1->m22 * first + value2->m22 * amount;
result->m23 = value1->m23 * first + value2->m23 * amount;
result->m24 = value1->m24 * first + value2->m24 * amount;
result->m31 = value1->m31 * first + value2->m31 * amount;
result->m32 = value1->m32 * first + value2->m32 * amount;
result->m33 = value1->m33 * first + value2->m33 * amount;
result->m34 = value1->m34 * first + value2->m34 * amount;
result->m41 = value1->m41 * first + value2->m41 * amount;
result->m42 = value1->m42 * first + value2->m42 * amount;
result->m43 = value1->m43 * first + value2->m43 * amount;
result->m44 = value1->m44 * first + value2->m44 * amount;
}