diff --git a/include/bx/inline/math.inl b/include/bx/inline/math.inl index 049a355..10f9c95 100644 --- a/include/bx/inline/math.inl +++ b/include/bx/inline/math.inl @@ -896,7 +896,7 @@ namespace bx inline BX_CONST_FUNC Vec3 normalize(const Vec3 _a) { - const float invLen = 1.0f/length(_a); + const float invLen = rcpSafe(length(_a) ); const Vec3 result = mul(_a, invLen); return result; } @@ -957,14 +957,14 @@ namespace bx if (abs(nx) > abs(nz) ) { - float invLen = 1.0f / sqrt(nx*nx + nz*nz); + const float invLen = rcpSafe(sqrt(nx*nx + nz*nz) ); _outT.x = -nz * invLen; _outT.y = 0.0f; _outT.z = nx * invLen; } else { - float invLen = 1.0f / sqrt(ny*ny + nz*nz); + const float invLen = rcpSafe(sqrt(ny*ny + nz*nz) ); _outT.x = 0.0f; _outT.y = nz * invLen; _outT.z = -ny * invLen; @@ -1264,7 +1264,7 @@ namespace bx return; } - const float invSa = 1.0f/sa; + const float invSa = rcpSafe(sa); _outAxis = { _a.x * invSa, _a.y * invSa, _a.z * invSa }; } diff --git a/include/bx/math.h b/include/bx/math.h index 27d24e5..715d0bd 100644 --- a/include/bx/math.h +++ b/include/bx/math.h @@ -355,7 +355,7 @@ namespace bx /// BX_CONSTEXPR_FUNC float rcp(float _a); - /// Returns reciprocal of _a. + /// Returns reciprocal of _a. Avoids divide by zero. /// BX_CONSTEXPR_FUNC float rcpSafe(float _a); diff --git a/tests/math_test.cpp b/tests/math_test.cpp index 2dedc43..8de8638 100644 --- a/tests/math_test.cpp +++ b/tests/math_test.cpp @@ -670,6 +670,8 @@ void mtxCheck(const float* _a, const float* _b) TEST_CASE("vec3", "[math][vec3]") { + REQUIRE(bx::isEqual({0.0f, 0.0f, 0.0f}, bx::normalize({0.0f, 0.0f, 0.0f}), 0.0f) ); + bx::Vec3 normalized = bx::normalize({0.0f, 1.0f, 0.0f}); REQUIRE(bx::isEqual(normalized, {0.0f, 1.0f, 0.0f}, 0.0f) );