diff options
Diffstat (limited to 'src/misc.zig')
-rw-r--r-- | src/misc.zig | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/src/misc.zig b/src/misc.zig index 6f1d893..d523827 100644 --- a/src/misc.zig +++ b/src/misc.zig @@ -377,6 +377,177 @@ pub fn saveScores(base_dir: []const u8, current: Scores) !void { try dir.writeFile("scores.ini", data); } +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, |