3 #include "testing/testing.h"
17 float in_quat[4] = {
w,
x,
y,
z};
18 float norm_quat[4], matrix[3][3], out_quat[4];
29 EXPECT_V4_NEAR(norm_quat, out_quat, FLT_EPSILON);
32 TEST(math_rotation, quat_to_mat_to_quat_rot180)
40 TEST(math_rotation, quat_to_mat_to_quat_rot180n)
48 TEST(math_rotation, quat_to_mat_to_quat_rot90)
50 const float s2 = 1 /
sqrtf(2);
59 TEST(math_rotation, quat_to_mat_to_quat_rot90n)
61 const float s2 = 1 /
sqrtf(2);
70 TEST(math_rotation, quat_to_mat_to_quat_bad_T83196)
79 TEST(math_rotation, quat_to_mat_to_quat_bad_negative)
85 TEST(math_rotation, quat_to_mat_to_quat_near_1000)
99 TEST(math_rotation, quat_to_mat_to_quat_near_0100)
113 TEST(math_rotation, quat_to_mat_to_quat_near_0010)
127 TEST(math_rotation, quat_to_mat_to_quat_near_0001)
141 TEST(math_rotation, quat_split_swing_and_twist_negative)
143 const float input[4] = {-0.5f, 0,
sqrtf(3) / 2, 0};
144 const float expected_swing[4] = {1.0f, 0, 0, 0};
145 const float expected_twist[4] = {0.5f, 0, -
sqrtf(3) / 2, 0};
146 float swing[4], twist[4];
150 EXPECT_NEAR(twist_angle, -
M_PI * 2 / 3, FLT_EPSILON);
151 EXPECT_V4_NEAR(swing, expected_swing, FLT_EPSILON);
152 EXPECT_V4_NEAR(twist, expected_twist, FLT_EPSILON);
161 for (
int i = 0; i < range; i++) {
164 const float phi = (
float)(2.0 *
M_PI) * ((
float)i / (
float)range);
165 const float sin_cos_test_fl[2] = {
sinf(phi),
cosf(phi)};
166 EXPECT_V2_NEAR(sin_cos_fl, sin_cos_test_fl, expected_eps);
171 TEST(math_rotation, sin_cos_from_fraction_accuracy)
173 for (
int range = 1; range <= 64; range++) {
186 } multiple_of = (range & 1) ? MULTIPLE_OF_1 : ((range & 3) ? MULTIPLE_OF_2 : MULTIPLE_OF_4);
190 for (
int i = 0; i < range; i++) {
193 switch (multiple_of) {
194 case MULTIPLE_OF_1: {
195 sin_cos_fl[0] =
fabsf(sin_cos_fl[0]);
198 case MULTIPLE_OF_2: {
199 sin_cos_fl[0] =
fabsf(sin_cos_fl[0]);
200 sin_cos_fl[1] =
fabsf(sin_cos_fl[1]);
203 case MULTIPLE_OF_4: {
204 sin_cos_fl[0] =
fabsf(sin_cos_fl[0]);
205 sin_cos_fl[1] =
fabsf(sin_cos_fl[1]);
206 if (sin_cos_fl[0] > sin_cos_fl[1]) {
207 SWAP(
float, sin_cos_fl[0], sin_cos_fl[1]);
216 float delta = b[0] - a[0];
222 int unique_coords_count = 1;
225 for (
int i = 1; i < range; i_prev = i++) {
226 if (coords[i_prev] != coords[i]) {
227 unique_coords_count += 1;
231 switch (multiple_of) {
232 case MULTIPLE_OF_1: {
233 EXPECT_EQ(unique_coords_count, (range / 2) + 1);
236 case MULTIPLE_OF_2: {
237 EXPECT_EQ(unique_coords_count, (range / 4) + 1);
240 case MULTIPLE_OF_4: {
241 EXPECT_EQ(unique_coords_count, (range / 8) + 1);
247 TEST(math_rotation, sin_cos_from_fraction_symmetry)
249 for (
int range = 1; range <= 64; range++) {
258 TEST(math_rotation, RotateDirectionAroundAxis)
261 EXPECT_NEAR(
a.x, 0.0f, FLT_EPSILON);
262 EXPECT_NEAR(
a.y, 1.0f, FLT_EPSILON);
263 EXPECT_NEAR(
a.z, 0.0f, FLT_EPSILON);
265 EXPECT_NEAR(
b.x, -1.0f, FLT_EPSILON);
266 EXPECT_NEAR(
b.y, 0.0f, FLT_EPSILON);
267 EXPECT_NEAR(
b.z, 0.0f, FLT_EPSILON);
269 EXPECT_NEAR(
c.x, 0.0f, FLT_EPSILON);
270 EXPECT_NEAR(
c.y, 0.0f, FLT_EPSILON);
271 EXPECT_NEAR(
c.z, 1.0f, FLT_EPSILON);
typedef float(TangentPoint)[2]
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
void sin_cos_from_fraction(int numerator, int denominator, float *r_sin, float *r_cos)
void mul_qt_fl(float q[4], float f)
float normalize_qt_qt(float r[4], const float q[4])
void quat_to_mat3(float mat[3][3], const float q[4])
float quat_split_swing_and_twist(const float q[4], int axis, float r_swing[4], float r_twist[4])
void mat3_normalized_to_quat(float q[4], const float mat[3][3])
TEST(math_rotation, quat_to_mat_to_quat_rot180)
static void test_sin_cos_from_fraction_accuracy(const int range, const float expected_eps)
static void test_quat_to_mat_to_quat(float w, float x, float y, float z)
static void test_sin_cos_from_fraction_symmetry(const int range)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble z
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
void sort(btMatrix3x3 &U, btVector3 &sigma, btMatrix3x3 &V, int t)
Helper function of 3X3 SVD for sorting singular values.
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
void append_unchecked(const T &value)
void reserve(const int64_t min_capacity)
ccl_global KernelShaderEvalInput * input
TEST(math_rotation, RotateDirectionAroundAxis)
float3 rotate_direction_around_axis(const float3 &direction, const float3 &axis, float angle)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)