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.zig56
1 files changed, 25 insertions, 31 deletions
diff --git a/src/geom.zig b/src/geom.zig
index 96add58..c84d2aa 100644
--- a/src/geom.zig
+++ b/src/geom.zig
@@ -21,8 +21,6 @@ const Child = std.meta.Child;
 const degreesToRadians = std.math.degreesToRadians;
 const std = @import("std");
 
-const c = @import("cimport.zig");
-
 fn sqr(x: anytype) @TypeOf(x) {
     return x * x;
 }
@@ -77,50 +75,46 @@ fn rotate2d(i: *f32, j: *f32, a: f32) void {
 
 export fn rotate(v: XYZ, deg_x: f32, deg_y: f32, deg_z: f32) XYZ {
     var u = v;
-    rotate2d(&u.z, &u.x, degreesToRadians(f32, deg_y));
+    // TODO: optimize
     rotate2d(&u.x, &u.y, degreesToRadians(f32, deg_z));
+    rotate2d(&u.z, &u.x, degreesToRadians(f32, deg_y));
     rotate2d(&u.y, &u.z, degreesToRadians(f32, deg_x));
     return u;
 }
 
-export fn segmentIntersectsSphere(a: XYZ, b: XYZ, j: XYZ, r: f32) bool {
+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 i = @bitCast(@Vector(3, f32), j);
+    const c = @bitCast(@Vector(3, f32), i);
 
-    if (@reduce(.Or, @max(p, q) < i - @splat(3, r))) return false;
-    if (@reduce(.Or, @min(p, q) > i + @splat(3, r))) return false;
+    if (@reduce(.Or, @max(p, q) < c - @splat(3, r))) return false;
+    if (@reduce(.Or, @min(p, q) > c + @splat(3, 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
-    return sqr(dot(u, (p - i))) >= @reduce(.Add, sqr(p - i)) - sqr(r);
+    return sqr(dot(u, (p - c))) >= @reduce(.Add, sqr(p - c)) - sqr(r);
 }
 
-export fn getFrustum(frustum: [*][4]f32) void {
-    var proj: [16]f32 = undefined;
-    c.glGetFloatv(c.GL_PROJECTION_MATRIX, &proj);
-
-    var mv: [16]f32 = undefined;
-    c.glGetFloatv(c.GL_MODELVIEW_MATRIX, &mv);
-
+export fn setFrustum(frustum: [*][4]f32, p: [*]const f32,
+                     mv: [*] const f32) void {
     const clip = [16]f32{
-        mv[0] * proj[0] + mv[1] * proj[4] + mv[2] * proj[8] + mv[3] * proj[12],
-        mv[0] * proj[1] + mv[1] * proj[5] + mv[2] * proj[9] + mv[3] * proj[13],
-        mv[0] * proj[2] + mv[1] * proj[6] + mv[2] * proj[10] + mv[3] * proj[14],
-        mv[0] * proj[3] + mv[1] * proj[7] + mv[2] * proj[11] + mv[3] * proj[15],
-        mv[4] * proj[0] + mv[5] * proj[4] + mv[6] * proj[8] + mv[7] * proj[12],
-        mv[4] * proj[1] + mv[5] * proj[5] + mv[6] * proj[9] + mv[7] * proj[13],
-        mv[4] * proj[2] + mv[5] * proj[6] + mv[6] * proj[10] + mv[7] * proj[14],
-        mv[4] * proj[3] + mv[5] * proj[7] + mv[6] * proj[11] + mv[7] * proj[15],
-        mv[8] * proj[0] + mv[9] * proj[4] + mv[10] * proj[8] + mv[11] * proj[12],
-        mv[8] * proj[1] + mv[9] * proj[5] + mv[10] * proj[9] + mv[11] * proj[13],
-        mv[8] * proj[2] + mv[9] * proj[6] + mv[10] * proj[10] + mv[11] * proj[14],
-        mv[8] * proj[3] + mv[9] * proj[7] + mv[10] * proj[11] + mv[11] * proj[15],
-        mv[12] * proj[0] + mv[13] * proj[4] + mv[14] * proj[8] + mv[15] * proj[12],
-        mv[12] * proj[1] + mv[13] * proj[5] + mv[14] * proj[9] + mv[15] * proj[13],
-        mv[12] * proj[2] + mv[13] * proj[6] + mv[14] * proj[10] + mv[15] * proj[14],
-        mv[12] * proj[3] + mv[13] * proj[7] + mv[14] * proj[11] + mv[15] * proj[15],
+        mv[0] * p[0] + mv[1] * p[4] + mv[2] * p[8] + mv[3] * p[12],
+        mv[0] * p[1] + mv[1] * p[5] + mv[2] * p[9] + mv[3] * p[13],
+        mv[0] * p[2] + mv[1] * p[6] + mv[2] * p[10] + mv[3] * p[14],
+        mv[0] * p[3] + mv[1] * p[7] + mv[2] * p[11] + mv[3] * p[15],
+        mv[4] * p[0] + mv[5] * p[4] + mv[6] * p[8] + mv[7] * p[12],
+        mv[4] * p[1] + mv[5] * p[5] + mv[6] * p[9] + mv[7] * p[13],
+        mv[4] * p[2] + mv[5] * p[6] + mv[6] * p[10] + mv[7] * p[14],
+        mv[4] * p[3] + mv[5] * p[7] + mv[6] * p[11] + mv[7] * p[15],
+        mv[8] * p[0] + mv[9] * p[4] + mv[10] * p[8] + mv[11] * p[12],
+        mv[8] * p[1] + mv[9] * p[5] + mv[10] * p[9] + mv[11] * p[13],
+        mv[8] * p[2] + mv[9] * p[6] + mv[10] * p[10] + mv[11] * p[14],
+        mv[8] * p[3] + mv[9] * p[7] + mv[10] * p[11] + mv[11] * p[15],
+        mv[12] * p[0] + mv[13] * p[4] + mv[14] * p[8] + mv[15] * p[12],
+        mv[12] * p[1] + mv[13] * p[5] + mv[14] * p[9] + mv[15] * p[13],
+        mv[12] * p[2] + mv[13] * p[6] + mv[14] * p[10] + mv[15] * p[14],
+        mv[12] * p[3] + mv[13] * p[7] + mv[14] * p[11] + mv[15] * p[15],
     };
 
     // Right plane