#include "mons_math/vec4.h" #include "mons_math/vec3.h" #include "mons_math/util.h" #include #include 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); }