Plasma Engine  2.0
Loading...
Searching...
No Matches
SimdTransform_inl.h
1#pragma once
2
3PL_ALWAYS_INLINE plSimdTransform::plSimdTransform() = default;
4
5PL_ALWAYS_INLINE plSimdTransform::plSimdTransform(const plSimdVec4f& vPosition, const plSimdQuat& qRotation, const plSimdVec4f& vScale)
6 : m_Position(vPosition)
7 , m_Rotation(qRotation)
8 , m_Scale(vScale)
9{
10}
11
12PL_ALWAYS_INLINE plSimdTransform::plSimdTransform(const plSimdQuat& qRotation)
13 : m_Rotation(qRotation)
14{
15 m_Position.SetZero();
16 m_Scale.Set(1.0f);
17}
18
19inline plSimdTransform plSimdTransform::Make(const plSimdVec4f& vPosition, const plSimdQuat& qRotation /*= plSimdQuat::IdentityQuaternion()*/, const plSimdVec4f& vScale /*= plSimdVec4f(1.0f)*/)
20{
22 res.m_Position = vPosition;
23 res.m_Rotation = qRotation;
24 res.m_Scale = vScale;
25 return res;
26}
27
29{
31 res.m_Position.SetZero();
32 res.m_Rotation = plSimdQuat::MakeIdentity();
33 res.m_Scale.Set(1.0f);
34 return res;
35}
36
37inline plSimdTransform plSimdTransform::MakeLocalTransform(const plSimdTransform& globalTransformParent, const plSimdTransform& globalTransformChild)
38{
39 const plSimdQuat invRot = -globalTransformParent.m_Rotation;
40 const plSimdVec4f invScale = globalTransformParent.m_Scale.GetReciprocal();
41
43 res.m_Position = (invRot * (globalTransformChild.m_Position - globalTransformParent.m_Position)).CompMul(invScale);
44 res.m_Rotation = invRot * globalTransformChild.m_Rotation;
45 res.m_Scale = invScale.CompMul(globalTransformChild.m_Scale);
46 return res;
47}
48
49PL_ALWAYS_INLINE plSimdTransform plSimdTransform::MakeGlobalTransform(const plSimdTransform& globalTransformParent, const plSimdTransform& localTransformChild)
50{
51 return globalTransformParent * localTransformChild;
52}
53
55{
56 return m_Scale.Abs().HorizontalMax<3>();
57}
58
59PL_ALWAYS_INLINE bool plSimdTransform::HasMirrorScaling() const
60{
61 return (m_Scale.x() * m_Scale.y() * m_Scale.z()) < plSimdFloat::MakeZero();
62}
63
64PL_ALWAYS_INLINE bool plSimdTransform::ContainsUniformScale() const
65{
66 const plSimdFloat fEpsilon = plMath::DefaultEpsilon<float>();
67 return m_Scale.x().IsEqual(m_Scale.y(), fEpsilon) && m_Scale.x().IsEqual(m_Scale.z(), fEpsilon);
68}
69
70PL_ALWAYS_INLINE bool plSimdTransform::IsEqual(const plSimdTransform& rhs, const plSimdFloat& fEpsilon) const
71{
72 return m_Position.IsEqual(rhs.m_Position, fEpsilon).AllSet<3>() && m_Rotation.IsEqualRotation(rhs.m_Rotation, fEpsilon) &&
73 m_Scale.IsEqual(rhs.m_Scale, fEpsilon).AllSet<3>();
74}
75
76PL_ALWAYS_INLINE void plSimdTransform::Invert()
77{
78 (*this) = GetInverse();
79}
80
82{
83 plSimdQuat invRot = -m_Rotation;
84 plSimdVec4f invScale = m_Scale.GetReciprocal();
85 plSimdVec4f invPos = invRot * (invScale.CompMul(-m_Position));
86
87 return plSimdTransform(invPos, invRot, invScale);
88}
89
91{
92 plSimdMat4f result = m_Rotation.GetAsMat4();
93
94 result.m_col0 *= m_Scale.x();
95 result.m_col1 *= m_Scale.y();
96 result.m_col2 *= m_Scale.z();
97 result.m_col3 = m_Position;
98 result.m_col3.SetW(1.0f);
99
100 return result;
101}
102
103PL_ALWAYS_INLINE plSimdVec4f plSimdTransform::TransformPosition(const plSimdVec4f& v) const
104{
105 const plSimdVec4f scaled = m_Scale.CompMul(v);
106 const plSimdVec4f rotated = m_Rotation * scaled;
107 return m_Position + rotated;
108}
109
110PL_ALWAYS_INLINE plSimdVec4f plSimdTransform::TransformDirection(const plSimdVec4f& v) const
111{
112 const plSimdVec4f scaled = m_Scale.CompMul(v);
113 return m_Rotation * scaled;
114}
115
116PL_ALWAYS_INLINE const plSimdVec4f operator*(const plSimdTransform& t, const plSimdVec4f& v)
117{
118 return t.TransformPosition(v);
119}
120
121inline const plSimdTransform operator*(const plSimdTransform& lhs, const plSimdTransform& rhs)
122{
124
125 t.m_Position = (lhs.m_Rotation * rhs.m_Position.CompMul(lhs.m_Scale)) + lhs.m_Position;
126 t.m_Rotation = lhs.m_Rotation * rhs.m_Rotation;
127 t.m_Scale = lhs.m_Scale.CompMul(rhs.m_Scale);
128
129 return t;
130}
131
132PL_ALWAYS_INLINE void plSimdTransform::operator*=(const plSimdTransform& other)
133{
134 (*this) = (*this) * other;
135}
136
137PL_ALWAYS_INLINE const plSimdTransform operator*(const plSimdTransform& lhs, const plSimdQuat& q)
138{
140 t.m_Position = lhs.m_Position;
141 t.m_Rotation = lhs.m_Rotation * q;
142 t.m_Scale = lhs.m_Scale;
143 return t;
144}
145
146PL_ALWAYS_INLINE const plSimdTransform operator*(const plSimdQuat& q, const plSimdTransform& rhs)
147{
149 t.m_Position = rhs.m_Position;
150 t.m_Rotation = q * rhs.m_Rotation;
151 t.m_Scale = rhs.m_Scale;
152 return t;
153}
154
155PL_ALWAYS_INLINE void plSimdTransform::operator*=(const plSimdQuat& q)
156{
157 m_Rotation = m_Rotation * q;
158}
159
160PL_ALWAYS_INLINE const plSimdTransform operator+(const plSimdTransform& lhs, const plSimdVec4f& v)
161{
163
164 t.m_Position = lhs.m_Position + v;
165 t.m_Rotation = lhs.m_Rotation;
166 t.m_Scale = lhs.m_Scale;
167
168 return t;
169}
170
171PL_ALWAYS_INLINE const plSimdTransform operator-(const plSimdTransform& lhs, const plSimdVec4f& v)
172{
174
175 t.m_Position = lhs.m_Position - v;
176 t.m_Rotation = lhs.m_Rotation;
177 t.m_Scale = lhs.m_Scale;
178
179 return t;
180}
181
182PL_ALWAYS_INLINE void plSimdTransform::operator+=(const plSimdVec4f& v)
183{
184 m_Position += v;
185}
186
187PL_ALWAYS_INLINE void plSimdTransform::operator-=(const plSimdVec4f& v)
188{
189 m_Position -= v;
190}
191
192PL_ALWAYS_INLINE bool operator==(const plSimdTransform& lhs, const plSimdTransform& rhs)
193{
194 return (lhs.m_Position == rhs.m_Position).AllSet<3>() && lhs.m_Rotation == rhs.m_Rotation && (lhs.m_Scale == rhs.m_Scale).AllSet<3>();
195}
196
197PL_ALWAYS_INLINE bool operator!=(const plSimdTransform& lhs, const plSimdTransform& rhs)
198{
199 return !(lhs == rhs);
200}
Definition SimdFloat.h:7
static plSimdFloat MakeZero()
Creates an plSimdFloat that is initialized to zero.
Definition FPUFloat_inl.h:36
A 4x4 matrix class.
Definition SimdMat4f.h:7
Definition SimdQuat.h:6
plSimdMat4f GetAsMat4() const
Returns the Quaternion as a matrix.
Definition SimdQuat_inl.h:58
bool IsEqualRotation(const plSimdQuat &qOther, const plSimdFloat &fEpsilon) const
Determines whether this and qOther represent the same rotation. This is a rather slow operation.
Definition SimdQuat.cpp:82
static const plSimdQuat MakeIdentity()
Static function that returns a quaternion that represents the identity rotation (none).
Definition SimdQuat_inl.h:10
Definition SimdTransform.h:6
static plSimdTransform Make(const plSimdVec4f &vPosition, const plSimdQuat &qRotation=plSimdQuat::MakeIdentity(), const plSimdVec4f &vScale=plSimdVec4f(1.0f))
Creates a transform from the given position, rotation and scale.
Definition SimdTransform_inl.h:19
bool ContainsUniformScale() const
Returns whether this transform contains uniform scaling.
Definition SimdTransform_inl.h:64
plSimdTransform()
Default constructor: Does not do any initialization.
void operator*=(const plSimdTransform &other)
Concatenates the two transforms. This is the same as a matrix multiplication, thus not commutative.
Definition SimdTransform_inl.h:132
bool HasMirrorScaling() const
Returns whether this transform contains negative scaling aka mirroring.
Definition SimdTransform_inl.h:59
bool IsEqual(const plSimdTransform &rhs, const plSimdFloat &fEpsilon) const
Equality Check with epsilon.
Definition SimdTransform_inl.h:70
plSimdTransform GetInverse() const
Returns the inverse of this transform.
Definition SimdTransform_inl.h:81
void Invert()
Inverts this transform.
Definition SimdTransform_inl.h:76
plSimdMat4f GetAsMat4() const
Returns the transformation as a matrix.
Definition SimdTransform_inl.h:90
plSimdFloat GetMaxScale() const
Returns the scale component with maximum magnitude.
Definition SimdTransform_inl.h:54
static plSimdTransform MakeLocalTransform(const plSimdTransform &globalTransformParent, const plSimdTransform &globalTransformChild)
Creates a transform that is the local transformation needed to get from the parent's transform to the...
Definition SimdTransform_inl.h:37
static plSimdTransform MakeGlobalTransform(const plSimdTransform &globalTransformParent, const plSimdTransform &localTransformChild)
Creates a transform that is the global transform, that is reached by applying the child's local trans...
Definition SimdTransform_inl.h:49
static plSimdTransform MakeIdentity()
Creates an identity transform.
Definition SimdTransform_inl.h:28
A 4-component SIMD vector class.
Definition SimdVec4f.h:8