From 9ba7a8c414d37ceedb12b56609c669599fc3556a Mon Sep 17 00:00:00 2001
From: Abdelrahman <said.abdelrahman89@gmail.com>
Date: Sun, 30 Jun 2024 00:09:22 +0100
Subject: [PATCH] Add vec4 types and functions

---
 include/vector/vec.h | 32 ++++++++++++++++++
 src/vector/vec.c     | 80 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 112 insertions(+)

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};
+}