summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Globals.cpp11
-rw-r--r--src/Quaternions.cpp61
-rw-r--r--src/geom.zig247
-rw-r--r--src/main.zig4
-rw-r--r--src/misc.zig226
5 files changed, 269 insertions, 280 deletions
diff --git a/src/Globals.cpp b/src/Globals.cpp
index a22955b..2760674 100644
--- a/src/Globals.cpp
+++ b/src/Globals.cpp
@@ -54,17 +54,6 @@ float a1,a2,a3;
 float total,denom,mu;
 XYZ n,pa1,pa2,pa3;
 
-float u0, u1, u2;
-float v0, v1, v2;
-float a, b;
-int i, j;
-bool bInter;
-float pointv[3];
-float p1v[3];
-float p2v[3];
-float p3v[3];
-float normalv[3];
-
 XYZ vel;
 XYZ midp;
 XYZ newpoint1,newpoint2;
diff --git a/src/Quaternions.cpp b/src/Quaternions.cpp
index 2de000b..2c01da9 100644
--- a/src/Quaternions.cpp
+++ b/src/Quaternions.cpp
@@ -2,41 +2,16 @@
 
 #include "Quaternions.h"
 
-extern float u0, u1, u2;
-extern float v0, v1, v2;
-extern float a, b;
-extern int i, j;
-extern bool bInter;
-extern float pointv[3];
-extern float p1v[3];
-extern float p2v[3];
-extern float p3v[3];
-extern float normalv[3];
-
 bool PointInTriangle(XYZ *p, XYZ normal, XYZ *p1, XYZ *p2, XYZ *p3)
 {
-	bInter=0;
-
-	pointv[0]=p->x;
-	pointv[1]=p->y;
-	pointv[2]=p->z;
-
-	p1v[0]=p1->x;
-	p1v[1]=p1->y;
-	p1v[2]=p1->z;
-
-	p2v[0]=p2->x;
-	p2v[1]=p2->y;
-	p2v[2]=p2->z;
-
-	p3v[0]=p3->x;
-	p3v[1]=p3->y;
-	p3v[2]=p3->z;
-
-	normalv[0]=normal.x;
-	normalv[1]=normal.y;
-	normalv[2]=normal.z;
-
+	bool bInter = false;
+	float pointv[3] { p->x, p->y, p->z };
+	float p1v[3] { p1->x, p1->y, p1->z };
+	float p2v[3] { p2->x, p2->y, p2->z };
+	float p3v[3] { p3->x, p3->y, p3->z };
+	float normalv[3] { normal.x, normal.y, normal.z };
+
+	int i = 0, j = 0;
 #define ABS(X) (((X)<0.f)?-(X):(X) )
 #define MAX(A, B) (((A)<(B))?(B):(A))
 	float max = MAX(MAX(ABS(normalv[0]), ABS(normalv[1])), ABS(normalv[2]));
@@ -46,29 +21,29 @@ bool PointInTriangle(XYZ *p, XYZ normal, XYZ *p1, XYZ *p2, XYZ *p3)
 	if (max == ABS(normalv[2])) {i = 0; j = 1;} // x, y
 #undef ABS
 
-	u0 = pointv[i] - p1v[i];
-	v0 = pointv[j] - p1v[j];
-	u1 = p2v[i] - p1v[i];
-	v1 = p2v[j] - p1v[j];
-	u2 = p3v[i] - p1v[i];
-	v2 = p3v[j] - p1v[j];
+	float u0 = pointv[i] - p1v[i];
+	float v0 = pointv[j] - p1v[j];
+	float u1 = p2v[i] - p1v[i];
+	float v1 = p2v[j] - p1v[j];
+	float u2 = p3v[i] - p1v[i];
+	float v2 = p3v[j] - p1v[j];
 
 	if (u1 > -1.0e-05f && u1 < 1.0e-05f)// == 0.0f)
 	{
-		b = u0 / u2;
+		float b = u0 / u2;
 		if (0.0f <= b && b <= 1.0f)
 		{
-			a = (v0 - b * v2) / v1;
+			float a = (v0 - b * v2) / v1;
 			if ((a >= 0.0f) && (( a + b ) <= 1.0f))
 				bInter = 1;
 		}
 	}
 	else
 	{
-		b = (v0 * u1 - u0 * v1) / (v2 * u1 - u2 * v1);
+		float b = (v0 * u1 - u0 * v1) / (v2 * u1 - u2 * v1);
 		if (0.0f <= b && b <= 1.0f)
 		{
-			a = (u0 - b * u2) / u1;
+			float a = (u0 - b * u2) / u1;
 			if ((a >= 0.0f) && (( a + b ) <= 1.0f ))
 				bInter = 1;
 		}
diff --git a/src/geom.zig b/src/geom.zig
new file mode 100644
index 0000000..910f355
--- /dev/null
+++ b/src/geom.zig
@@ -0,0 +1,247 @@
+// Geometry functions
+// Copyright (C) 2002  David Rosen
+// Copyright (C) 2023  Nguyễn Gia Phong
+//
+// This file is part of Black Shades.
+//
+// Black Shades is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published
+// by the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Black Shades is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Black Shades.  If not, see <https://www.gnu.org/licenses/>.
+
+const Child = std.meta.Child;
+const std = @import("std");
+
+const c = @import("cimport.zig");
+
+fn sqr(x: anytype) @TypeOf(x) {
+    return x * x;
+}
+
+fn dot(u: anytype, v: @TypeOf(u)) Child(@TypeOf(u)) {
+    return @reduce(.Add, u * v);
+}
+
+export fn sqrlen(v: XYZ) f32 {
+    const u = @bitCast(@Vector(3, f32), v);
+    return dot(u, u);
+}
+
+fn norm(v: anytype) Child(@TypeOf(v)) {
+    return @sqrt(dot(v, v));
+}
+
+const XYZ = extern struct { x: f32, y: f32, z: f32 };
+
+export fn crossProduct(u: XYZ, v: XYZ) XYZ {
+    return .{
+        .x = u.y * v.z - u.z * v.y,
+        .y = u.z * v.x - u.x * v.z,
+        .z = u.x * v.y - u.y * v.x,
+    };
+}
+
+export fn normalize(v: XYZ) XYZ {
+    const u = @bitCast(@Vector(3, f32), v);
+    const d = norm(u);
+    return if (d == 0) v else @bitCast(XYZ, u / @splat(3, 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));
+}
+
+export fn segmentIntersectsSphere(a: XYZ, b: XYZ, j: 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);
+
+    if (@reduce(.Or, @max(p, q) < i - @splat(3, r))) return false;
+    if (@reduce(.Or, @min(p, q) > i + @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);
+}
+
+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);
+
+    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],
+    };
+
+    // Right plane
+    frustum[0][0] = clip[3] - clip[0];
+    frustum[0][1] = clip[7] - clip[4];
+    frustum[0][2] = clip[11] - clip[8];
+    frustum[0][3] = clip[15] - clip[12];
+
+    // Left plane
+    frustum[1][0] = clip[3] + clip[0];
+    frustum[1][1] = clip[7] + clip[4];
+    frustum[1][2] = clip[11] + clip[8];
+    frustum[1][3] = clip[15] + clip[12];
+
+    // Bottom plane
+    frustum[2][0] = clip[3] + clip[1];
+    frustum[2][1] = clip[7] + clip[5];
+    frustum[2][2] = clip[11] + clip[9];
+    frustum[2][3] = clip[15] + clip[13];
+
+    // Top plane
+    frustum[3][0] = clip[3] - clip[1];
+    frustum[3][1] = clip[7] - clip[5];
+    frustum[3][2] = clip[11] - clip[9];
+    frustum[3][3] = clip[15] - clip[13];
+
+    // Far plane
+    frustum[4][0] = clip[3] - clip[2];
+    frustum[4][1] = clip[7] - clip[6];
+    frustum[4][2] = clip[11] - clip[10];
+    frustum[4][3] = clip[15] - clip[14];
+
+    // Near plane
+    frustum[5][0] = clip[3] + clip[2];
+    frustum[5][1] = clip[7] + clip[6];
+    frustum[5][2] = clip[11] + clip[10];
+    frustum[5][3] = clip[15] + clip[14];
+
+    // normalize the right plane
+    var t: f32 = undefined;
+    t = @sqrt(frustum[0][0]*frustum[0][0]
+        + frustum[0][1]*frustum[0][1]
+        + frustum[0][2]*frustum[0][2]);
+    frustum[0][0] /= t;
+    frustum[0][1] /= t;
+    frustum[0][2] /= t;
+    frustum[0][3] /= t;
+
+    // calculate left plane
+    frustum[1][0] = clip[3] + clip[0];
+    frustum[1][1] = clip[7] + clip[4];
+    frustum[1][2] = clip[11] + clip[ 8];
+    frustum[1][3] = clip[15] + clip[12];
+
+    // normalize the left plane
+    t = @sqrt(frustum[1][0]*frustum[1][0]
+        + frustum[1][1]*frustum[1][1]
+        + frustum[1][2]*frustum[1][2]);
+    frustum[1][0] /= t;
+    frustum[1][1] /= t;
+    frustum[1][2] /= t;
+    frustum[1][3] /= t;
+
+    // calculate the bottom plane
+    frustum[2][0] = clip[3] + clip[1];
+    frustum[2][1] = clip[7] + clip[5];
+    frustum[2][2] = clip[11] + clip[9];
+    frustum[2][3] = clip[15] + clip[13];
+
+    // normalize the bottom plane
+    t = @sqrt(frustum[2][0]*frustum[2][0]
+        + frustum[2][1]*frustum[2][1]
+        + frustum[2][2]*frustum[2][2]);
+    frustum[2][0] /= t;
+    frustum[2][1] /= t;
+    frustum[2][2] /= t;
+    frustum[2][3] /= t;
+
+    // calculate the top plane
+    frustum[3][0] = clip[3] - clip[1];
+    frustum[3][1] = clip[7] - clip[5];
+    frustum[3][2] = clip[11] - clip[9];
+    frustum[3][3] = clip[15] - clip[13];
+
+    // normalize the top plane
+    t = @sqrt(frustum[3][0]*frustum[3][0]
+        + frustum[3][1]*frustum[3][1]
+        + frustum[3][2]*frustum[3][2]);
+    frustum[3][0] /= t;
+    frustum[3][1] /= t;
+    frustum[3][2] /= t;
+    frustum[3][3] /= t;
+
+    // calculate the far plane
+    frustum[4][0] = clip[3] - clip[2];
+    frustum[4][1] = clip[7] - clip[6];
+    frustum[4][2] = clip[11] - clip[10];
+    frustum[4][3] = clip[15] - clip[14];
+
+    // normalize the far plane
+    t = @sqrt(frustum[4][0]*frustum[4][0]
+        + frustum[4][1]*frustum[4][1]
+        + frustum[4][2]*frustum[4][2]);
+    frustum[4][0] /= t;
+    frustum[4][1] /= t;
+    frustum[4][2] /= t;
+    frustum[4][3] /= t;
+
+    // calculate the near plane
+    frustum[5][0] = clip[3] + clip[2];
+    frustum[5][1] = clip[7] + clip[6];
+    frustum[5][2] = clip[11] + clip[10];
+    frustum[5][3] = clip[15] + clip[14];
+
+    // normalize the near plane
+    t = @sqrt(frustum[5][0]*frustum[5][0]
+        + frustum[5][1]*frustum[5][1]
+        + frustum[5][2]*frustum[5][2]);
+    frustum[5][0] /= t;
+    frustum[5][1] /= t;
+    frustum[5][2] /= t;
+    frustum[5][3] /= t;
+}
+
+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) {
+        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;
+        return false;
+    }
+    return true;
+}
+
+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)
+        if (frustum[i][0] * x + frustum[i][1] * y
+            + frustum[i][2] * z + frustum[i][3] <= -r)
+            return false;
+    return true;
+}
diff --git a/src/main.zig b/src/main.zig
index 3648a38..49f2b49 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -36,6 +36,10 @@ const saveScores = misc.saveScores;
 var game: *c.Game = undefined;
 var prng: DefaultPrng = undefined;
 
+comptime {
+    _ = @import("geom.zig");
+} // export functions in C ABI
+
 fn resizeWindow(window: gf.Window, width: c_int, height: c_int) void {
     _ = window;
     c.resizeWindow(game, width, height);
diff --git a/src/misc.zig b/src/misc.zig
index f2db3d1..6f1d893 100644
--- a/src/misc.zig
+++ b/src/misc.zig
@@ -17,7 +17,6 @@
 // You should have received a copy of the GNU General Public License
 // along with Black Shades.  If not, see <https://www.gnu.org/licenses/>.
 
-const Child = std.meta.Child;
 const Dir = std.fs.Dir;
 const TokenIterator = std.mem.TokenIterator(u8);
 const allocPrint = std.fmt.allocPrint;
@@ -378,231 +377,6 @@ pub fn saveScores(base_dir: []const u8, current: Scores) !void {
     try dir.writeFile("scores.ini", data);
 }
 
-// TODO: move graphics functions to a seperate file
-fn sqr(x: anytype) @TypeOf(x) {
-    return x * x;
-}
-
-fn dot(u: anytype, v: @TypeOf(u)) Child(@TypeOf(u)) {
-    return @reduce(.Add, u * v);
-}
-
-export fn sqrlen(v: XYZ) f32 {
-    const u = @bitCast(@Vector(3, f32), v);
-    return dot(u, u);
-}
-
-fn norm(v: anytype) Child(@TypeOf(v)) {
-    return @sqrt(dot(v, v));
-}
-
-const XYZ = extern struct { x: f32, y: f32, z: f32 };
-
-export fn crossProduct(u: XYZ, v: XYZ) XYZ {
-    return .{
-        .x = u.y * v.z - u.z * v.y,
-        .y = u.z * v.x - u.x * v.z,
-        .z = u.x * v.y - u.y * v.x,
-    };
-}
-
-export fn normalize(v: XYZ) XYZ {
-    const u = @bitCast(@Vector(3, f32), v);
-    const d = norm(u);
-    return if (d == 0) v else @bitCast(XYZ, u / @splat(3, 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));
-}
-
-export fn segmentIntersectsSphere(a: XYZ, b: XYZ, j: 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);
-
-    if (@reduce(.Or, @max(p, q) < i - @splat(3, r))) return false;
-    if (@reduce(.Or, @min(p, q) > i + @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);
-}
-
-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);
-
-    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],
-    };
-
-    // Right plane
-    frustum[0][0] = clip[3] - clip[0];
-    frustum[0][1] = clip[7] - clip[4];
-    frustum[0][2] = clip[11] - clip[8];
-    frustum[0][3] = clip[15] - clip[12];
-
-    // Left plane
-    frustum[1][0] = clip[3] + clip[0];
-    frustum[1][1] = clip[7] + clip[4];
-    frustum[1][2] = clip[11] + clip[8];
-    frustum[1][3] = clip[15] + clip[12];
-
-    // Bottom plane
-    frustum[2][0] = clip[3] + clip[1];
-    frustum[2][1] = clip[7] + clip[5];
-    frustum[2][2] = clip[11] + clip[9];
-    frustum[2][3] = clip[15] + clip[13];
-
-    // Top plane
-    frustum[3][0] = clip[3] - clip[1];
-    frustum[3][1] = clip[7] - clip[5];
-    frustum[3][2] = clip[11] - clip[9];
-    frustum[3][3] = clip[15] - clip[13];
-
-    // Far plane
-    frustum[4][0] = clip[3] - clip[2];
-    frustum[4][1] = clip[7] - clip[6];
-    frustum[4][2] = clip[11] - clip[10];
-    frustum[4][3] = clip[15] - clip[14];
-
-    // Near plane
-    frustum[5][0] = clip[3] + clip[2];
-    frustum[5][1] = clip[7] + clip[6];
-    frustum[5][2] = clip[11] + clip[10];
-    frustum[5][3] = clip[15] + clip[14];
-
-    // normalize the right plane
-    var t: f32 = undefined;
-    t = @sqrt(frustum[0][0]*frustum[0][0]
-        + frustum[0][1]*frustum[0][1]
-        + frustum[0][2]*frustum[0][2]);
-    frustum[0][0] /= t;
-    frustum[0][1] /= t;
-    frustum[0][2] /= t;
-    frustum[0][3] /= t;
-
-    // calculate left plane
-    frustum[1][0] = clip[3] + clip[0];
-    frustum[1][1] = clip[7] + clip[4];
-    frustum[1][2] = clip[11] + clip[ 8];
-    frustum[1][3] = clip[15] + clip[12];
-
-    // normalize the left plane
-    t = @sqrt(frustum[1][0]*frustum[1][0]
-        + frustum[1][1]*frustum[1][1]
-        + frustum[1][2]*frustum[1][2]);
-    frustum[1][0] /= t;
-    frustum[1][1] /= t;
-    frustum[1][2] /= t;
-    frustum[1][3] /= t;
-
-    // calculate the bottom plane
-    frustum[2][0] = clip[3] + clip[1];
-    frustum[2][1] = clip[7] + clip[5];
-    frustum[2][2] = clip[11] + clip[9];
-    frustum[2][3] = clip[15] + clip[13];
-
-    // normalize the bottom plane
-    t = @sqrt(frustum[2][0]*frustum[2][0]
-        + frustum[2][1]*frustum[2][1]
-        + frustum[2][2]*frustum[2][2]);
-    frustum[2][0] /= t;
-    frustum[2][1] /= t;
-    frustum[2][2] /= t;
-    frustum[2][3] /= t;
-
-    // calculate the top plane
-    frustum[3][0] = clip[3] - clip[1];
-    frustum[3][1] = clip[7] - clip[5];
-    frustum[3][2] = clip[11] - clip[9];
-    frustum[3][3] = clip[15] - clip[13];
-
-    // normalize the top plane
-    t = @sqrt(frustum[3][0]*frustum[3][0]
-        + frustum[3][1]*frustum[3][1]
-        + frustum[3][2]*frustum[3][2]);
-    frustum[3][0] /= t;
-    frustum[3][1] /= t;
-    frustum[3][2] /= t;
-    frustum[3][3] /= t;
-
-    // calculate the far plane
-    frustum[4][0] = clip[3] - clip[2];
-    frustum[4][1] = clip[7] - clip[6];
-    frustum[4][2] = clip[11] - clip[10];
-    frustum[4][3] = clip[15] - clip[14];
-
-    // normalize the far plane
-    t = @sqrt(frustum[4][0]*frustum[4][0]
-        + frustum[4][1]*frustum[4][1]
-        + frustum[4][2]*frustum[4][2]);
-    frustum[4][0] /= t;
-    frustum[4][1] /= t;
-    frustum[4][2] /= t;
-    frustum[4][3] /= t;
-
-    // calculate the near plane
-    frustum[5][0] = clip[3] + clip[2];
-    frustum[5][1] = clip[7] + clip[6];
-    frustum[5][2] = clip[11] + clip[10];
-    frustum[5][3] = clip[15] + clip[14];
-
-    // normalize the near plane
-    t = @sqrt(frustum[5][0]*frustum[5][0]
-        + frustum[5][1]*frustum[5][1]
-        + frustum[5][2]*frustum[5][2]);
-    frustum[5][0] /= t;
-    frustum[5][1] /= t;
-    frustum[5][2] /= t;
-    frustum[5][3] /= t;
-}
-
-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) {
-        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;
-        return false;
-    }
-    return true;
-}
-
-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)
-        if (frustum[i][0] * x + frustum[i][1] * y
-            + frustum[i][2] * z + frustum[i][3] <= -r)
-            return false;
-    return true;
-}
-
 const Text = struct {
     texture: u32,
     base: u32,