13#include <glm/gtc/quaternion.hpp>
14#define GLM_ENABLE_EXPERIMENTAL
15#include <glm/gtx/euler_angles.hpp>
19#define KR_SMALL_NUMBER (1.e-8f)
68 TRotator(glm::vec3 EulerAngles);
83 inline TRotator
Inverse()
const;
85 inline TRotator operator*(
const TRotator& Other)
const
90 inline glm::vec3 operator*(
const glm::vec3& Translation)
const
92 glm::mat4 transform = glm::eulerAngleYXZ(m_Pitch, m_Yaw, m_Roll);
93 glm::vec4 tempResult = transform * glm::vec4(Translation.x, Translation.y, Translation.z, 1.0f);
95 glm::vec3 returnVector(tempResult.x, tempResult.y, tempResult.z);
99 inline glm::quat ToQuat()
const
101 return glm::quat(glm::vec3(m_Pitch, m_Yaw, m_Roll));
128 FTransform(glm::vec3 rotation, glm::vec3 translation, glm::vec3 scale3D);
130 inline const glm::vec3& GetLocation() {
return GetTranslation(); }
131 inline const TRotator& GetRotation()
const {
return m_Rotation; }
132 inline const glm::vec3& GetTranslation()
const {
return m_Translation; }
133 inline const glm::vec3& GetScale3D()
const {
return m_Scale3D; }
135 static FTransform Identity();
137 inline void SetScale3D(
const glm::vec3& newScale)
139 m_Scale3D = newScale;
142 inline void SetRotation(
const TRotator& newRotation)
144 m_Rotation = newRotation;
147 inline void SetTranslation(
const glm::vec3& newTranslation)
149 m_Translation = newTranslation;
152 FTransform GetRelativeTransform(
const FTransform& RelativeToWhat)
const;
163 FTransform
operator*(
const FTransform& Other)
const;
176 inline static void Multiply(FTransform* OutTransform,
const FTransform* A,
const FTransform* B);
178 inline bool AnyHasNegativeScale(
const glm::vec3& InScale3D,
const glm::vec3& InOtherScale3D)
const
180 return (InScale3D.x < 0.f || InScale3D.y < 0.f || InScale3D.z < 0.f
181 || InOtherScale3D.x < 0.f || InOtherScale3D.y < 0.f || InOtherScale3D.z < 0.f);
193 glm::vec3 SafeReciprocalScale;
195 if (glm::abs(InScale.x) <= Tolerance)
197 SafeReciprocalScale.x = 0.f;
201 SafeReciprocalScale.x = 1 / InScale.x;
204 if (glm::abs(InScale.y) <= Tolerance)
206 SafeReciprocalScale.y = 0.f;
210 SafeReciprocalScale.y = 1 / InScale.y;
213 if (glm::abs(InScale.z) <= Tolerance)
215 SafeReciprocalScale.z = 0.f;
219 SafeReciprocalScale.z = 1 / InScale.z;
222 return SafeReciprocalScale;
228 m_Translation = Other.GetTranslation();
234 m_Rotation = Other.GetRotation();
240 m_Scale3D = Other.GetScale3D();
243 glm::mat4 ToMatrixWithScale()
const;
245 void ToTransform(
const glm::mat4 Matrix);
254 glm::vec3 m_Translation;
#define KARMA_API
Defining Karma's API macro for storage class information.
Definition Core.h:41
#define FORCEINLINE
Typical inlining macro for clarity.
Definition Core.h:170
Floating point quaternion that can represent a rotation about an axis in 3-D space....
Definition Transform.h:35
glm::vec1 Y
Definition Transform.h:41
glm::vec1 Z
Definition Transform.h:44
glm::vec1 X
Definition Transform.h:38
glm::vec1 W
Definition Transform.h:47
Implements a container for rotation information.
Definition Transform.h:66
TRotator Inverse() const
Returns the counter of this rotation governed by Yaw, Pitch, and Roll in the fashion above.
Definition Transform.cpp:22
float m_Roll
Definition Transform.h:77
float m_Pitch
Definition Transform.h:71
float m_Yaw
Definition Transform.h:74