diff options
Diffstat (limited to 'src/geom.zig')
-rw-r--r-- | src/geom.zig | 36 |
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; |