diff options
Diffstat (limited to 'mons_math/src/vec4.c')
-rw-r--r-- | mons_math/src/vec4.c | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/mons_math/src/vec4.c b/mons_math/src/vec4.c new file mode 100644 index 0000000..d4474ee --- /dev/null +++ b/mons_math/src/vec4.c @@ -0,0 +1,149 @@ +#include "mons_math/vec4.h" +#include "mons_math/vec3.h" +#include "mons_math/util.h" +#include <math.h> +#include <stdio.h> + +mons_vec4 mons_vec4_add(mons_vec4 a, mons_vec4 b) { + mons_vec4 result = { + a.x + b.x, + a.y + b.y, + a.z + b.z, + a.w + b.w, + }; + return result; +} + +void mons_vec4_add_inplace(mons_vec4 *a, mons_vec4 b) { + a->x += b.x; + a->y += b.y; + a->z += b.z; + a->w += b.w; +} + +mons_vec4 mons_vec4_sub(mons_vec4 a, mons_vec4 b) { + mons_vec4 result = { + a.x - b.x, + a.y - b.y, + a.z - b.z, + a.w - b.w, + }; + return result; +} + +void mons_vec4_sub_inplace(mons_vec4 *a, mons_vec4 b) { + a->x -= b.x; + a->y -= b.y; + a->z -= b.z; + a->w -= b.w; +} + +mons_vec4 mons_vec4_mul_f(mons_vec4 a, float b) { + mons_vec4 result = { + a.x * b, + a.y * b, + a.z * b, + a.w * b, + }; + return result; +} + +mons_vec4 mons_vec4_mul_i(mons_vec4 a, int b) { + mons_vec4 result = { + a.x * b, + a.y * b, + a.z * b, + a.w * b, + }; + return result; +} + +void mons_vec4_mul_f_inplace(mons_vec4 *a, float b) { + a->x *= b; + a->y *= b; + a->z *= b; + a->w *= b; +} + +void mons_vec4_mul_i_inplace(mons_vec4 *a, int b) { + a->x *= b; + a->y *= b; + a->z *= b; + a->w *= b; +} + +mons_vec4 mons_vec4_div_f(mons_vec4 a, float b) { + return (mons_vec4) { + a.x / b, + a.y / b, + a.z / b, + a.w / b, + }; +} + +mons_vec4 mons_vec4_div_i(mons_vec4 a, int b) { + return (mons_vec4) { + a.x / b, + a.y / b, + a.z / b, + a.w / b, + }; +} + +void mons_vec4_div_f_inplace(mons_vec4 *a, float b) { + a->x /= b; + a->y /= b; + a->z /= b; + a->w /= b; +} + +void mons_vec4_div_i_inplace(mons_vec4 *a, int b) { + a->x /= b; + a->y /= b; + a->z /= b; + a->w /= b; +} + +float mons_vec4_dot(mons_vec4 a, mons_vec4 b) { + return (a.x * b.x) + (a.y * b.y) + (a.z * b.z) + (a.w * b.w); +} + +float mons_vec4_len(mons_vec4 a) { return sqrt(mons_vec4_len_squared(a)); } + +float mons_vec4_len_squared(mons_vec4 a) { + return (a.x * a.x) + (a.y * a.y) + (a.z * a.z) + (a.w * a.w); +} + +mons_vec3 mons_vec4_truncate(mons_vec4 a) { + mons_vec3 result = {a.x, a.y, a.z}; + return result; +} + +int mons_vec4_equal(mons_vec4 a, mons_vec4 b) { + return mons_float_approx_equal(a.x, b.x) + && mons_float_approx_equal(a.y, b.y) + && mons_float_approx_equal(a.z, b.z) + && mons_float_approx_equal(a.w, b.w); +} + +mons_vec4 mons_vec4_negate(mons_vec4 a) { + return mons_vec4_mul_i(a, -1); +} + +void mons_vec4_negate_inplace(mons_vec4 *a) { + mons_vec4_mul_i_inplace(a, -1); +} + +mons_vec4 mons_vec4_normalize(mons_vec4 a) { + float len = mons_vec4_len(a); + return mons_vec4_div_f(a, len); +} + +void mons_vec4_normalize_inplace(mons_vec4 *a) { + float len = mons_vec4_len(*a); + mons_vec4_div_f_inplace(a, len); +} + +void mons_vec4_print(mons_vec4 vec) { + printf("[%f, %f, %f, %f]", vec.x, vec.y, vec.z, vec.w); +} |