diff options
Diffstat (limited to 'eng/src/vec2.c')
-rw-r--r-- | eng/src/vec2.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/eng/src/vec2.c b/eng/src/vec2.c new file mode 100644 index 0000000..8586c52 --- /dev/null +++ b/eng/src/vec2.c @@ -0,0 +1,130 @@ +#include "vec2.h" + +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) +{ + forloop (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); +} + +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); +} |