38void generate_axes_to_quaternion_switch_cases()
40 std::cout <<
"default: *this = identity(); break;" << std::endl;
42 for (
int i : IndexRange(6)) {
43 for (
int j : IndexRange(6)) {
44 const AxisSigned forward = AxisSigned(i);
45 const AxisSigned up = AxisSigned(j);
47 if (Axis(forward) == Axis(up)) {
55 VecBase<AxisSigned, 3> axes{
cross(forward, up), forward, up};
59 mat.y_axis() =
float3(axes.y);
60 mat.z_axis() =
float3(axes.z);
66 auto format_component = [](
int value) {
72 return (value > 0) ?
"T(0.5)" :
"T(-0.5)";
74 return (value > 0) ?
"T(M_SQRT1_2)" :
"T(-M_SQRT1_2)";
76 return (value > 0) ?
"T(1)" :
"T(-1)";
79 auto format_axis = [](AxisSigned axis) {
83 return "AxisSigned::X_POS";
85 return "AxisSigned::Y_POS";
87 return "AxisSigned::Z_POS";
89 return "AxisSigned::X_NEG";
91 return "AxisSigned::Y_NEG";
93 return "AxisSigned::Z_NEG";
98 std::cout << format_axis(axes.x) <<
" << 16 | ";
99 std::cout << format_axis(axes.y) <<
" << 8 | ";
100 std::cout << format_axis(axes.z);
101 std::cout <<
": *this = {";
102 std::cout << format_component(p.
x) <<
", ";
103 std::cout << format_component(p.
y) <<
", ";
104 std::cout << format_component(p.
z) <<
", ";
105 std::cout << format_component(p.
w) <<
"}; break;";
106 std::cout << std::endl;
126 return axis_scaled +
diff * std::cos(angle) +
cross * std::sin(angle);
139 return result + center;
147 return stream <<
"XYZ";
149 return stream <<
"XZY";
151 return stream <<
"YXZ";
153 return stream <<
"YZX";
155 return stream <<
"ZXY";
157 return stream <<
"ZYX";
void mul_m3_v3(const float M[3][3], float r[3])
void axis_angle_normalized_to_mat3(float R[3][3], const float axis[3], float angle)
static constexpr Value Z_POS
static constexpr Value Y_NEG
static constexpr Value Z_NEG
static constexpr Value X_NEG
static constexpr Value Y_POS
static constexpr Value X_POS
IMETHOD Vector diff(const Vector &a, const Vector &b, double dt)
T pow(const T &x, const T &power)
QuaternionBase< T > to_quaternion(const AxisAngleBase< T, AngleT > &axis_angle)
std::ostream & operator<<(std::ostream &stream, EulerOrder order)
AxisAngleBase< float, AngleRadianBase< float > > AxisAngle
EulerXYZBase< float > EulerXYZ
T dot(const QuaternionBase< T > &a, const QuaternionBase< T > &b)
float3 rotate_direction_around_axis(const float3 &direction, const float3 &axis, float angle)
AxisSigned cross(const AxisSigned a, const AxisSigned b)
AxisAngleBase< T, AngleT > to_axis_angle(const EulerXYZBase< T > &euler)
AxisAngleBase< float, AngleCartesianBase< float > > AxisAngleCartesian
Euler3Base< float > Euler3
bool is_unit(const VecBase< T, Size > &a, const T epsilon=T(10) *std::numeric_limits< T >::epsilon())
float3 rotate_around_axis(const float3 &vector, const float3 ¢er, const float3 &axis, float angle)
Euler3Base< T > to_euler(const AxisAngleBase< T, AngleT > &axis_angle, EulerOrder order)
VecBase< int32_t, 4 > int4
VecBase< float, 4 > float4
MatBase< float, 3, 3 > float3x3
VecBase< float, 3 > float3