diff --git a/include/vector/vec.h b/include/vector/vec.h index 3718f60..599e403 100644 --- a/include/vector/vec.h +++ b/include/vector/vec.h @@ -25,6 +25,20 @@ typedef struct { f32 z; } vec3f_t; +typedef struct { + i32 x; + i32 y; + i32 z; + i32 w; +} vec4i_t; + +typedef struct { + f32 x; + f32 y; + f32 z; + f32 w; +} vec4f_t; + #define vec_add(T, v1, v2) vec_add_##T(v1, v2) #define vec_sub(T, v1, v2) vec_sub_##T(v1, v2) #define vec_mul(T, v1, v2) vec_mul_##T(v1, v2) @@ -71,4 +85,22 @@ f32 vec_magnitude_vec3f_t(vec3f_t v); vec3f_t vec_unit_vec3f_t(vec3f_t v); vec3f_t vec_rotate_vec3f_t(vec3f_t original, vec3f_t rotation); +vec4i_t vec_add_vec4i_t(vec4i_t v1, vec4i_t v2); +vec4i_t vec_sub_vec4i_t(vec4i_t v1, vec4i_t v2); +vec4i_t vec_mul_vec4i_t(vec4i_t v1, vec4i_t v2); +vec4i_t vec_mul_num_vec4i_t(vec4i_t v1, i32 num); +vec4i_t vec_div_num_vec4i_t(vec4i_t v1, i32 num); +i32 vec_dot_vec4i_t(vec4i_t v1, vec4i_t v2); +i32 vec_magnitude_vec4i_t(vec4i_t v); +vec4i_t vec_unit_vec4i_t(vec4i_t v); + +vec4f_t vec_add_vec4f_t(vec4f_t v1, vec4f_t v2); +vec4f_t vec_sub_vec4f_t(vec4f_t v1, vec4f_t v2); +vec4f_t vec_mul_vec4f_t(vec4f_t v1, vec4f_t v2); +vec4f_t vec_mul_num_vec4f_t(vec4f_t v1, f32 num); +vec4f_t vec_div_num_vec4f_t(vec4f_t v1, f32 num); +f32 vec_dot_vec4f_t(vec4f_t v1, vec4f_t v2); +f32 vec_magnitude_vec4f_t(vec4f_t v); +vec4f_t vec_unit_vec4f_t(vec4f_t v); + #endif // !VEC_H diff --git a/src/vector/vec.c b/src/vector/vec.c index 04969e0..3a9d929 100644 --- a/src/vector/vec.c +++ b/src/vector/vec.c @@ -184,3 +184,83 @@ vec3f_t vec_rotate_vec3f_t(vec3f_t original, vec3f_t rotation) { }; // clang-format on } + +vec4i_t vec_add_vec4i_t(vec4i_t v1, vec4i_t v2) { + return (vec4i_t){ + .x = v1.x + v2.x, .y = v1.y + v2.y, .z = v1.z + v2.z, .w = v1.w + v2.w}; +} + +vec4i_t vec_sub_vec4i_t(vec4i_t v1, vec4i_t v2) { + return (vec4i_t){ + .x = v1.x - v2.x, .y = v1.y - v2.y, .z = v1.z - v2.z, .w = v1.w - v2.w}; +} + +vec4i_t vec_mul_vec4i_t(vec4i_t v1, vec4i_t v2) { + return (vec4i_t){ + .x = v1.x * v2.x, .y = v1.y * v2.y, .z = v1.z * v2.z, .w = v1.w * v2.w}; +} + +vec4i_t vec_mul_num_vec4i_t(vec4i_t v1, i32 num) { + return (vec4i_t){ + .x = v1.x * num, .y = v1.y * num, .z = v1.z * num, .w = v1.w * num}; +} + +vec4i_t vec_div_num_vec4i_t(vec4i_t v1, i32 num) { + return (vec4i_t){ + .x = v1.x / num, .y = v1.y / num, .z = v1.z / num, .w = v1.w / num}; +} + +i32 vec_dot_vec4i_t(vec4i_t v1, vec4i_t v2) { + return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + v1.w * v2.w; +} + +i32 vec_magnitude_vec4i_t(vec4i_t v) { + i32 dot_product = vec_dot_vec4i_t(v, v); + return (i32)sqrtf((f32)dot_product); +} + +vec4i_t vec_unit_vec4i_t(vec4i_t v) { + i32 magnitude = vec_magnitude_vec4i_t(v); + return (vec4i_t){v.x / magnitude, v.y / magnitude, v.z / magnitude, + v.w / magnitude}; +} + +vec4f_t vec_add_vec4f_t(vec4f_t v1, vec4f_t v2) { + return (vec4f_t){ + .x = v1.x + v2.x, .y = v1.y + v2.y, .z = v1.z + v2.z, .w = v1.w + v2.w}; +} + +vec4f_t vec_sub_vec4f_t(vec4f_t v1, vec4f_t v2) { + return (vec4f_t){ + .x = v1.x - v2.x, .y = v1.y - v2.y, .z = v1.z - v2.z, .w = v1.w - v2.w}; +} + +vec4f_t vec_mul_num_vec4f_t(vec4f_t v1, f32 num) { + return (vec4f_t){ + .x = v1.x * num, .y = v1.y * num, .z = v1.z * num, .w = v1.w * num}; +} + +vec4f_t vec_div_num_vec4f_t(vec4f_t v1, f32 num) { + return (vec4f_t){ + .x = v1.x / num, .y = v1.y / num, .z = v1.z / num, .w = v1.w / num}; +} + +vec4f_t vec_mul_vec4f_t(vec4f_t v1, vec4f_t v2) { + return (vec4f_t){ + .x = v1.x * v2.x, .y = v1.y * v2.y, .z = v1.z * v2.z, .w = v1.w * v2.w}; +} + +f32 vec_dot_vec4f_t(vec4f_t v1, vec4f_t v2) { + return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + v1.w * v2.w; +} + +f32 vec_magnitude_vec4f_t(vec4f_t v) { + f32 dot_product = vec_dot_vec4f_t(v, v); + return sqrtf(dot_product); +} + +vec4f_t vec_unit_vec4f_t(vec4f_t v) { + f32 magnitude = vec_magnitude_vec4f_t(v); + return (vec4f_t){v.x / magnitude, v.y / magnitude, v.z / magnitude, + v.w / magnitude}; +}