|
|
@@ -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
|
|
|
(
|