16#include "testing/testing.h"
40 EXPECT_NEAR(
dot_v3v3_db(dmat[0], dmat[1]), 0.0, epsilon_ortho);
41 EXPECT_NEAR(
dot_v3v3_db(dmat[0], dmat[2]), 0.0, epsilon_ortho);
42 EXPECT_NEAR(
dot_v3v3_db(dmat[1], dmat[2]), 0.0, epsilon_ortho);
54 float unit_matrix[3][3];
61 EXPECT_FLOAT_EQ(0.0f, roll);
64 EXPECT_FLOAT_EQ(0.0f, roll);
67 EXPECT_FLOAT_EQ(0.0f, roll);
71 float vector[3] = {1.0f, 1.0f, 1.0f};
84 float rotation_matrix[3][3];
87 const float rot_around_x[3] = {1.234f, 0.0f, 0.0f};
91 const float unit_axis_x[3] = {1.0f, 0.0f, 0.0f};
97 const float unit_axis_y[3] = {0.0f, 1.0f, 0.0f};
103 const float unit_axis_z[3] = {0.0f, 0.0f, 1.0f};
109 const float between_x_and_y[3] = {1.0f, 1.0f, 0.0f};
118 const float expected_roll_mat[3][3],
121 float input_normalized[3];
122 float roll_mat[3][3];
134 EXPECT_V3_NEAR(roll_mat[1], input_normalized, FLT_EPSILON);
136 if (expected_roll_mat) {
137 EXPECT_M3_NEAR(roll_mat, expected_roll_mat, FLT_EPSILON);
148 const double scale =
M_1_PI / 10;
149 double theta =
x *
x +
z *
z;
150 double minv = 0, maxv = 1
e-2;
152 while (maxv - minv > FLT_EPSILON * 1
e-3) {
153 double mid = (minv + maxv) / 2;
155 float roll_mat[3][3];
157 -
float(
sqrt(1 - theta * mid * mid) * scale),
164 if (roll_mat[0][0] == -1 && roll_mat[0][1] == 0 && roll_mat[2][1] == 0) {
172 return sqrt(theta) * (minv + maxv) * 0.5;
189 const float input[3] = {0.0f, -1.0f, 0.0f};
190 const float expected_roll_mat[3][3] = {
191 {-1.0f, 0.0f, 0.0f}, {0.0f, -1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}};
200 const float input[3] = {1
e-24, -0.999999881, 0};
201 const float expected_roll_mat[3][3] = {
202 {-1.0f, 0.0f, 0.0f}, {0.0f, -1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}};
209 const float input[3] = {2.5e-4f, -0.999999881f, 2.5e-4f};
210 const float expected_roll_mat[3][3] = {{0.000000f, -2.5e-4f, -1.000000f},
211 {2.5e-4f, -0.999999881f, 2.5e-4f},
212 {-1.000000f, -2.5e-4f, 0.000000f}};
220 const float input[3] = {1, 0, 0};
221 const float expected_roll_mat[3][3] = {{0, -1, 0}, {1, 0, 0}, {0, 0, 1}};
228 const float input[3] = {-1, 0, 0};
229 const float expected_roll_mat[3][3] = {{0, 1, 0}, {-1, 0, 0}, {0, 0, 1}};
236 const float input[3] = {0, 0, -1};
237 const float expected_roll_mat[3][3] = {{1, 0, 0}, {0, 0, -1}, {0, 1, 0}};
244 const float input[3] = {0, 0, 1};
245 const float expected_roll_mat[3][3] = {{1, 0, 0}, {0, 0, 1}, {0, -1, 0}};
252 const float input[3] = {1.0f, 1.0f, 1.0f};
253 const float expected_roll_mat[3][3] = {{0.788675129f, -0.577350259f, -0.211324856f},
254 {0.577350259f, 0.577350259f, 0.577350259f},
255 {-0.211324856f, -0.577350259f, 0.788675129f}};
261 const float input[3] = {1.0f, -1.0f, 1.0f};
262 const float expected_roll_mat[3][3] = {{0.211324856f, -0.577350259f, -0.788675129f},
263 {0.577350259f, -0.577350259f, 0.577350259f},
264 {-0.788675129f, -0.577350259f, 0.211324856f}};
270 const float input[3] = {-1.0f, -1.0f, 1.0f};
271 const float expected_roll_mat[3][3] = {{0.211324856f, 0.577350259f, 0.788675129f},
272 {-0.577350259f, -0.577350259f, 0.577350259f},
273 {0.788675129f, -0.577350259f, 0.211324856f}};
279 const float input[3] = {-1.0f, -1.0f, -1.0f};
280 const float expected_roll_mat[3][3] = {{0.211324856f, 0.577350259f, -0.788675129f},
281 {-0.577350259f, -0.577350259f, -0.577350259f},
282 {-0.788675129f, 0.577350259f, 0.211324856f}};
289 const float input[3] = {1.0f, 1.0f, 1.0f};
290 const float expected_roll_mat[3][3] = {{0.211324856f, 0.577350259f, -0.788675129f},
291 {0.577350259f, 0.577350259f, 0.577350259f},
292 {0.788675129f, -0.577350259f, -0.211324856f}};
307 const int count = 5000;
312 double t = double(
i) /
count;
316 double curdelta =
abs(det - 1);
317 if (curdelta > delta) {
323 printf(
" Max determinant deviation %.10f at %f.\n", delta, tmax);
326#define TEST_VEC_ROLL_TO_MAT3_ORTHOGONAL(name, s, x1, x2, y1, y2) \
327 TEST(vec_roll_to_mat3_normalized, name) \
329 test_vec_roll_to_mat3_orthogonal(s, x1, x2, y1, y2); \
378 std::vector<Bone *> seen_bones;
379 auto callback = [&](
Bone *bone) { seen_bones.push_back(bone); };
383 ASSERT_EQ(seen_bones.size(), 2) <<
"Expected 2 selected bones, got " << seen_bones.size();
387 EXPECT_FALSE(
result.all_bones_selected);
388 EXPECT_FALSE(
result.no_bones_selected);
393 bone1.flag = bone2.flag = bone3.flag = 0;
395 std::vector<Bone *> seen_bones;
396 auto callback = [&](
Bone *bone) { seen_bones.push_back(bone); };
400 EXPECT_TRUE(seen_bones.empty()) <<
"Expected no selected bones, got " << seen_bones.size();
401 EXPECT_FALSE(
result.all_bones_selected);
402 EXPECT_TRUE(
result.no_bones_selected);
409 std::vector<Bone *> seen_bones;
410 auto callback = [&](
Bone *bone) { seen_bones.push_back(bone); };
414 ASSERT_EQ(seen_bones.size(), 3) <<
"Expected 3 selected bones, got " << seen_bones.size();
419 EXPECT_TRUE(
result.all_bones_selected);
420 EXPECT_FALSE(
result.no_bones_selected);
void mat3_vec_to_roll(const float mat[3][3], const float vec[3], float *r_roll)
void vec_roll_to_mat3_normalized(const float nor[3], float roll, float r_mat[3][3])
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE double interpd(double target, double origin, double t)
void unit_m3(float m[3][3])
void copy_m3d_m3(double m1[3][3], const float m2[3][3])
void eul_to_mat3(float mat[3][3], const float eul[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE double dot_v3v3_db(const double a[3], const double b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float normalize_v3_v3(float r[3], const float a[3])
MINLINE float normalize_v3(float n[3])
char * STRNCPY(char(&dst)[N], const char *src)
#define TEST_VEC_ROLL_TO_MAT3_ORTHOGONAL(name, s, x1, x2, y1, y2)
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
float determinant(MatBase< C, R >) RET
VecBase< float, D > normalize(VecOp< float, D >) RET
static double find_flip_boundary(double x, double z)
static const float SCALE_EPSILON
TEST_F(ArmatureDeformTest, MeshDeform)
static double test_vec_roll_to_mat3_orthogonal(double s, double x, double z)
static double EXPECT_M3_ORTHOGONAL(const float mat[3][3], double epsilon_scale, double epsilon_ortho)
static const float ORTHO_EPSILON
TEST(action_groups, ReconstructGroupsWithReordering)
static const float FLOAT_EPSILON
static double test_vec_roll_to_mat3_normalized(const float input[3], float roll, const float expected_roll_mat[3][3], bool normalize=true)
SelectedBonesResult BKE_armature_find_selected_bones(const bArmature *armature, SelectedBoneCallback callback)
T length(const VecBase< T, Size > &a)
T determinant(const MatBase< T, Size, Size > &mat)
MatBase< double, 3, 3 > double3x3
const c_style_mat & ptr() const