|
|
|
@ -127,6 +127,27 @@ namespace glm |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER bool intersectRaySphere |
|
|
|
|
( |
|
|
|
|
genType const & rayStarting, genType const & rayNormalizedDirection, |
|
|
|
|
genType const & sphereCenter, const typename genType::value_type sphereRadiusSquered, |
|
|
|
|
typename genType::value_type & intersectionDistance |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
typename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon(); |
|
|
|
|
genType diff = sphereCenter - rayStarting; |
|
|
|
|
typename genType::value_type t0 = dot(diff, rayNormalizedDirection); |
|
|
|
|
typename genType::value_type dSquared = dot(diff, diff) - t0 * t0; |
|
|
|
|
if( dSquared > sphereRadiusSquered ) |
|
|
|
|
{ |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
typename genType::value_type t1 = sqrt( sphereRadiusSquered - dSquared ); |
|
|
|
|
intersectionDistance = t0 > t1 + Epsilon ? t0 - t1 : t0 + t1; |
|
|
|
|
return intersectionDistance > Epsilon; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER bool intersectRaySphere |
|
|
|
|
( |
|
|
|
|