nuclear@12: #include nuclear@12: #include nuclear@12: #include "mathutil.h" nuclear@12: nuclear@12: #define M(i, j) ((i) * 4 + (j)) nuclear@12: nuclear@12: static const float idmat[] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}; nuclear@12: nuclear@12: void rotation_matrix(const float *quat, float *matrix) nuclear@12: { nuclear@12: matrix[0] = 1.0 - 2.0 * quat[1] * quat[1] - 2.0 * quat[2] * quat[2]; nuclear@12: matrix[1] = 2.0 * quat[0] * quat[1] + 2.0 * quat[3] * quat[2]; nuclear@12: matrix[2] = 2.0 * quat[2] * quat[0] - 2.0 * quat[3] * quat[1]; nuclear@12: matrix[3] = 0.0f; nuclear@12: nuclear@12: matrix[4] = 2.0 * quat[0] * quat[1] - 2.0 * quat[3] * quat[2]; nuclear@12: matrix[5] = 1.0 - 2.0 * quat[0]*quat[0] - 2.0 * quat[2]*quat[2]; nuclear@12: matrix[6] = 2.0 * quat[1] * quat[2] + 2.0 * quat[3] * quat[0]; nuclear@12: matrix[7] = 0.0f; nuclear@12: nuclear@12: matrix[8] = 2.0 * quat[2] * quat[0] + 2.0 * quat[3] * quat[1]; nuclear@12: matrix[9] = 2.0 * quat[1] * quat[2] - 2.0 * quat[3] * quat[0]; nuclear@12: matrix[10] = 1.0 - 2.0 * quat[0]*quat[0] - 2.0 * quat[1]*quat[1]; nuclear@12: matrix[11] = 0.0f; nuclear@12: nuclear@12: matrix[12] = matrix[13] = matrix[14] = 0.0f; nuclear@12: matrix[15] = 1.0f; nuclear@12: nuclear@12: transpose_matrix(matrix); nuclear@12: } nuclear@12: nuclear@12: void translation_matrix(const float *vec, float *matrix) nuclear@12: { nuclear@12: memcpy(matrix, idmat, sizeof idmat); nuclear@12: matrix[12] = vec[0]; nuclear@12: matrix[13] = vec[1]; nuclear@12: matrix[14] = vec[2]; nuclear@12: } nuclear@12: nuclear@12: void mult_matrix(float *dest, const float *m1, const float *m2) nuclear@12: { nuclear@12: int i, j; nuclear@12: float tmp[16]; nuclear@12: nuclear@12: for(i=0; i<4; i++) { nuclear@12: for(j=0; j<4; j++) { nuclear@12: tmp[M(i, j)] = m1[M(i, 0)] * m2[M(0, j)] + m1[M(i, 1)] * m2[M(1, j)] + nuclear@12: m1[M(i, 2)] * m2[M(2, j)] + m1[M(i, 3)] * m2[M(3, j)]; nuclear@12: } nuclear@12: } nuclear@12: memcpy(dest, tmp, sizeof tmp); nuclear@12: } nuclear@12: nuclear@12: void transpose_matrix(float *matrix) nuclear@12: { nuclear@12: int i, j; nuclear@12: float tmp[16]; nuclear@12: nuclear@12: for(i=0; i<4; i++) { nuclear@12: for(j=0; j<4; j++) { nuclear@12: tmp[M(i, j)] = matrix[M(j, i)]; nuclear@12: } nuclear@12: } nuclear@12: memcpy(matrix, tmp, sizeof tmp); nuclear@12: } nuclear@12: nuclear@12: void print_matrix(const float *matrix) nuclear@12: { nuclear@12: int i, j; nuclear@12: nuclear@12: for(i=0; i<4; i++) { nuclear@12: putchar('['); nuclear@12: for(j=0; j<4; j++) { nuclear@12: printf("%6.3f ", matrix[M(i, j)]); nuclear@12: } nuclear@12: printf("]\n"); nuclear@12: } nuclear@12: }