diff --git a/src/math/mat4.c b/src/math/mat4.c index 55c32ce..58372ba 100644 --- a/src/math/mat4.c +++ b/src/math/mat4.c @@ -1,68 +1,92 @@ #include "mat4.h" +Mat4f_t* mat4f_from_array_r(Mat4f_t *__restrict m, const float arr[16]) +{ + for(int i = 0; im[i], line); +#elif defined (SIMD_ARCH) + float32x4_t line = vld1q_f32(&arr[i]); + vst1q_f32(&m->m[i], line); +#else + for(int j = 0; jm[i+j] = arr[i+j]; + } +#endif + } + return m; +} + Mat4f_t mat4f_from_array(const float arr[16]) { Mat4f_t mat; + mat4f_from_array_r(&mat, arr); + return mat; +} + +Mat4f_t* mat4f_scalar_r(Mat4f_t *__restrict m, float f) +{ for(int i = 0; im[i], line_scalar); + #elif defined (SIMD_ARCH) - float32x4_t line = vld1q_f32(&arr[i]); - vst1q_f32(&mat.m[i], line); + float32x4_t line_scalar = vdupq_n_f32(f); + vst1q_f32(&m->m[i], line_scalar); + #else for(int j = 0; jm[i+j] = f; + } + #endif } - return mat; + return m; } Mat4f_t mat4f_scalar(float f) { Mat4f_t mat; - for(int i = 0; im[i], line_zero); + } + + return m; +#else + return mat4f_scalar_r(m, 0.f); +#endif +} + Mat4f_t mat4f_zero() { -#if defined (SIMD_X86) Mat4f_t mat; - - for(int i = 0; im[0] = 1.f; + m->m[5] = 1.f; + m->m[10] = 1.f; + m->m[15] = 1.f; + return m; } Mat4f_t mat4f_identity() { - Mat4f_t mat = mat4f_zero(); - mat.m[0] = 1.f; - mat.m[5] = 1.f; - mat.m[10] = 1.f; - mat.m[15] = 1.f; + Mat4f_t mat; + mat4f_identity_r(&mat); return mat; } @@ -134,7 +158,7 @@ Mat4f_t mat4_sub(const Mat4f_t* m1, const Mat4f_t* m2) return mout; } -Mat4f_t* mat4f_scale_r(Mat4f_t *out, float scalar) +Mat4f_t* mat4f_scale_r(Mat4f_t *__restrict out, float scalar) { for(int i = 0; im; -Mat4f_t* mat4f_inv_r(Mat4f_t* __restrict m) -{ - return m; + float det; + det = + a[0] * (a[5]*(a[10]*a[15] - a[11]*a[14]) - a[9]*(a[6]*a[15] - a[7]*a[14]) + a[13]*(a[6]*a[11] - a[7]*a[10])) - + a[4] * (a[1]*(a[10]*a[15] - a[11]*a[14]) - a[9]*(a[2]*a[15] - a[3]*a[14]) + a[13]*(a[2]*a[11] - a[3]*a[10])) + + a[8] * (a[1]*(a[6]*a[15] - a[7]*a[14]) - a[5]*(a[2]*a[15] - a[3]*a[14]) + a[13]*(a[2]*a[7] - a[3]*a[6])) - + a[12]* (a[1]*(a[6]*a[11] - a[7]*a[10]) - a[5]*(a[2]*a[11] - a[3]*a[10]) + a[9] *(a[2]*a[7] - a[3]*a[6])); + + return det; } Mat4f_t mat4f_inv(const Mat4f_t* m) diff --git a/src/math/mat4.h b/src/math/mat4.h index 21da714..ff19be7 100644 --- a/src/math/mat4.h +++ b/src/math/mat4.h @@ -1,6 +1,9 @@ #ifndef MATRIX4_H #define MATRIX4_H +#include +#include + #if defined(__x86_64__) || defined(__amd64__) || defined(_M_X64) #define SIMD_X86 #include @@ -26,9 +29,16 @@ typedef struct float m[MAT_SIZE]; } ALIGN16 Mat4f_t; +Mat4f_t* mat4f_from_array_r(Mat4f_t *__restrict m, const float arr[16]); Mat4f_t mat4f_from_array(const float arr[16]); + +Mat4f_t* mat4f_scalar_r(Mat4f_t *__restrict m, float f); Mat4f_t mat4f_scalar(float f); + +Mat4f_t* mat4f_zero_r(Mat4f_t *__restrict m); Mat4f_t mat4f_zero(void); + +Mat4f_t* mat4f_identity_r(Mat4f_t *__restrict m); Mat4f_t mat4f_identity(void); inline static Mat4f_t mat4f_clone(const Mat4f_t *__restrict out) diff --git a/tests/tests_config.c b/tests/tests_config.c deleted file mode 100644 index 2f9ab8c..0000000 --- a/tests/tests_config.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "../src/math/mat4.h" -#include - -void config() { - #if defined (SIMD_X86) - printf("SIMD enabled: X86\n"); - #elif defined (SIMD_ARCH) - printf("SIMD enabled: ARCH\n"); - #else - printf("SIMD disabled\n"); - #endif -} - -int main() { - config(); -} \ No newline at end of file diff --git a/tests/tests_vec3f.c b/tests/tests_vec3f.c index 1ef9a54..c046948 100644 --- a/tests/tests_vec3f.c +++ b/tests/tests_vec3f.c @@ -9,7 +9,6 @@ #include #include "../src/math/vec3.h" -#include "../src/math/vec4.h" #define EPSILON 1e-6f