Add ray.
This commit is contained in:
parent
95438fc5fa
commit
93cdd83005
127
Engine/src/Runtime/Core/public/Math/Ray.hpp
Normal file
127
Engine/src/Runtime/Core/public/Math/Ray.hpp
Normal file
@ -0,0 +1,127 @@
|
||||
#pragma once
|
||||
|
||||
#include "Core/public/Math/Boilerplate.h"
|
||||
#include "Core/public/Math/MathFwd.h"
|
||||
|
||||
#include "Core/public/Math/Vector3.hpp"
|
||||
|
||||
namespace Phanes::Core::Math
|
||||
{
|
||||
|
||||
// Ray with origin and direction (L = p + t * v)
|
||||
|
||||
template<RealType T>
|
||||
struct TRay
|
||||
{
|
||||
public:
|
||||
using Real = T;
|
||||
|
||||
TVector3<Real> origin;
|
||||
TVector3<Real> direction;
|
||||
|
||||
public:
|
||||
/** Default constructor */
|
||||
TRay() = default;
|
||||
|
||||
/** Copy constructor */
|
||||
TRay(const TRay<Real>& r) : direction(r.direction), origin(r.origin) {};
|
||||
|
||||
/** Move constructor */
|
||||
TRay(TRay<Real>&& r) : direction(std::move(r.direction)), origin(std::move(r.origin)) {};
|
||||
|
||||
/**
|
||||
* Construct ray from origin and direction.
|
||||
*
|
||||
* @param(direction) Direction
|
||||
* @param(origin) Origin
|
||||
*/
|
||||
|
||||
TRay(const TVector3<Real>& direction, const TVector3<Real>& origin) : direction(direction), origin(origin) {};
|
||||
|
||||
};
|
||||
|
||||
// ================== //
|
||||
// TRay operators //
|
||||
// ================== //
|
||||
|
||||
|
||||
/**
|
||||
* Tests two rays for equality
|
||||
*
|
||||
* @param(r1) Ray one
|
||||
* @param(r2) Ray two
|
||||
*
|
||||
* @return True, if same and false, if not.
|
||||
*/
|
||||
|
||||
template<RealType T>
|
||||
FORCEINLINE bool operator== (const TRay<T>& r1, const TRay<T>& r2)
|
||||
{
|
||||
return (r1.origin == r2.origin && r1.direction == r2.direction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests two rays for inequality
|
||||
*
|
||||
* @param(r1) Ray one
|
||||
* @param(r2) Ray two
|
||||
*
|
||||
* @return True, if not same and false, if same.
|
||||
*/
|
||||
|
||||
template<RealType T>
|
||||
FORCEINLINE bool operator== (const TRay<T>& r1, const TRay<T>& r2)
|
||||
{
|
||||
return (r1.origin != r2.origin || r1.direction != r2.direction);
|
||||
}
|
||||
|
||||
// ================== //
|
||||
// TRay functions //
|
||||
// ================== //
|
||||
|
||||
|
||||
/**
|
||||
* Gets the point of the ray at a given parameter
|
||||
*
|
||||
* @param(r1) Ray
|
||||
* @param(t) Parameter
|
||||
*
|
||||
* @return Point at t
|
||||
*/
|
||||
|
||||
template<RealType T>
|
||||
TVector3<T> PointAt(const TRay<T>& r1, T t)
|
||||
{
|
||||
return r1.origin + r1.direction * t;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets parameter necessary to travel to query point on line.
|
||||
*
|
||||
* @param(r1) Ray
|
||||
* @param(p1) Query point
|
||||
*
|
||||
* @return parameter t
|
||||
*/
|
||||
|
||||
template<RealType T>
|
||||
TVector3<T> GetParameter(const TRay<T>& r1, const TVector3<T>& p1)
|
||||
{
|
||||
return DotP((p1 - r1.origin), r1.direction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests wether two ray point in the same direction (Not if origin).
|
||||
*
|
||||
* @param(r1) Ray one
|
||||
* @param(r2) Ray two
|
||||
*
|
||||
* @return True, if both rays point in the same direction, false if not.
|
||||
*/
|
||||
|
||||
template<RealType T>
|
||||
inline bool SameDirection(const TRay<T>& r1, const TRay<T>& r2)
|
||||
{
|
||||
return (r1.direction == r1.direction);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user