Plasma Engine  2.0
Loading...
Searching...
No Matches
SimdVec4f_inl.h
1#pragma once
2
3PL_ALWAYS_INLINE plSimdVec4f::plSimdVec4f(plInternal::QuadFloat v)
4{
5 m_v = v;
6}
7
9{
11}
12
14{
16}
17
18template <int N, plMathAcc::Enum acc>
19PL_ALWAYS_INLINE plSimdFloat plSimdVec4f::GetLength() const
20{
21 const plSimdFloat squaredLen = GetLengthSquared<N>();
22 return squaredLen.GetSqrt<acc>();
23}
24
25template <int N, plMathAcc::Enum acc>
26PL_ALWAYS_INLINE plSimdFloat plSimdVec4f::GetInvLength() const
27{
28 const plSimdFloat squaredLen = GetLengthSquared<N>();
29 return squaredLen.GetInvSqrt<acc>();
30}
31
32template <int N>
33PL_ALWAYS_INLINE plSimdFloat plSimdVec4f::GetLengthSquared() const
34{
35 return Dot<N>(*this);
36}
37
38template <int N, plMathAcc::Enum acc>
39PL_ALWAYS_INLINE plSimdFloat plSimdVec4f::GetLengthAndNormalize()
40{
41 const plSimdFloat squaredLen = GetLengthSquared<N>();
42 const plSimdFloat reciprocalLen = squaredLen.GetInvSqrt<acc>();
43 *this = (*this) * reciprocalLen;
44 return squaredLen * reciprocalLen;
45}
46
47template <int N, plMathAcc::Enum acc>
48PL_ALWAYS_INLINE plSimdVec4f plSimdVec4f::GetNormalized() const
49{
50 return (*this) * GetInvLength<N, acc>();
51}
52
53template <int N, plMathAcc::Enum acc>
54PL_ALWAYS_INLINE void plSimdVec4f::Normalize()
55{
56 *this = GetNormalized<N, acc>();
57}
58
59template <int N>
60PL_ALWAYS_INLINE bool plSimdVec4f::IsNormalized(const plSimdFloat& fEpsilon) const
61{
62 const plSimdFloat sqLength = GetLengthSquared<N>();
63 return sqLength.IsEqual(1.0f, fEpsilon);
64}
65
66inline plSimdFloat plSimdVec4f::GetComponent(int i) const
67{
68 switch (i)
69 {
70 case 0:
71 return GetComponent<0>();
72
73 case 1:
74 return GetComponent<1>();
75
76 case 2:
77 return GetComponent<2>();
78
79 default:
80 return GetComponent<3>();
81 }
82}
83
84PL_ALWAYS_INLINE plSimdVec4f plSimdVec4f::Fraction() const
85{
86 return *this - Trunc();
87}
88
89// static
90PL_ALWAYS_INLINE plSimdVec4f plSimdVec4f::Lerp(const plSimdVec4f& a, const plSimdVec4f& b, const plSimdVec4f& t)
91{
92 return a + t.CompMul(b - a);
93}
94
95PL_ALWAYS_INLINE plSimdVec4b plSimdVec4f::IsEqual(const plSimdVec4f& rhs, const plSimdFloat& fEpsilon) const
96{
97 plSimdVec4f minusEps = rhs - plSimdVec4f(fEpsilon);
98 plSimdVec4f plusEps = rhs + plSimdVec4f(fEpsilon);
99 return (*this >= minusEps) && (*this <= plusEps);
100}
101
102template <>
103PL_ALWAYS_INLINE plSimdFloat plSimdVec4f::HorizontalSum<1>() const
104{
105 return GetComponent<0>();
106}
107
108template <>
109PL_ALWAYS_INLINE plSimdFloat plSimdVec4f::HorizontalMin<1>() const
110{
111 return GetComponent<0>();
112}
113
114template <>
115PL_ALWAYS_INLINE plSimdFloat plSimdVec4f::HorizontalMax<1>() const
116{
117 return GetComponent<0>();
118}
Definition SimdFloat.h:7
static plSimdFloat MakeNaN()
Creates an plSimdFloat that is initialized to Not-A-Number (NaN).
Definition FPUFloat_inl.h:42
static plSimdFloat MakeZero()
Creates an plSimdFloat that is initialized to zero.
Definition FPUFloat_inl.h:36
Definition SimdVec4b.h:7
A 4-component SIMD vector class.
Definition SimdVec4f.h:8
static plSimdVec4f MakeNaN()
Creates an plSimdVec4f that is initialized to Not-A-Number (NaN).
Definition SimdVec4f_inl.h:13
static plSimdVec4f MakeZero()
Creates an plSimdVec4f that is initialized to zero.
Definition SimdVec4f_inl.h:8