Move Vectormath main
C++20 game and graphics mathematics
Loading...
Searching...
No Matches
Ray3.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cmath>
4#include <optional>
5#include <type_traits>
6
9
10namespace mv::math
11{
12 // Standard half-line with a finite origin and unit direction; invariant
13 // enforcement and semantic Point3f/Direction3f storage are Move-specific.
14 template <typename T>
15 requires std::is_floating_point_v<T>
16 class Ray3
17 {
18 public:
19 using Component = T;
20
22
25 {
26 if (!IsFinitePoint(origin))
27 {
28 return std::nullopt;
29 }
30 return Ray3(origin, direction, UncheckedTag{});
31 }
32
34 {
35 return Origin_;
36 }
37
39 {
40 return Direction_;
41 }
42
43 // The caller supplies a distance in the ray domain [0, +infinity).
44 // No implicit clamping is performed.
45 [[nodiscard]] Point3<T> PointAt(T distance) const noexcept
46 {
47 return Origin_ + Direction_.Vector() * distance;
48 }
49
50 [[nodiscard]] friend bool operator==(const Ray3& left,
51 const Ray3& right) noexcept
52 {
53 return left.Origin_ == right.Origin_ &&
54 left.Direction_ == right.Direction_;
55 }
56
57 private:
58 struct UncheckedTag
59 {
60 };
61
62 Ray3(const Point3<T>& origin,
63 const Direction3<T>& direction,
64 UncheckedTag) noexcept :
65 Origin_(origin), Direction_(direction)
66 {
67 }
68
69 [[nodiscard]] static bool IsFinitePoint(const Point3<T>& point) noexcept
70 {
71 return std::isfinite(point.X()) && std::isfinite(point.Y()) &&
72 std::isfinite(point.Z());
73 }
74
75 Point3<T> Origin_;
76 Direction3<T> Direction_;
77 };
78
81} // namespace mv::math
82
83static_assert(sizeof(mv::math::Ray3f) == 32);
84static_assert(alignof(mv::math::Ray3f) == 16);
85static_assert(std::is_trivially_copyable_v<mv::math::Ray3f>);
86static_assert(std::is_standard_layout_v<mv::math::Ray3f>);
87static_assert(sizeof(mv::math::Ray3d) == 64);
88static_assert(alignof(mv::math::Ray3d) == 32);
89static_assert(std::is_trivially_copyable_v<mv::math::Ray3d>);
90static_assert(std::is_standard_layout_v<mv::math::Ray3d>);
const Point3< T > & Origin() const noexcept
Definition Ray3.hpp:33
static std::optional< Ray3 > TryFromOriginDirection(const Point3< T > &origin, const Direction3< T > &direction) noexcept
Definition Ray3.hpp:23
Point3< T > PointAt(T distance) const noexcept
Definition Ray3.hpp:45
const Direction3< T > & Direction() const noexcept
Definition Ray3.hpp:38
Ray3() noexcept=default
friend bool operator==(const Ray3 &left, const Ray3 &right) noexcept
Definition Ray3.hpp:50
Ray3< float > Ray3f
Definition Ray3.hpp:79
Ray3< double > Ray3d
Definition Ray3.hpp:80