nuclear@1: #include "vmathmat.h" nuclear@1: #include "vmath.h" nuclear@1: nuclear@1: void Matrix4x4::lookat(const Vector3 &pos, const Vector3 &targ, const Vector3 &up) nuclear@1: { nuclear@1: Vector3 vk = normalize(targ - pos); nuclear@1: Vector3 vj = normalize(up); nuclear@1: Vector3 vi = normalize(cross(vk, vj)); nuclear@1: vj = cross(vi, vk); nuclear@1: nuclear@1: Matrix4x4 m( nuclear@1: vi.x, vi.y, vi.z, 0, nuclear@1: vj.x, vj.y, vj.z, 0, nuclear@1: -vk.x, -vk.y, -vk.z, 0, nuclear@1: 0, 0, 0, 1); nuclear@1: translate(-pos.x, -pos.y, -pos.z); nuclear@1: *this = *this * m; nuclear@1: } nuclear@12: nuclear@12: void Matrix4x4::transpose() nuclear@12: { nuclear@12: Matrix4x4 tmp = *this; nuclear@12: for(int i=0; i<4; i++) { nuclear@12: for(int j=0; j<4; j++) { nuclear@12: m[i][j] = tmp[j][i]; nuclear@12: } nuclear@12: } nuclear@12: } nuclear@12: nuclear@12: float Matrix4x4::determinant() const nuclear@12: { nuclear@12: float det11 = (m[1][1] * (m[2][2] * m[3][3] - m[3][2] * m[2][3])) - nuclear@12: (m[1][2] * (m[2][1] * m[3][3] - m[3][1] * m[2][3])) + nuclear@12: (m[1][3] * (m[2][1] * m[3][2] - m[3][1] * m[2][2])); nuclear@12: nuclear@12: float det12 = (m[1][0] * (m[2][2] * m[3][3] - m[3][2] * m[2][3])) - nuclear@12: (m[1][2] * (m[2][0] * m[3][3] - m[3][0] * m[2][3])) + nuclear@12: (m[1][3] * (m[2][0] * m[3][2] - m[3][0] * m[2][2])); nuclear@12: nuclear@12: float det13 = (m[1][0] * (m[2][1] * m[3][3] - m[3][1] * m[2][3])) - nuclear@12: (m[1][1] * (m[2][0] * m[3][3] - m[3][0] * m[2][3])) + nuclear@12: (m[1][3] * (m[2][0] * m[3][1] - m[3][0] * m[2][1])); nuclear@12: nuclear@12: float det14 = (m[1][0] * (m[2][1] * m[3][2] - m[3][1] * m[2][2])) - nuclear@12: (m[1][1] * (m[2][0] * m[3][2] - m[3][0] * m[2][2])) + nuclear@12: (m[1][2] * (m[2][0] * m[3][1] - m[3][0] * m[2][1])); nuclear@12: nuclear@12: return m[0][0] * det11 - m[0][1] * det12 + m[0][2] * det13 - m[0][3] * det14; nuclear@12: } nuclear@12: nuclear@12: nuclear@12: Matrix4x4 Matrix4x4::adjoint() const nuclear@12: { nuclear@12: Matrix4x4 coef; nuclear@12: nuclear@12: coef.m[0][0] = (m[1][1] * (m[2][2] * m[3][3] - m[3][2] * m[2][3])) - nuclear@12: (m[1][2] * (m[2][1] * m[3][3] - m[3][1] * m[2][3])) + nuclear@12: (m[1][3] * (m[2][1] * m[3][2] - m[3][1] * m[2][2])); nuclear@12: coef.m[0][1] = (m[1][0] * (m[2][2] * m[3][3] - m[3][2] * m[2][3])) - nuclear@12: (m[1][2] * (m[2][0] * m[3][3] - m[3][0] * m[2][3])) + nuclear@12: (m[1][3] * (m[2][0] * m[3][2] - m[3][0] * m[2][2])); nuclear@12: coef.m[0][2] = (m[1][0] * (m[2][1] * m[3][3] - m[3][1] * m[2][3])) - nuclear@12: (m[1][1] * (m[2][0] * m[3][3] - m[3][0] * m[2][3])) + nuclear@12: (m[1][3] * (m[2][0] * m[3][1] - m[3][0] * m[2][1])); nuclear@12: coef.m[0][3] = (m[1][0] * (m[2][1] * m[3][2] - m[3][1] * m[2][2])) - nuclear@12: (m[1][1] * (m[2][0] * m[3][2] - m[3][0] * m[2][2])) + nuclear@12: (m[1][2] * (m[2][0] * m[3][1] - m[3][0] * m[2][1])); nuclear@12: nuclear@12: coef.m[1][0] = (m[0][1] * (m[2][2] * m[3][3] - m[3][2] * m[2][3])) - nuclear@12: (m[0][2] * (m[2][1] * m[3][3] - m[3][1] * m[2][3])) + nuclear@12: (m[0][3] * (m[2][1] * m[3][2] - m[3][1] * m[2][2])); nuclear@12: coef.m[1][1] = (m[0][0] * (m[2][2] * m[3][3] - m[3][2] * m[2][3])) - nuclear@12: (m[0][2] * (m[2][0] * m[3][3] - m[3][0] * m[2][3])) + nuclear@12: (m[0][3] * (m[2][0] * m[3][2] - m[3][0] * m[2][2])); nuclear@12: coef.m[1][2] = (m[0][0] * (m[2][1] * m[3][3] - m[3][1] * m[2][3])) - nuclear@12: (m[0][1] * (m[2][0] * m[3][3] - m[3][0] * m[2][3])) + nuclear@12: (m[0][3] * (m[2][0] * m[3][1] - m[3][0] * m[2][1])); nuclear@12: coef.m[1][3] = (m[0][0] * (m[2][1] * m[3][2] - m[3][1] * m[2][2])) - nuclear@12: (m[0][1] * (m[2][0] * m[3][2] - m[3][0] * m[2][2])) + nuclear@12: (m[0][2] * (m[2][0] * m[3][1] - m[3][0] * m[2][1])); nuclear@12: nuclear@12: coef.m[2][0] = (m[0][1] * (m[1][2] * m[3][3] - m[3][2] * m[1][3])) - nuclear@12: (m[0][2] * (m[1][1] * m[3][3] - m[3][1] * m[1][3])) + nuclear@12: (m[0][3] * (m[1][1] * m[3][2] - m[3][1] * m[1][2])); nuclear@12: coef.m[2][1] = (m[0][0] * (m[1][2] * m[3][3] - m[3][2] * m[1][3])) - nuclear@12: (m[0][2] * (m[1][0] * m[3][3] - m[3][0] * m[1][3])) + nuclear@12: (m[0][3] * (m[1][0] * m[3][2] - m[3][0] * m[1][2])); nuclear@12: coef.m[2][2] = (m[0][0] * (m[1][1] * m[3][3] - m[3][1] * m[1][3])) - nuclear@12: (m[0][1] * (m[1][0] * m[3][3] - m[3][0] * m[1][3])) + nuclear@12: (m[0][3] * (m[1][0] * m[3][1] - m[3][0] * m[1][1])); nuclear@12: coef.m[2][3] = (m[0][0] * (m[1][1] * m[3][2] - m[3][1] * m[1][2])) - nuclear@12: (m[0][1] * (m[1][0] * m[3][2] - m[3][0] * m[1][2])) + nuclear@12: (m[0][2] * (m[1][0] * m[3][1] - m[3][0] * m[1][1])); nuclear@12: nuclear@12: coef.m[3][0] = (m[0][1] * (m[1][2] * m[2][3] - m[2][2] * m[1][3])) - nuclear@12: (m[0][2] * (m[1][1] * m[2][3] - m[2][1] * m[1][3])) + nuclear@12: (m[0][3] * (m[1][1] * m[2][2] - m[2][1] * m[1][2])); nuclear@12: coef.m[3][1] = (m[0][0] * (m[1][2] * m[2][3] - m[2][2] * m[1][3])) - nuclear@12: (m[0][2] * (m[1][0] * m[2][3] - m[2][0] * m[1][3])) + nuclear@12: (m[0][3] * (m[1][0] * m[2][2] - m[2][0] * m[1][2])); nuclear@12: coef.m[3][2] = (m[0][0] * (m[1][1] * m[2][3] - m[2][1] * m[1][3])) - nuclear@12: (m[0][1] * (m[1][0] * m[2][3] - m[2][0] * m[1][3])) + nuclear@12: (m[0][3] * (m[1][0] * m[2][1] - m[2][0] * m[1][1])); nuclear@12: coef.m[3][3] = (m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2])) - nuclear@12: (m[0][1] * (m[1][0] * m[2][2] - m[2][0] * m[1][2])) + nuclear@12: (m[0][2] * (m[1][0] * m[2][1] - m[2][0] * m[1][1])); nuclear@12: nuclear@12: coef.transpose(); nuclear@12: nuclear@12: for(int i=0; i<4; i++) { nuclear@12: for(int j=0; j<4; j++) { nuclear@12: coef.m[i][j] = j % 2 ? -coef.m[i][j] : coef.m[i][j]; nuclear@12: if(i % 2) coef.m[i][j] = -coef.m[i][j]; nuclear@12: } nuclear@12: } nuclear@12: nuclear@12: return coef; nuclear@12: } nuclear@12: nuclear@12: Matrix4x4 Matrix4x4::inverse() const nuclear@12: { nuclear@12: Matrix4x4 adj = adjoint(); nuclear@12: return adj * (1.0f / determinant()); nuclear@12: }