-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathQuaternion.h
99 lines (74 loc) · 2.68 KB
/
Quaternion.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#pragma once
#include <DirectXMath.h>
#include <KMathConstants.h>
#include <Coordinate/Vector.h>
#include <Coordinate/Matrix.h>
namespace KEngine
{
namespace Math
{
namespace D3
{
class alignas(M128Alignment) Quaternion
{
#pragma region Public Interface
public:
#pragma region Static Functions
static Quaternion Slerp(const Quaternion& p_start, const Quaternion& p_end, float p_fraction);
static Quaternion Squad(
const Quaternion& p_start,
const Quaternion& p_controlQuatA,
const Quaternion& p_controlQuatB,
const Quaternion& p_end,
float p_fraction);
#pragma endregion
#pragma region Static Members
static const Quaternion Identity;
#pragma endregion
#pragma region Constructors
constexpr Quaternion();
Quaternion(float p_x, float p_y, float p_z, float p_w);
Quaternion(const Data::Storage::Array<float, 4>& p_floatArray);
Quaternion(const Coordinate::Vector<3>& p_axis, float p_angle);
Quaternion(float p_roll, float p_pitch, float p_yaw);
Quaternion(const Coordinate::Matrix<3, 3>& p_rotationMatrix);
constexpr explicit Quaternion(const DirectX::XMVECTOR& p_quatVector);
#pragma endregion
#pragma region Operators
bool operator==(const Quaternion& p_rhs) const;
bool operator!=(const Quaternion& p_rhs) const;
Quaternion operator*(const Quaternion& p_rhs) const;
Quaternion& operator*=(const Quaternion& p_rhs);
operator DirectX::XMVECTOR() const;
#pragma endregion
#pragma region Methods
bool IsValid() const;
Quaternion GetConjugate() const;
Quaternion GetInverse() const;
Quaternion GetLn() const;
Quaternion GetExponential() const;
Coordinate::Matrix<3, 3> MakeRotationMatrix() const;
float Magnitude() const;
float MagnitudeSq() const;
Quaternion Normalize() const;
float Dot(const Quaternion& p_rhs) const;
void GetAxisAngle(Coordinate::Vector<3>* Axis, float* angle) const;
Coordinate::Vector<3> Rotate(const Coordinate::Vector<3>& p_vector) const;
template<size_t numVectors>
Data::Storage::Array<Coordinate::Vector<3>, numVectors> RotateStream(const Data::Storage::Array<Coordinate::Vector<3>, numVectors>& p_vectorArray) const;
void RotateStream(Coordinate::Vector<3>* p_dataInput, size_t p_numInput, size_t p_inputStride, Coordinate::Vector<3>* p_dataOutput, size_t p_outputStride) const;
#pragma endregion
#pragma region Data
#pragma endregion
#pragma endregion
#pragma region Private Interface
private:
#pragma region Data
DirectX::XMVECTOR m_vector;
#pragma endregion
#pragma endregion
};
}
}
}
#include "Quaternion.inl"