X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fgeometry%2Fgeometry.cpp;h=7d099cf156de9caa2650983395a7dfc562f03a8f;hb=0ac44f8cd740889f13b07e42327eaacff72830d0;hp=ff28d2e0602c041abcac485099dae79915ab9951;hpb=4fbf5a3c1b0e530706023f5fc4be2f68d30ea645;p=blank.git diff --git a/src/geometry/geometry.cpp b/src/geometry/geometry.cpp index ff28d2e..7d099cf 100644 --- a/src/geometry/geometry.cpp +++ b/src/geometry/geometry.cpp @@ -32,7 +32,7 @@ glm::mat3 find_rotation(const glm::vec3 &a, const glm::vec3 &b) noexcept { return glm::mat3(glm::rotate(PI, axis)); } } - float mv = length_squared(v); + float mv = length2(v); float c = dot(a, b); float f = (1 - c) / mv; glm::mat3 vx(matrixCross3(v)); @@ -127,13 +127,22 @@ bool Intersection( glm::vec3(b_m * glm::vec4(b_box.max.x, b_box.max.y, b_box.max.z, 1)), }; - glm::vec3 axes[6] = { - glm::vec3(a_m * glm::vec4(1, 0, 0, 0)), - glm::vec3(a_m * glm::vec4(0, 1, 0, 0)), - glm::vec3(a_m * glm::vec4(0, 0, 1, 0)), - glm::vec3(b_m * glm::vec4(1, 0, 0, 0)), - glm::vec3(b_m * glm::vec4(0, 1, 0, 0)), - glm::vec3(b_m * glm::vec4(0, 0, 1, 0)), + glm::vec3 axes[15] = { + glm::vec3(a_m[0]), + glm::vec3(a_m[1]), + glm::vec3(a_m[2]), + glm::vec3(b_m[0]), + glm::vec3(b_m[1]), + glm::vec3(b_m[2]), + normalize(cross(glm::vec3(a_m[0]), glm::vec3(b_m[0]))), + normalize(cross(glm::vec3(a_m[0]), glm::vec3(b_m[1]))), + normalize(cross(glm::vec3(a_m[0]), glm::vec3(b_m[2]))), + normalize(cross(glm::vec3(a_m[1]), glm::vec3(b_m[0]))), + normalize(cross(glm::vec3(a_m[1]), glm::vec3(b_m[1]))), + normalize(cross(glm::vec3(a_m[1]), glm::vec3(b_m[2]))), + normalize(cross(glm::vec3(a_m[2]), glm::vec3(b_m[0]))), + normalize(cross(glm::vec3(a_m[2]), glm::vec3(b_m[1]))), + normalize(cross(glm::vec3(a_m[2]), glm::vec3(b_m[2]))), }; depth = std::numeric_limits::infinity(); @@ -141,6 +150,10 @@ bool Intersection( int cur_axis = 0; for (const glm::vec3 &axis : axes) { + if (any(isnan(axis))) { + // can result from the cross products if A and B have parallel axes + continue; + } float a_min = std::numeric_limits::infinity(); float a_max = -std::numeric_limits::infinity(); for (const glm::vec3 &corner : a_corners) {