00001 00008 #include "PS2Math.h" 00009 00010 using namespace PS2Math; 00011 00026 Matrix44 &PS2Math::Matrix44Multiply(const Matrix44 &M1, 00027 const Matrix44 &M2, 00028 Matrix44 &Result) { 00029 00030 Result.elem[0][0] = M1.elem[0][0] * M2.elem[0][0] + M1.elem[0][1] * M2.elem[1][0] + M1.elem[0][2] * M2.elem[2][0] + M1.elem[0][3] * M2.elem[3][0]; 00031 Result.elem[0][1] = M1.elem[0][0] * M2.elem[0][1] + M1.elem[0][1] * M2.elem[1][1] + M1.elem[0][2] * M2.elem[2][1] + M1.elem[0][3] * M2.elem[3][1]; 00032 Result.elem[0][2] = M1.elem[0][0] * M2.elem[0][2] + M1.elem[0][1] * M2.elem[1][2] + M1.elem[0][2] * M2.elem[2][2] + M1.elem[0][3] * M2.elem[3][2]; 00033 Result.elem[0][3] = M1.elem[0][0] * M2.elem[0][3] + M1.elem[0][1] * M2.elem[1][3] + M1.elem[0][2] * M2.elem[2][3] + M1.elem[0][3] * M2.elem[3][3]; 00034 00035 Result.elem[1][0] = M1.elem[1][0] * M2.elem[0][0] + M1.elem[1][1] * M2.elem[1][0] + M1.elem[1][2] * M2.elem[2][0] + M1.elem[1][3] * M2.elem[3][0]; 00036 Result.elem[1][1] = M1.elem[1][0] * M2.elem[0][1] + M1.elem[1][1] * M2.elem[1][1] + M1.elem[1][2] * M2.elem[2][1] + M1.elem[1][3] * M2.elem[3][1]; 00037 Result.elem[1][2] = M1.elem[1][0] * M2.elem[0][2] + M1.elem[1][1] * M2.elem[1][2] + M1.elem[1][2] * M2.elem[2][2] + M1.elem[1][3] * M2.elem[3][2]; 00038 Result.elem[1][3] = M1.elem[1][0] * M2.elem[0][3] + M1.elem[1][1] * M2.elem[1][3] + M1.elem[1][2] * M2.elem[2][3] + M1.elem[1][3] * M2.elem[3][3]; 00039 00040 Result.elem[2][0] = M1.elem[2][0] * M2.elem[0][0] + M1.elem[2][1] * M2.elem[1][0] + M1.elem[2][2] * M2.elem[2][0] + M1.elem[2][3] * M2.elem[3][0]; 00041 Result.elem[2][1] = M1.elem[2][0] * M2.elem[0][1] + M1.elem[2][1] * M2.elem[1][1] + M1.elem[2][2] * M2.elem[2][1] + M1.elem[2][3] * M2.elem[3][1]; 00042 Result.elem[2][2] = M1.elem[2][0] * M2.elem[0][2] + M1.elem[2][1] * M2.elem[1][2] + M1.elem[2][2] * M2.elem[2][2] + M1.elem[2][3] * M2.elem[3][2]; 00043 Result.elem[2][3] = M1.elem[2][0] * M2.elem[0][3] + M1.elem[2][1] * M2.elem[1][3] + M1.elem[2][2] * M2.elem[2][3] + M1.elem[2][3] * M2.elem[3][3]; 00044 00045 Result.elem[3][0] = M1.elem[3][0] * M2.elem[0][0] + M1.elem[3][1] * M2.elem[1][0] + M1.elem[3][2] * M2.elem[2][0] + M1.elem[3][3] * M2.elem[3][0]; 00046 Result.elem[3][1] = M1.elem[3][0] * M2.elem[0][1] + M1.elem[3][1] * M2.elem[1][1] + M1.elem[3][2] * M2.elem[2][1] + M1.elem[3][3] * M2.elem[3][1]; 00047 Result.elem[3][2] = M1.elem[3][0] * M2.elem[0][2] + M1.elem[3][1] * M2.elem[1][2] + M1.elem[3][2] * M2.elem[2][2] + M1.elem[3][3] * M2.elem[3][2]; 00048 Result.elem[3][3] = M1.elem[3][0] * M2.elem[0][3] + M1.elem[3][1] * M2.elem[1][3] + M1.elem[3][2] * M2.elem[2][3] + M1.elem[3][3] * M2.elem[3][3]; 00049 00050 return Result; 00051 } 00052 00053 /* . 00054 This version of the Matrix44 Multiplication is used to do operation such 00055 M1 = M1 * M2, normal version of the function does not use a temporary object so 00056 it cannot be used. This version of the function execute operation M1 * M2 and 00057 store the result in the left operand (M1). This is the reason for suffix L 00058 (Left) in his name. 00059 @param M1 Left matrix involved into the operation 00060 @param M2 Right matrix involved into the operation 00061 @return A reference to the left matrix (first parameter) 00062 */ 00063 Matrix44 &PS2Math::Matrix44MultiplyL(Matrix44 &M1_result, 00064 const Matrix44 &M2) { 00065 00066 Matrix44 Temp; 00067 Temp.elem[0][0] = M1_result.elem[0][0] * M2.elem[0][0] + M1_result.elem[0][1] * M2.elem[1][0] + M1_result.elem[0][2] * M2.elem[2][0] + M1_result.elem[0][3] * M2.elem[3][0]; 00068 Temp.elem[0][1] = M1_result.elem[0][0] * M2.elem[0][1] + M1_result.elem[0][1] * M2.elem[1][1] + M1_result.elem[0][2] * M2.elem[2][1] + M1_result.elem[0][3] * M2.elem[3][1]; 00069 Temp.elem[0][2] = M1_result.elem[0][0] * M2.elem[0][2] + M1_result.elem[0][1] * M2.elem[1][2] + M1_result.elem[0][2] * M2.elem[2][2] + M1_result.elem[0][3] * M2.elem[3][2]; 00070 Temp.elem[0][3] = M1_result.elem[0][0] * M2.elem[0][3] + M1_result.elem[0][1] * M2.elem[1][3] + M1_result.elem[0][2] * M2.elem[2][3] + M1_result.elem[0][3] * M2.elem[3][3]; 00071 00072 Temp.elem[1][0] = M1_result.elem[1][0] * M2.elem[0][0] + M1_result.elem[1][1] * M2.elem[1][0] + M1_result.elem[1][2] * M2.elem[2][0] + M1_result.elem[1][3] * M2.elem[3][0]; 00073 Temp.elem[1][1] = M1_result.elem[1][0] * M2.elem[0][1] + M1_result.elem[1][1] * M2.elem[1][1] + M1_result.elem[1][2] * M2.elem[2][1] + M1_result.elem[1][3] * M2.elem[3][1]; 00074 Temp.elem[1][2] = M1_result.elem[1][0] * M2.elem[0][2] + M1_result.elem[1][1] * M2.elem[1][2] + M1_result.elem[1][2] * M2.elem[2][2] + M1_result.elem[1][3] * M2.elem[3][2]; 00075 Temp.elem[1][3] = M1_result.elem[1][0] * M2.elem[0][3] + M1_result.elem[1][1] * M2.elem[1][3] + M1_result.elem[1][2] * M2.elem[2][3] + M1_result.elem[1][3] * M2.elem[3][3]; 00076 00077 Temp.elem[2][0] = M1_result.elem[2][0] * M2.elem[0][0] + M1_result.elem[2][1] * M2.elem[1][0] + M1_result.elem[2][2] * M2.elem[2][0] + M1_result.elem[2][3] * M2.elem[3][0]; 00078 Temp.elem[2][1] = M1_result.elem[2][0] * M2.elem[0][1] + M1_result.elem[2][1] * M2.elem[1][1] + M1_result.elem[2][2] * M2.elem[2][1] + M1_result.elem[2][3] * M2.elem[3][1]; 00079 Temp.elem[2][2] = M1_result.elem[2][0] * M2.elem[0][2] + M1_result.elem[2][1] * M2.elem[1][2] + M1_result.elem[2][2] * M2.elem[2][2] + M1_result.elem[2][3] * M2.elem[3][2]; 00080 Temp.elem[2][3] = M1_result.elem[2][0] * M2.elem[0][3] + M1_result.elem[2][1] * M2.elem[1][3] + M1_result.elem[2][2] * M2.elem[2][3] + M1_result.elem[2][3] * M2.elem[3][3]; 00081 00082 Temp.elem[3][0] = M1_result.elem[3][0] * M2.elem[0][0] + M1_result.elem[3][1] * M2.elem[1][0] + M1_result.elem[3][2] * M2.elem[2][0] + M1_result.elem[3][3] * M2.elem[3][0]; 00083 Temp.elem[3][1] = M1_result.elem[3][0] * M2.elem[0][1] + M1_result.elem[3][1] * M2.elem[1][1] + M1_result.elem[3][2] * M2.elem[2][1] + M1_result.elem[3][3] * M2.elem[3][1]; 00084 Temp.elem[3][2] = M1_result.elem[3][0] * M2.elem[0][2] + M1_result.elem[3][1] * M2.elem[1][2] + M1_result.elem[3][2] * M2.elem[2][2] + M1_result.elem[3][3] * M2.elem[3][2]; 00085 Temp.elem[3][3] = M1_result.elem[3][0] * M2.elem[0][3] + M1_result.elem[3][1] * M2.elem[1][3] + M1_result.elem[3][2] * M2.elem[2][3] + M1_result.elem[3][3] * M2.elem[3][3]; 00086 00087 M1_result = Temp; 00088 return M1_result; 00089 } 00090 00091 /* . 00092 This version of the Matrix44 Multiplication is used to do operation such 00093 M2 = M1 * M2, normal version of the function does not use a temporary object so 00094 it cannot be used. This version of the function execute operation M1 * M2 and 00095 store the result in the RIGHT operand (M2). This is the reason for suffix L 00096 (Left) in his name. 00097 @param M1 Left matrix involved into the operation 00098 @param M2 Right matrix involved into the operation 00099 @return A reference to the right matrix (second parameter) 00100 */ 00101 Matrix44 &PS2Math::Matrix44MultiplyR(const Matrix44 &M1, 00102 Matrix44 &M2_result) { 00103 00104 //For this version simple operator * is used. 00105 M2_result = M1 * M2_result; 00106 return M2_result; 00107 } 00108 00117 const Vector4 PS2Math::operator*(const Matrix44 &M, const Vector4 &V) { 00118 00119 Vector4 Result; 00120 Result[0] = M[0][0] * V[0] + M[0][1] * V[1] + M[0][2] * V[2] + M[0][3] * V[3]; 00121 Result[1] = M[1][0] * V[0] + M[1][1] * V[1] + M[1][2] * V[2] + M[1][3] * V[3]; 00122 Result[2] = M[2][0] * V[0] + M[2][1] * V[1] + M[2][2] * V[2] + M[2][3] * V[3]; 00123 Result[3] = M[3][0] * V[0] + M[3][1] * V[1] + M[3][2] * V[2] + M[3][3] * V[3]; 00124 00125 return Result; 00126 }