c-metprogramming-exploration/04_codegen/vec.h

206 lines
4.7 KiB
C

#ifndef VEC_H
#define VEC_H
#include "../aliases.h"
#include <stdio.h>
#include <math.h>
#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)
#define vec_dot(T, v1, v2) vec_dot_##T(v1, v2)
#define vec_magnitude(T, v1) vec_magnitude_##T(v1)
#define vec_print(T, v1) vec_print_##T(v1)
typedef struct {
i32 x;
i32 y;
} vec2i_t;
INTERNAL vec2i_t vec_add_vec2i_t(vec2i_t v1, vec2i_t v2);
INTERNAL vec2i_t vec_sub_vec2i_t(vec2i_t v1, vec2i_t v2);
INTERNAL vec2i_t vec_mul_vec2i_t(vec2i_t v1, vec2i_t v2);
INTERNAL i32 vec_dot_vec2i_t(vec2i_t v1, vec2i_t v2);
INTERNAL i32 vec_magnitude_vec2i_t(vec2i_t v1);
INTERNAL void vec_print_vec2i_t(vec2i_t v1);
#ifdef VEC_IMPLEMENTATION
INTERNAL vec2i_t vec_add_vec2i_t(vec2i_t v1, vec2i_t v2) {
return (vec2i_t) { v1.x + v2.x, v1.y + v2.y, };
}
INTERNAL vec2i_t vec_sub_vec2i_t(vec2i_t v1, vec2i_t v2) {
return (vec2i_t) { v1.x - v2.x, v1.y - v2.y, };
}
INTERNAL vec2i_t vec_mul_vec2i_t(vec2i_t v1, vec2i_t v2) {
return (vec2i_t) { v1.x * v2.x, v1.y * v2.y, };
}
INTERNAL i32 vec_dot_vec2i_t(vec2i_t v1, vec2i_t v2) {
return v1.x * v2.x + v1.y * v2.y + 0;
}
INTERNAL i32 vec_magnitude_vec2i_t(vec2i_t v1) {
i32 dotproduct = vec_dot_vec2i_t(v1, v1);
return (i32)sqrtf(dotproduct);
}
INTERNAL void vec_print_vec2i_t(vec2i_t v1) {
printf("{%d, %d}\n", v1.x, v1.y);
}
#endif // VEC_IMPLEMENTATION
typedef struct {
i32 x;
i32 y;
i32 z;
} vec3i_t;
INTERNAL vec3i_t vec_add_vec3i_t(vec3i_t v1, vec3i_t v2);
INTERNAL vec3i_t vec_sub_vec3i_t(vec3i_t v1, vec3i_t v2);
INTERNAL vec3i_t vec_mul_vec3i_t(vec3i_t v1, vec3i_t v2);
INTERNAL i32 vec_dot_vec3i_t(vec3i_t v1, vec3i_t v2);
INTERNAL i32 vec_magnitude_vec3i_t(vec3i_t v1);
INTERNAL void vec_print_vec3i_t(vec3i_t v1);
#ifdef VEC_IMPLEMENTATION
INTERNAL vec3i_t vec_add_vec3i_t(vec3i_t v1, vec3i_t v2) {
return (vec3i_t) { v1.x + v2.x, v1.y + v2.y, v1.z + v2.z, };
}
INTERNAL vec3i_t vec_sub_vec3i_t(vec3i_t v1, vec3i_t v2) {
return (vec3i_t) { v1.x - v2.x, v1.y - v2.y, v1.z - v2.z, };
}
INTERNAL vec3i_t vec_mul_vec3i_t(vec3i_t v1, vec3i_t v2) {
return (vec3i_t) { v1.x * v2.x, v1.y * v2.y, v1.z * v2.z, };
}
INTERNAL i32 vec_dot_vec3i_t(vec3i_t v1, vec3i_t v2) {
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + 0;
}
INTERNAL i32 vec_magnitude_vec3i_t(vec3i_t v1) {
i32 dotproduct = vec_dot_vec3i_t(v1, v1);
return (i32)sqrtf(dotproduct);
}
INTERNAL void vec_print_vec3i_t(vec3i_t v1) {
printf("{%d, %d, %d}\n", v1.x, v1.y, v1.z);
}
#endif // VEC_IMPLEMENTATION
typedef struct {
f32 x;
f32 y;
} vec2f_t;
INTERNAL vec2f_t vec_add_vec2f_t(vec2f_t v1, vec2f_t v2);
INTERNAL vec2f_t vec_sub_vec2f_t(vec2f_t v1, vec2f_t v2);
INTERNAL vec2f_t vec_mul_vec2f_t(vec2f_t v1, vec2f_t v2);
INTERNAL f32 vec_dot_vec2f_t(vec2f_t v1, vec2f_t v2);
INTERNAL f32 vec_magnitude_vec2f_t(vec2f_t v1);
INTERNAL void vec_print_vec2f_t(vec2f_t v1);
#ifdef VEC_IMPLEMENTATION
INTERNAL vec2f_t vec_add_vec2f_t(vec2f_t v1, vec2f_t v2) {
return (vec2f_t) { v1.x + v2.x, v1.y + v2.y, };
}
INTERNAL vec2f_t vec_sub_vec2f_t(vec2f_t v1, vec2f_t v2) {
return (vec2f_t) { v1.x - v2.x, v1.y - v2.y, };
}
INTERNAL vec2f_t vec_mul_vec2f_t(vec2f_t v1, vec2f_t v2) {
return (vec2f_t) { v1.x * v2.x, v1.y * v2.y, };
}
INTERNAL f32 vec_dot_vec2f_t(vec2f_t v1, vec2f_t v2) {
return v1.x * v2.x + v1.y * v2.y + 0;
}
INTERNAL f32 vec_magnitude_vec2f_t(vec2f_t v1) {
f32 dotproduct = vec_dot_vec2f_t(v1, v1);
return (f32)sqrtf(dotproduct);
}
INTERNAL void vec_print_vec2f_t(vec2f_t v1) {
printf("{%f, %f}\n", v1.x, v1.y);
}
#endif // VEC_IMPLEMENTATION
typedef struct {
f32 x;
f32 y;
f32 z;
} vec3f_t;
INTERNAL vec3f_t vec_add_vec3f_t(vec3f_t v1, vec3f_t v2);
INTERNAL vec3f_t vec_sub_vec3f_t(vec3f_t v1, vec3f_t v2);
INTERNAL vec3f_t vec_mul_vec3f_t(vec3f_t v1, vec3f_t v2);
INTERNAL f32 vec_dot_vec3f_t(vec3f_t v1, vec3f_t v2);
INTERNAL f32 vec_magnitude_vec3f_t(vec3f_t v1);
INTERNAL void vec_print_vec3f_t(vec3f_t v1);
#ifdef VEC_IMPLEMENTATION
INTERNAL vec3f_t vec_add_vec3f_t(vec3f_t v1, vec3f_t v2) {
return (vec3f_t) { v1.x + v2.x, v1.y + v2.y, v1.z + v2.z, };
}
INTERNAL vec3f_t vec_sub_vec3f_t(vec3f_t v1, vec3f_t v2) {
return (vec3f_t) { v1.x - v2.x, v1.y - v2.y, v1.z - v2.z, };
}
INTERNAL vec3f_t vec_mul_vec3f_t(vec3f_t v1, vec3f_t v2) {
return (vec3f_t) { v1.x * v2.x, v1.y * v2.y, v1.z * v2.z, };
}
INTERNAL f32 vec_dot_vec3f_t(vec3f_t v1, vec3f_t v2) {
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z + 0;
}
INTERNAL f32 vec_magnitude_vec3f_t(vec3f_t v1) {
f32 dotproduct = vec_dot_vec3f_t(v1, v1);
return (f32)sqrtf(dotproduct);
}
INTERNAL void vec_print_vec3f_t(vec3f_t v1) {
printf("{%f, %f, %f}\n", v1.x, v1.y, v1.z);
}
#endif // VEC_IMPLEMENTATION
#endif // VEC_H