aboutsummaryrefslogtreecommitdiff
path: root/eng/src/vec2.c
diff options
context:
space:
mode:
Diffstat (limited to 'eng/src/vec2.c')
-rw-r--r--eng/src/vec2.c130
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);
+}