diff --git a/src/linmath.h b/src/linmath.h index b1a2a8e..4ce880f 100644 --- a/src/linmath.h +++ b/src/linmath.h @@ -17,6 +17,7 @@ #define REPEAT_2(FN) REPEAT_1(FN) FN(1) #define REPEAT_3(FN) REPEAT_2(FN) FN(2) #define REPEAT_4(FN) REPEAT_3(FN) FN(3) +#define REPEAT_4N(FN) REPEAT_3(FN) FN(3) #define add(i) r[i] = a[i] + b[i]; #define set(i) r[i] = v; @@ -130,11 +131,7 @@ LINMATH_H_FUNC void vec4_reflect(vec4 r, vec4 const v, vec4 const n) { typedef vec4 mat4x4[4]; -LINMATH_H_FUNC void mat4x4_getPos(vec3 r, mat4x4 const M) { - r[0] = M[3][0]; - r[1] = M[3][1]; - r[2] = M[3][2]; -} +LINMATH_H_FUNC float *mat4x4_getPos(mat4x4 M) { return M[3]; } LINMATH_H_FUNC void mat4x4_identity(mat4x4 M) { int i, j; @@ -198,14 +195,36 @@ LINMATH_H_FUNC void mat4x4_mul(mat4x4 M, mat4x4 const a, mat4x4 const b) { } mat4x4_dup(M, temp); } + LINMATH_H_FUNC void mat4x4_mul_vec4(vec4 r, mat4x4 const M, vec4 const v) { - int i, j; - for (j = 0; j < 4; ++j) { - r[j] = 0.f; - for (i = 0; i < 4; ++i) - r[j] += M[i][j] * v[i]; - } + r[0] = M[0][0] * v[0]; + r[0] += M[1][0] * v[1]; + r[0] += M[2][0] * v[2]; + r[0] += M[3][0] * v[3]; + + r[1] = M[0][1] * v[0]; + r[1] += M[1][1] * v[1]; + r[1] += M[2][1] * v[2]; + r[1] += M[3][1] * v[3]; + + r[2] = M[0][2] * v[0]; + r[2] += M[1][2] * v[1]; + r[2] += M[2][2] * v[2]; + r[2] += M[3][2] * v[3]; + + r[3] = M[0][3] * v[0]; + r[3] += M[1][3] * v[1]; + r[3] += M[2][3] * v[2]; + r[3] += M[3][3] * v[3]; } +// LINMATH_H_FUNC void mat4x4_mul_vec4(vec4 r, mat4x4 const M, vec4 const v) { +// int i, j; +// for (j = 0; j < 4; ++j) { +// r[j] = 0.f; +// for (i = 0; i < 4; ++i) +// r[j] += M[i][j] * v[i]; +// } +// } LINMATH_H_FUNC void mat4x4_translate(mat4x4 T, float x, float y, float z) { mat4x4_identity(T); T[3][0] = x;