#ifndef AXIO_MATHUTIL_H #define AXIO_MATHUTIL_H #include #include #include #include #include class CAABox; class CPlane; class CRay; namespace Math { // Constants constexpr float skPi = 3.14159265358979323846f; constexpr float skHalfPi = skPi / 2.f; /** Aligns the input value to be a multiple of Align. Align must be a power of 2. */ template constexpr Value Align(Value value, size_t align) { return Value((value + align - 1) & ~(align - 1)); } template constexpr T Square(const T& V) { return V * V; } template constexpr T Cube(const T& V) { return V * V * V; } inline float Distance(const CVector3f& kA, const CVector3f& kB) { return kA.Distance(kB); } constexpr float DegreesToRadians(float Deg) { constexpr float Factor = skPi / 180.f; return Deg * Factor; } constexpr float RadiansToDegrees(float Rad) { constexpr float Factor = 180.f / skPi; return Rad * Factor; } template constexpr T Lerp(const T& kA, const T& kB, float t) { T Diff = kB - kA; return kA + T(Diff * t); } std::pair RayPlaneIntersection(const CRay& rkRay, const CPlane& rkPlane); std::pair RayBoxIntersection(const CRay& rkRay, const CAABox& rkBox); std::pair RayLineIntersection(const CRay& rkRay, const CVector3f& rkPointA, const CVector3f& rkPointB, float Threshold = 0.02f); std::pair RaySphereIntersection(const CRay& rkRay, const CVector3f& rkSpherePos, float SphereRadius, bool AllowBackfaces = false); std::pair RayTriangleIntersection(const CRay& rkRay, const CVector3f& rkPointA, const CVector3f& rkPointB, const CVector3f& rkPointC, bool AllowBackfaces = false); CMatrix4f PerspectiveMatrix(float FOV, float Aspect, float Near, float Far); CMatrix4f OrthographicMatrix(float Left, float Right, float Bottom, float Top, float Near, float Far); } #endif // AXIO_MATHUTIL_H