diff options
-rw-r--r-- | src/GameDraw.cpp | 7 | ||||
-rw-r--r-- | src/Quaternions.h | 2 | ||||
-rw-r--r-- | src/geom.zig | 56 |
3 files changed, 32 insertions, 33 deletions
diff --git a/src/GameDraw.cpp b/src/GameDraw.cpp index cdd0229..f59bb69 100644 --- a/src/GameDraw.cpp +++ b/src/GameDraw.cpp @@ -438,7 +438,12 @@ void Game::DrawGLScene(void) glPopMatrix(); GLfloat frustum[6][4]; - getFrustum(frustum); + GLfloat projection[16]; + glGetFloatv(GL_PROJECTION_MATRIX, projection); + GLfloat model_view[16]; + glGetFloatv(GL_MODELVIEW_MATRIX, model_view); + setFrustum(frustum, projection, model_view); + GLfloat LightPosition[] { -.5, 1, -.8, 0.0f }; glLightfv(GL_LIGHT0, GL_POSITION, LightPosition); glDisable(GL_TEXTURE_2D); diff --git a/src/Quaternions.h b/src/Quaternions.h index e01740a..9380905 100644 --- a/src/Quaternions.h +++ b/src/Quaternions.h @@ -54,7 +54,7 @@ extern "C" { struct XYZ pa, struct XYZ pb, struct XYZ pc, struct XYZ n, struct XYZ *p); - void getFrustum(float (*)[4]); + void setFrustum(float (*)[4], float*, float*); int cubeInFrustum(float (*)[4], float, float, float, float); int sphereInFrustum(float (*)[4], float, float, float, float); #ifdef __cplusplus 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 |