1//************************************ bs::framework - Copyright 2018 Marko Pintera **************************************//
2//*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********//
3#pragma once
4
5#include "Prerequisites/BsPrerequisitesUtil.h"
6#include "Math/BsVector3.h"
7
8namespace bs
9{
10 /** @addtogroup Math
11 * @{
12 */
13
14 /** A ray in 3D space represented with an origin and direction. */
15 class BS_UTILITY_EXPORT Ray
16 {
17 public:
18 Ray() = default;
19
20 Ray(const Vector3& origin, const Vector3& direction)
21 :mOrigin(origin), mDirection(direction)
22 { }
23
24 void setOrigin(const Vector3& origin) { mOrigin = origin; }
25 const Vector3& getOrigin() const { return mOrigin; }
26
27 void setDirection(const Vector3& dir) { mDirection = dir; }
28 const Vector3& getDirection() const {return mDirection;}
29
30 /** Gets the position of a point t units along the ray. */
31 Vector3 getPoint(float t) const
32 {
33 return Vector3(mOrigin + (mDirection * t));
34 }
35
36 /** Gets the position of a point t units along the ray. */
37 Vector3 operator*(float t) const
38 {
39 return getPoint(t);
40 }
41
42 /** Transforms the ray by the given matrix. */
43 void transform(const Matrix4& matrix);
44
45 /**
46 * Transforms the ray by the given matrix.
47 *
48 * @note Provided matrix must be affine.
49 */
50 void transformAffine(const Matrix4& matrix);
51
52 /** Ray/plane intersection, returns boolean result and distance to intersection point. */
53 std::pair<bool, float> intersects(const Plane& p) const;
54
55 /** Ray/sphere intersection, returns boolean result and distance to nearest intersection point. */
56 std::pair<bool, float> intersects(const Sphere& s) const;
57
58 /** Ray/axis aligned box intersection, returns boolean result and distance to nearest intersection point. */
59 std::pair<bool, float> intersects(const AABox& box) const;
60
61 /**
62 * Ray/triangle intersection, returns boolean result and distance to intersection point.
63 *
64 * @param[in] a Triangle first vertex.
65 * @param[in] b Triangle second vertex.
66 * @param[in] c Triangle third vertex.
67 * @param[in] normal The normal of the triangle. Doesn't need to be normalized.
68 * @param[in] positiveSide (optional) Should intersections with the positive side (normal facing) count.
69 * @param[in] negativeSide (optional) Should intersections with the negative side (opposite of normal facing) count.
70 * @return Boolean result if intersection happened and distance to intersection point.
71 */
72 std::pair<bool, float> intersects(const Vector3& a, const Vector3& b, const Vector3& c,
73 const Vector3& normal, bool positiveSide = true, bool negativeSide = true) const;
74
75 protected:
76 Vector3 mOrigin{Vector3::ZERO};
77 Vector3 mDirection{Vector3::UNIT_Z};
78 };
79
80 /** @} */
81}
82