summaryrefslogtreecommitdiff
path: root/vendors/_.c
diff options
context:
space:
mode:
Diffstat (limited to 'vendors/_.c')
-rw-r--r--vendors/_.c150
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);
+}