|  | // Copyright 2018 The Fuchsia Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef SRC_UI_LIB_ESCHER_GEOMETRY_INTERSECTION_H_ | 
|  | #define SRC_UI_LIB_ESCHER_GEOMETRY_INTERSECTION_H_ | 
|  |  | 
|  | #include <cfloat> | 
|  |  | 
|  | #include "src/ui/lib/escher/geometry/bounding_box.h" | 
|  | #include "src/ui/lib/escher/geometry/interval.h" | 
|  | #include "src/ui/lib/escher/geometry/types.h" | 
|  |  | 
|  | namespace escher { | 
|  |  | 
|  | // Returns whether a ray intersects an axis-aligned bounding box. Upon return, | 
|  | // |out_interval| returns the interval containing the ray's entry and exit distances | 
|  | // through the box. These values are only valid if a hit took place. | 
|  | bool IntersectRayBox(const escher::ray4& ray, const escher::BoundingBox& box, | 
|  | Interval* out_interval); | 
|  |  | 
|  | // Returns whether a ray intersects a 3D triangle or not. Upon return, |out_distance| | 
|  | // contains the distance from the ray origin to the intersection point in units of | 
|  | // "ray length" (i.e. the length of the ray's direction vector). | 
|  | bool IntersectRayTriangle(const escher::ray4& ray, const glm::vec3& v1, const glm::vec3& v2, | 
|  | const glm::vec3& v3, float* out_distance); | 
|  |  | 
|  | // Return the distance from the ray origin to the intersection point in units | 
|  | // of ray length, or FLT_MAX if the line and plane are (nearly) parallel.  This | 
|  | // can be used to test line, ray, and line-segment intersection: | 
|  | //   - lines intersect the plane when the return value is < FLT_MAX. | 
|  | //   - rays intersect when the return value is >= 0 and < FLT_MAX. | 
|  | //   - line segments intersect when the return value is >= 0 and <= 1. | 
|  | template <typename VecT> | 
|  | float IntersectLinePlane(const VecT& ray_origin, const VecT& ray_direction, | 
|  | const planeN<VecT>& plane) { | 
|  | float denominator = glm::dot(ray_direction, plane.dir()); | 
|  | return std::abs(denominator) < kEpsilon * glm::dot(ray_direction, ray_direction) | 
|  | ? FLT_MAX | 
|  | : (plane.dist() - glm::dot(ray_origin, plane.dir())) / denominator; | 
|  | } | 
|  |  | 
|  | // Convenient wrapper function for the above IntersectLinePlane function to allow | 
|  | // for a more idiomatic way to test ray-plane intersections. | 
|  | bool IntersectRayPlane(const escher::ray4& ray, const escher::plane3& plane, float* out_distance); | 
|  |  | 
|  | }  // namespace escher | 
|  |  | 
|  | #endif  // SRC_UI_LIB_ESCHER_GEOMETRY_INTERSECTION_H_ |