/* axis vector suffers from precision errors, use this function to ensure */ static void quat__axis_angle_sanitize(float axis[3], float *angle) { if (axis) { if (is_zero_v3(axis) || !finite(axis[0]) || !finite(axis[1]) || !finite(axis[2])) { axis[0] = 1.0f; axis[1] = 0.0f; axis[2] = 0.0f; } else if (EXPP_FloatsAreEqual(axis[0], 0.0f, 10) && EXPP_FloatsAreEqual(axis[1], 0.0f, 10) && EXPP_FloatsAreEqual(axis[2], 0.0f, 10)) { axis[0] = 1.0f; } } if (angle) { if (!finite(*angle)) { *angle = 0.0f; } } }
/*---------------------- EXPP_VectorsAreEqual ------------------------- * Builds on EXPP_FloatsAreEqual to test vectors */ int EXPP_VectorsAreEqual(const float *vecA, const float *vecB, int size, int floatSteps) { int x; for (x = 0; x < size; x++) { if (EXPP_FloatsAreEqual(vecA[x], vecB[x], floatSteps) == 0) return 0; } return 1; }