summary refs log tree commit diff
path: root/src/geom.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/geom.zig')
-rw-r--r--src/geom.zig36
1 files changed, 19 insertions, 17 deletions
diff --git a/src/geom.zig b/src/geom.zig
index c84d2aa..af6bd21 100644
--- a/src/geom.zig
+++ b/src/geom.zig
@@ -30,7 +30,7 @@ fn dot(u: anytype, v: @TypeOf(u)) Child(@TypeOf(u)) {
 }
 
 export fn sqrlen(v: XYZ) f32 {
-    const u = @bitCast(@Vector(3, f32), v);
+    const u: @Vector(3, f32) = @bitCast(v);
     return dot(u, u);
 }
 
@@ -39,7 +39,7 @@ fn norm(v: anytype) Child(@TypeOf(v)) {
 }
 
 export fn len(v: XYZ) f32 {
-    const u = @bitCast(@Vector(3, f32), v);
+    const u: @Vector(3, f32) = @bitCast(v);
     return norm(u);
 }
 
@@ -53,16 +53,20 @@ export fn crossProduct(u: XYZ, v: XYZ) XYZ {
     };
 }
 
+inline fn splat(x: f32) @Vector(3, f32) {
+    return @splat(x);
+}
+
 export fn normalize(v: XYZ) XYZ {
-    const u = @bitCast(@Vector(3, f32), v);
+    const u: @Vector(3, f32) = @bitCast(v);
     const d = norm(u);
-    return if (d == 0) v else @bitCast(XYZ, u / @splat(3, d));
+    return if (d == 0) v else @bitCast(u / splat(d));
 }
 
 export fn reflect(v: XYZ, n: XYZ) XYZ {
-    const u = @bitCast(@Vector(3, f32), v);
-    const m = @bitCast(@Vector(3, f32), n);
-    return @bitCast(XYZ, u - m * @splat(3, dot(u, m) * 2));
+    const u: @Vector(3, f32) = @bitCast(v);
+    const m: @Vector(3, f32) = @bitCast(n);
+    return @bitCast(u - m * splat(dot(u, m) * 2));
 }
 
 fn rotate2d(i: *f32, j: *f32, a: f32) void {
@@ -84,15 +88,15 @@ export fn rotate(v: XYZ, deg_x: f32, deg_y: f32, deg_z: f32) XYZ {
 
 export fn segmentIntersectsSphere(a: XYZ, b: XYZ, i: XYZ, r: f32) bool {
     // FIXME: call directly with vectors
-    const p = @bitCast(@Vector(3, f32), a);
-    const q = @bitCast(@Vector(3, f32), b);
-    const c = @bitCast(@Vector(3, f32), i);
+    const p: @Vector(3, f32) = @bitCast(a);
+    const q: @Vector(3, f32) = @bitCast(b);
+    const c: @Vector(3, f32) = @bitCast(i);
 
-    if (@reduce(.Or, @max(p, q) < c - @splat(3, r))) return false;
-    if (@reduce(.Or, @min(p, q) > c + @splat(3, r))) return false;
+    if (@reduce(.Or, @max(p, q) < c - splat(r))) return false;
+    if (@reduce(.Or, @min(p, q) > c + splat(r))) return false;
     // https://en.wikipedia.org/wiki/Line–sphere_intersection
     const d = q - p; // line's direction
-    const u = d / @splat(3, norm(d)); // unit vector
+    const u = d / splat(norm(d)); // unit vector
     return sqr(dot(u, (p - c))) >= @reduce(.Add, sqr(p - c)) - sqr(r);
 }
 
@@ -242,8 +246,7 @@ export fn setFrustum(frustum: [*][4]f32, p: [*]const f32,
 export fn cubeInFrustum(frustum: [*][4]f32,
                         x: f32, y: f32, z: f32, size: f32) bool {
     const delta = [_]f32{ -size, size };
-    var i = @as(u8, 0);
-    loop: while (i < 6) : (i += 1) {
+    loop: for (0..6) |i| {
         for (delta) |dx| for (delta) |dy| for (delta) |dz|
             if (frustum[i][0] * (x + dx) + frustum[i][1] * (y + dy)
                 + frustum[i][2] * (z + dz) + frustum[i][3] > 0) continue :loop;
@@ -254,8 +257,7 @@ export fn cubeInFrustum(frustum: [*][4]f32,
 
 export fn sphereInFrustum(frustum: [*][4]f32,
                           x: f32, y: f32, z: f32, r: f32) bool {
-    var i = @as(u8, 0);
-    while (i < 6) : (i += 1)
+    for (0..6) |i|
         if (frustum[i][0] * x + frustum[i][1] * y
             + frustum[i][2] * z + frustum[i][3] <= -r)
             return false;