aboutsummaryrefslogtreecommitdiff
path: root/core/math.odin
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2017-07-18 18:05:41 +0100
committerGinger Bill <bill@gingerbill.org>2017-07-18 18:05:41 +0100
commitd16aa794921efd3c8e752645f3e5f922abc3aee8 (patch)
treef8b4f20b96d63ef87a9c069ea82ed157e5810c64 /core/math.odin
parent5af0acc4aff068f2afaa4366518ed6ac8c97e61a (diff)
General specialization for polymorphic parameters
Diffstat (limited to 'core/math.odin')
-rw-r--r--core/math.odin28
1 files changed, 14 insertions, 14 deletions
diff --git a/core/math.odin b/core/math.odin
index e3f525fc0..bf85b5026 100644
--- a/core/math.odin
+++ b/core/math.odin
@@ -112,36 +112,36 @@ to_degrees :: proc(radians: f32) -> f32 do return radians * 360 / TAU;
-dot :: proc(a, b: Vec2) -> f32 { c := a*b; return c.x + c.y; }
-dot :: proc(a, b: Vec3) -> f32 { c := a*b; return c.x + c.y + c.z; }
-dot :: proc(a, b: Vec4) -> f32 { c := a*b; return c.x + c.y + c.z + c.w; }
+dot :: proc(a, b: $T/[vector 2]$E) -> E { c := a*b; return c.x + c.y; }
+dot :: proc(a, b: $T/[vector 3]$E) -> E { c := a*b; return c.x + c.y + c.z; }
+dot :: proc(a, b: $T/[vector 4]$E) -> E { c := a*b; return c.x + c.y + c.z + c.w; }
-cross :: proc(x, y: Vec3) -> Vec3 {
+cross :: proc(x, y: $T/[vector 3]$E) -> T {
a := swizzle(x, 1, 2, 0) * swizzle(y, 2, 0, 1);
b := swizzle(x, 2, 0, 1) * swizzle(y, 1, 2, 0);
- return a - b;
+ return T(a - b);
}
-mag :: proc(v: Vec2) -> f32 do return sqrt(dot(v, v));
-mag :: proc(v: Vec3) -> f32 do return sqrt(dot(v, v));
-mag :: proc(v: Vec4) -> f32 do return sqrt(dot(v, v));
+mag :: proc(v: $T/[vector 2]$E) -> E do return sqrt(dot(v, v));
+mag :: proc(v: $T/[vector 3]$E) -> E do return sqrt(dot(v, v));
+mag :: proc(v: $T/[vector 4]$E) -> E do return sqrt(dot(v, v));
-norm :: proc(v: Vec2) -> Vec2 do return v / mag(v);
-norm :: proc(v: Vec3) -> Vec3 do return v / mag(v);
-norm :: proc(v: Vec4) -> Vec4 do return v / mag(v);
+norm :: proc(v: $T/[vector 2]$E) -> T do return v / mag(v);
+norm :: proc(v: $T/[vector 3]$E) -> T do return v / mag(v);
+norm :: proc(v: $T/[vector 4]$E) -> T do return v / mag(v);
-norm0 :: proc(v: Vec2) -> Vec2 {
+norm0 :: proc(v: $T/[vector 2]$E) -> T {
m := mag(v);
return m == 0 ? 0 : v/m;
}
-norm0 :: proc(v: Vec3) -> Vec3 {
+norm0 :: proc(v: $T/[vector 3]$E) -> T {
m := mag(v);
return m == 0 ? 0 : v/m;
}
-norm0 :: proc(v: Vec4) -> Vec4 {
+norm0 :: proc(v: $T/[vector 4]$E) -> T {
m := mag(v);
return m == 0 ? 0 : v/m;
}