Euphoria
quat.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "base/vec3.h"
4 #include "base/numeric.h"
5 #include "base/axisangle.h"
6 #include "base/angle.h"
7 #include "base/mat4.h"
8 #include "base/polarcoord.h"
10 
11 
12 namespace eu
13 {
14  struct quatf
15  {
16  float w;
17  float x;
18  float y;
19  float z;
20 
21  constexpr quatf(float aw, const vec3f& v)
22  : w(aw)
23  , x(v.x)
24  , y(v.y)
25  , z(v.z)
26  {
27  }
28 
29  [[nodiscard]] static quatf from_axis_angle(const AxisAngle& aa);
30  [[nodiscard]] static quatf from_ypr(const Angle& yaw, const Angle& pitch, const Angle& roll);
31  [[nodiscard]] static quatf from_to(const quatf& from, const quatf& to);
32  [[nodiscard]] static quatf from_random(Random* random);
33  [[nodiscard]] static quatf look_at(const vec3f& from, const vec3f& to, const unit3f& up);
34  [[nodiscard]] static quatf look_in_direction(const unit3f& dir, const unit3f& up);
35 
36  float* get_data_ptr();
37  void normalize();
38 
40  [[nodiscard]] vec3f create_from_right_up_in(const vec3f& v) const;
41  [[nodiscard]] quatf get_rotated(const quatf& q) const;
42  [[nodiscard]] unit3f rotate_around_origo(const unit3f& v) const;
43 
44  // the negated represents the same rotation
45  [[nodiscard]] quatf get_negated() const;
46 
47  [[nodiscard]] mat4f to_mat4() const;
48  [[nodiscard]] AxisAngle to_axis_angle() const;
49  [[nodiscard]] const float* get_data_ptr() const;
50  [[nodiscard]] vec3f get_vec_part() const;
51  [[nodiscard]] quatf get_conjugate() const;
52  [[nodiscard]] quatf get_inverse() const;
53  [[nodiscard]] quatf get_identity() const;
54  [[nodiscard]] float get_length() const;
55  [[nodiscard]] float get_length_squared() const;
56  [[nodiscard]] quatf get_normalized() const;
57 
58  [[nodiscard]] unit3f get_in() const;
59  [[nodiscard]] unit3f get_out() const;
60  [[nodiscard]] unit3f get_right() const;
61  [[nodiscard]] unit3f get_left() const;
62  [[nodiscard]] unit3f get_up() const;
63  [[nodiscard]] unit3f get_down() const;
64 
65  void operator+=(const quatf& rhs);
66  void operator-=(const quatf& rhs);
67  void operator*=(float rhs);
68  void operator*=(const quatf& rhs);
69  };
70 
71  constexpr quatf q_identity = quatf(1, vec3f(0, 0, 0));
72 
73  quatf lerp_quatf(const quatf& f, float scale, const quatf& t);
74  quatf slerp_fast(const quatf& qa, float t, const quatf& qb);
75  quatf slerp_shortway(const quatf& from, float scale, const quatf& to);
76 
78 
79  float dot(const quatf& lhs, const quatf& rhs);
80 
81  std::string to_string(const quatf& v);
82 
83  quatf operator*(const quatf& lhs, const quatf& rhs);
84  quatf operator*(float scale, const quatf& q);
85  quatf operator*(const quatf& q, float scale);
86  quatf operator+(const quatf& lhs, const quatf& rhs);
87  quatf operator-(const quatf& lhs, const quatf& rhs);
88 }
89 
Definition: assert.h:90
Angle operator+(const Angle &lhs, const Angle &rhs)
Definition: angle.cc:123
constexpr quatf q_identity
Definition: quat.h:71
Angle operator-(const Angle &lhs, const Angle &rhs)
Definition: angle.cc:132
quatf slerp_fast(const quatf &qa, const float t, const quatf &qb)
Definition: quat.cc:221
quatf lerp_quatf(const quatf &f, const float scale, const quatf &t)
Definition: quat.cc:214
std::string to_string(const Aabb &a)
Definition: aabb.cc:110
DEFAULT_INTERPOLATE(Angle, lerp_angle)
quatf slerp_shortway(const quatf &from, const float scale, const quatf &to)
Definition: quat.cc:258
Angle operator*(const Angle &lhs, float rhs)
Definition: angle.cc:149
float dot(const quatf &lhs, const quatf &rhs)
Definition: quat.cc:363
ADD_DEFAULT_FORMATTER(eu::quatf, std::string, eu::to_string)
WEL512 Random Number Generator.
Definition: random.h:21
Definition: mat4.h:14
Definition: quat.h:15
static quatf look_in_direction(const unit3f &dir, const unit3f &up)
Definition: quat.cc:332
mat4f to_mat4() const
Definition: quat.cc:75
float y
Definition: quat.h:18
constexpr quatf(float aw, const vec3f &v)
Definition: quat.h:21
AxisAngle to_axis_angle() const
Definition: quat.cc:82
quatf get_conjugate() const
Definition: quat.cc:112
float z
Definition: quat.h:19
void normalize()
Definition: quat.cc:160
float get_length_squared() const
Definition: quat.cc:153
static quatf from_random(Random *random)
Definition: quat.cc:65
quatf get_identity() const
Definition: quat.cc:136
float x
Definition: quat.h:17
static quatf from_to(const quatf &from, const quatf &to)
Definition: quat.cc:57
unit3f get_left() const
Definition: quat.cc:189
static quatf from_axis_angle(const AxisAngle &aa)
Definition: quat.cc:23
unit3f get_in() const
Definition: quat.cc:186
void operator-=(const quatf &rhs)
Definition: quat.cc:282
vec3f get_vec_part() const
Definition: quat.cc:16
unit3f rotate_around_origo(const unit3f &v) const
Definition: quat.cc:203
unit3f get_out() const
Definition: quat.cc:187
quatf get_normalized() const
Definition: quat.cc:178
float get_length() const
Definition: quat.cc:146
float * get_data_ptr()
Definition: quat.cc:6
unit3f get_up() const
Definition: quat.cc:190
float w
Definition: quat.h:16
quatf get_negated() const
Definition: quat.cc:129
void operator*=(float rhs)
Definition: quat.cc:292
unit3f get_right() const
Definition: quat.cc:188
static quatf from_ypr(const Angle &yaw, const Angle &pitch, const Angle &roll)
Definition: quat.cc:34
vec3f create_from_right_up_in(const vec3f &v) const
returns In*Z + Right*X + Up*Y
Definition: quat.cc:196
quatf get_rotated(const quatf &q) const
Definition: quat.cc:105
unit3f get_down() const
Definition: quat.cc:191
void operator+=(const quatf &rhs)
Definition: quat.cc:272
static quatf look_at(const vec3f &from, const vec3f &to, const unit3f &up)
Definition: quat.cc:98
quatf get_inverse() const
Definition: quat.cc:119
Definition: vec3.h:48