diff --git a/glm/detail/func_geometric.inl b/glm/detail/func_geometric.inl index 2f8691dd..1e8cd633 100644 --- a/glm/detail/func_geometric.inl +++ b/glm/detail/func_geometric.inl @@ -92,8 +92,7 @@ namespace detail { GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'length' only accept floating-point inputs"); - genType sqr = x * x; - return sqrt(sqr); + return abs(x); } template diff --git a/glm/gtx/fast_square_root.inl b/glm/gtx/fast_square_root.inl index a08bdbf2..198e03ab 100644 --- a/glm/gtx/fast_square_root.inl +++ b/glm/gtx/fast_square_root.inl @@ -101,13 +101,43 @@ namespace glm template GLM_FUNC_QUALIFIER genType fastDistance ( - genType const & x, + genType const & x, genType const & y ) { return fastLength(y - x); } + template + GLM_FUNC_QUALIFIER valType fastDistance + ( + detail::tvec2 const & x, + detail::tvec2 const & y + ) + { + return fastLength(y - x); + } + + template + GLM_FUNC_QUALIFIER valType fastDistance + ( + detail::tvec3 const & x, + detail::tvec3 const & y + ) + { + return fastLength(y - x); + } + + template + GLM_FUNC_QUALIFIER valType fastDistance + ( + detail::tvec4 const & x, + detail::tvec4 const & y + ) + { + return fastLength(y - x); + } + // fastNormalize template GLM_FUNC_QUALIFIER genType fastNormalize diff --git a/readme.txt b/readme.txt index 61dc33a0..9e4e826a 100644 --- a/readme.txt +++ b/readme.txt @@ -50,6 +50,7 @@ GLM 0.9.5.4: 2014-0X-XX - Fixed orientate3 function #207 - Fixed lerp when cosTheta is close to 1 in quaternion slerp #210 - Added GTX_io for io with #144 +- Fixed fastDistance ambiguity #215 ================================================================================ GLM 0.9.5.3: 2014-04-02 diff --git a/test/gtx/gtx_fast_square_root.cpp b/test/gtx/gtx_fast_square_root.cpp index 788b341c..b9d41dcd 100644 --- a/test/gtx/gtx_fast_square_root.cpp +++ b/test/gtx/gtx_fast_square_root.cpp @@ -27,11 +27,29 @@ int test_fastInverseSqrt() return 0; } +int test_fastDistance() +{ + int Error(0); + + glm::mediump_f32 A = glm::fastDistance(glm::mediump_f32(0.0f), glm::mediump_f32(1.0f)); + glm::mediump_f32 B = glm::fastDistance(glm::mediump_f32vec2(0.0f), glm::mediump_f32vec2(1.0f, 0.0f)); + glm::mediump_f32 C = glm::fastDistance(glm::mediump_f32vec3(0.0f), glm::mediump_f32vec3(1.0f, 0.0f, 0.0f)); + glm::mediump_f32 D = glm::fastDistance(glm::mediump_f32vec4(0.0f), glm::mediump_f32vec4(1.0f, 0.0f, 0.0f, 0.0f)); + + Error += glm::epsilonEqual(A, glm::mediump_f32(1.0f), glm::mediump_f32(0.01f)) ? 0 : 1; + Error += glm::epsilonEqual(B, glm::mediump_f32(1.0f), glm::mediump_f32(0.01f)) ? 0 : 1; + Error += glm::epsilonEqual(C, glm::mediump_f32(1.0f), glm::mediump_f32(0.01f)) ? 0 : 1; + Error += glm::epsilonEqual(D, glm::mediump_f32(1.0f), glm::mediump_f32(0.01f)) ? 0 : 1; + + return Error; +} + int main() { int Error(0); Error += test_fastInverseSqrt(); + Error += test_fastDistance(); return Error; }