diff options
Diffstat (limited to 'vendors/_.c')
-rw-r--r-- | vendors/_.c | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/vendors/_.c b/vendors/_.c index 9092bad..fc7ce07 100644 --- a/vendors/_.c +++ b/vendors/_.c @@ -1,4 +1,5 @@ #include "_.h" +#include <math.h> #undef free #undef malloc #undef calloc @@ -77,3 +78,152 @@ _realloc(void *ptr, size_t size) panic("fucked up realloc, have fun debugging"); __builtin_unreachable(); } + +// mathematical vectors + +float2 +tofloat2(int2 a) +{ + return F2(a.x, a.y); +} + +int2 +toint2(float2 a) +{ + return I2(a.x, a.y); +} + +float2 +float2_sub(float2 a, float2 b) +{ + return F2(a.x - b.x, a.y - b.y); +} + +float2 +float2_add(float2 a, float2 b) +{ + return F2(a.x + b.x, a.y + b.y); +} + +float2 +float2_mul(float2 a, float x) +{ + return F2(a.x * x, a.y * x); +} + +float2 +float2_div(float2 a, float x) +{ + return F2(a.x / x, a.y / x); +} + +float +float2_length(float2 a) +{ + return sqrtf(a.x * a.x + a.y * a.y); +} + +float2 +float2_normalize(float2 a) +{ + const auto len = float2_length(a); + if (len < 1.0) + return a; + return F2(a.x / len, a.y / len); +} + +float +float2_angle(float2 a) +{ + return atanf(a.y / a.x) / 3.125 / 2 + 0.5 * (a.x < 0); +} + +int2 +float2_round(float2 a) +{ + return I2(roundf(a.x), roundf(a.y)); +} + +float2 +float2_clamp(float2 min, float2 a, float2 max) +{ + rfor (i, 0, 2) { + if (a.a[i] < min.a[i]) + a.a[i] = min.a[i]; + if (a.a[i] > max.a[i]) + a.a[i] = max.a[i]; + } + return a; +} + +float2 +float2_swp(float2 a) +{ + return F2(a.y, a.x); +} + +float2 +float2_lerp(float2 a, float2 b, float x) +{ + return float2_add(a, float2_mul(float2_sub(b, a), x)); +} + +int2 +int2_sub(int2 a, int2 b) +{ + return I2(a.x - b.x, a.y - b.y); +} + +int2 +int2_add(int2 a, int2 b) +{ + return I2(a.x + b.x, a.y + b.y); +} + +int2 +int2_mul(int2 a, float x) +{ + return I2(a.x * x, a.y * x); +} + +int2 +int2_div(int2 a, float x) +{ + return I2(a.x / x, a.y / x); +} + +static int +___abs(int a) +{ + return (a < 0) ? (-a) : (a); +} + +int2 +int2_abs(int2 a) +{ + return I2(___abs(a.x), ___abs(a.y)); +} + +int2 +int2_swp(int2 a) +{ + return I2(a.y, a.x); +} + +int2 +int2_inv(int2 a) +{ + return I2(-a.x, -a.y); +} + +int2 +int4_xy(int4 a) +{ + return I2(a.x, a.y); +} + +int2 +int4_zw(int4 a) +{ + return I2(a.z, a.w); +} |