17#include "testing/testing.h"
36 EXPECT_NEAR(
len_v3_db(dmat[0]), 1.0, epsilon_scale);
37 EXPECT_NEAR(
len_v3_db(dmat[1]), 1.0, epsilon_scale);
38 EXPECT_NEAR(
len_v3_db(dmat[2]), 1.0, epsilon_scale);
41 EXPECT_NEAR(
dot_v3v3_db(dmat[0], dmat[1]), 0.0, epsilon_ortho);
42 EXPECT_NEAR(
dot_v3v3_db(dmat[0], dmat[2]), 0.0, epsilon_ortho);
43 EXPECT_NEAR(
dot_v3v3_db(dmat[1], dmat[2]), 0.0, epsilon_ortho);
55 float unit_matrix[3][3];
62 EXPECT_FLOAT_EQ(0.0f, roll);
65 EXPECT_FLOAT_EQ(0.0f, roll);
68 EXPECT_FLOAT_EQ(0.0f, roll);
72 float vector[3] = {1.0f, 1.0f, 1.0f};
85 float rotation_matrix[3][3];
88 const float rot_around_x[3] = {1.234f, 0.0f, 0.0f};
92 const float unit_axis_x[3] = {1.0f, 0.0f, 0.0f};
98 const float unit_axis_y[3] = {0.0f, 1.0f, 0.0f};
104 const float unit_axis_z[3] = {0.0f, 0.0f, 1.0f};
110 const float between_x_and_y[3] = {1.0f, 1.0f, 0.0f};
119 const float expected_roll_mat[3][3],
122 float input_normalized[3];
123 float roll_mat[3][3];
135 EXPECT_V3_NEAR(roll_mat[1], input_normalized, FLT_EPSILON);
137 if (expected_roll_mat) {
138 EXPECT_M3_NEAR(roll_mat, expected_roll_mat, FLT_EPSILON);
149 const double scale =
M_1_PI / 10;
150 double theta = x * x +
z *
z;
151 double minv = 0, maxv = 1
e-2;
153 while (maxv - minv > FLT_EPSILON * 1
e-3) {
154 double mid = (minv + maxv) / 2;
156 float roll_mat[3][3];
157 float input[3] = {
float(x * mid * scale),
158 -
float(
sqrt(1 - theta * mid * mid) * scale),
165 if (roll_mat[0][0] == -1 && roll_mat[0][1] == 0 && roll_mat[2][1] == 0) {
173 return sqrt(theta) * (minv + maxv) * 0.5;
190 const float input[3] = {0.0f, -1.0f, 0.0f};
191 const float expected_roll_mat[3][3] = {
192 {-1.0f, 0.0f, 0.0f}, {0.0f, -1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}};
201 const float input[3] = {1
e-24, -0.999999881, 0};
202 const float expected_roll_mat[3][3] = {
203 {-1.0f, 0.0f, 0.0f}, {0.0f, -1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}};
210 const float input[3] = {2.5e-4f, -0.999999881f, 2.5e-4f};
211 const float expected_roll_mat[3][3] = {{0.000000f, -2.5e-4f, -1.000000f},
212 {2.5e-4f, -0.999999881f, 2.5e-4f},
213 {-1.000000f, -2.5e-4f, 0.000000f}};
221 const float input[3] = {1, 0, 0};
222 const float expected_roll_mat[3][3] = {{0, -1, 0}, {1, 0, 0}, {0, 0, 1}};
229 const float input[3] = {-1, 0, 0};
230 const float expected_roll_mat[3][3] = {{0, 1, 0}, {-1, 0, 0}, {0, 0, 1}};
237 const float input[3] = {0, 0, -1};
238 const float expected_roll_mat[3][3] = {{1, 0, 0}, {0, 0, -1}, {0, 1, 0}};
245 const float input[3] = {0, 0, 1};
246 const float expected_roll_mat[3][3] = {{1, 0, 0}, {0, 0, 1}, {0, -1, 0}};
253 const float input[3] = {1.0f, 1.0f, 1.0f};
254 const float expected_roll_mat[3][3] = {{0.788675129f, -0.577350259f, -0.211324856f},
255 {0.577350259f, 0.577350259f, 0.577350259f},
256 {-0.211324856f, -0.577350259f, 0.788675129f}};
262 const float input[3] = {1.0f, -1.0f, 1.0f};
263 const float expected_roll_mat[3][3] = {{0.211324856f, -0.577350259f, -0.788675129f},
264 {0.577350259f, -0.577350259f, 0.577350259f},
265 {-0.788675129f, -0.577350259f, 0.211324856f}};
271 const float input[3] = {-1.0f, -1.0f, 1.0f};
272 const float expected_roll_mat[3][3] = {{0.211324856f, 0.577350259f, 0.788675129f},
273 {-0.577350259f, -0.577350259f, 0.577350259f},
274 {0.788675129f, -0.577350259f, 0.211324856f}};
280 const float input[3] = {-1.0f, -1.0f, -1.0f};
281 const float expected_roll_mat[3][3] = {{0.211324856f, 0.577350259f, -0.788675129f},
282 {-0.577350259f, -0.577350259f, -0.577350259f},
283 {-0.788675129f, 0.577350259f, 0.211324856f}};
290 const float input[3] = {1.0f, 1.0f, 1.0f};
291 const float expected_roll_mat[3][3] = {{0.211324856f, 0.577350259f, -0.788675129f},
292 {0.577350259f, 0.577350259f, 0.577350259f},
293 {0.788675129f, -0.577350259f, -0.211324856f}};
308 const int count = 5000;
312 for (
int i = 0; i <=
count; i++) {
317 double curdelta =
abs(det - 1);
318 if (curdelta > delta) {
324 printf(
" Max determinant deviation %.10f at %f.\n", delta, tmax);
327#define TEST_VEC_ROLL_TO_MAT3_ORTHOGONAL(name, s, x1, x2, y1, y2) \
328 TEST(vec_roll_to_mat3_normalized, name) \
330 test_vec_roll_to_mat3_orthogonal(s, x1, x2, y1, y2); \
363 memset(&arm, 0,
sizeof(arm));
364 memset(&bone1, 0,
sizeof(
Bone));
365 memset(&bone2, 0,
sizeof(
Bone));
366 memset(&bone3, 0,
sizeof(
Bone));
384 std::vector<Bone *> seen_bones;
385 auto callback = [&](
Bone *bone) { seen_bones.push_back(bone); };
389 ASSERT_EQ(seen_bones.size(), 2) <<
"Expected 2 selected bones, got " << seen_bones.size();
393 EXPECT_FALSE(result.all_bones_selected);
394 EXPECT_FALSE(result.no_bones_selected);
399 bone1.flag = bone2.flag = bone3.flag = 0;
401 std::vector<Bone *> seen_bones;
402 auto callback = [&](
Bone *bone) { seen_bones.push_back(bone); };
406 EXPECT_TRUE(seen_bones.empty()) <<
"Expected no selected bones, got " << seen_bones.size();
407 EXPECT_FALSE(result.all_bones_selected);
408 EXPECT_TRUE(result.no_bones_selected);
415 std::vector<Bone *> seen_bones;
416 auto callback = [&](
Bone *bone) { seen_bones.push_back(bone); };
420 ASSERT_EQ(seen_bones.size(), 3) <<
"Expected 3 selected bones, got " << seen_bones.size();
425 EXPECT_TRUE(result.all_bones_selected);
426 EXPECT_FALSE(result.no_bones_selected);
C++ functions to deal with Armature collections (i.e. the successor of bone layers).
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(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE double interpd(double target, double origin, double t)
void unit_m3(float m[3][3])
double determinant_m3_array_db(const double 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 double len_v3_db(const double a[3]) ATTR_WARN_UNUSED_RESULT
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])
#define STRNCPY(dst, src)
typedef double(DMatrix)[4][4]
#define TEST_VEC_ROLL_TO_MAT3_ORTHOGONAL(name, s, x1, x2, y1, y2)
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
btScalar determinant() const
Return the determinant of the matrix.
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
SIMD_FORCE_INLINE btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
DEGForeachIDComponentCallback callback
draw_view in_light_buf[] float
static double find_flip_boundary(double x, double z)
static const float SCALE_EPSILON
TEST_F(BKE_armature_find_selected_bones_test, some_bones_selected)
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)
ccl_device_inline int abs(int x)