Merge branch 'master' into blender2.8
authorCampbell Barton <ideasman42@gmail.com>
Tue, 19 Dec 2017 03:15:19 +0000 (14:15 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 19 Dec 2017 03:15:19 +0000 (14:15 +1100)
release/datafiles/locale
release/scripts/addons
release/scripts/addons_contrib
source/blender/blenlib/BLI_math_rotation.h
source/blender/blenlib/intern/math_rotation.c
source/blender/bmesh/tools/bmesh_bevel.c
source/blender/editors/space_view3d/view3d_view.c
source/tools

index b3d9c97f487bff8b2423c903c14204ba5ca21a83..47700dfc9835ef7154bbd34b8725c8abf2f290df 160000 (submodule)
@@ -1 +1 @@
-Subproject commit b3d9c97f487bff8b2423c903c14204ba5ca21a83
+Subproject commit 47700dfc9835ef7154bbd34b8725c8abf2f290df
index 371960484a38fc64e0a2635170a41a0d8ab2f6bd..6cdbffbc229bf263fa4b9b82a6e33b591c32934c 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 371960484a38fc64e0a2635170a41a0d8ab2f6bd
+Subproject commit 6cdbffbc229bf263fa4b9b82a6e33b591c32934c
index a8515cfdfe9a98127b592f36fcbe51b7e23b969a..e88b7dfc3bd68888be2d05437cf50e93e41ef47b 160000 (submodule)
@@ -1 +1 @@
-Subproject commit a8515cfdfe9a98127b592f36fcbe51b7e23b969a
+Subproject commit e88b7dfc3bd68888be2d05437cf50e93e41ef47b
index e059327a490b60157ac64fd0905f88232e55f61a..1f206e5e2342bd6b98115873cce60e5a22e5c5d9 100644 (file)
@@ -97,6 +97,11 @@ float angle_normalized_qtqt(const float q1[4], const float q2[4]);
 float angle_qt(const float q[4]);
 float angle_qtqt(const float q1[4], const float q2[4]);
 
+float angle_signed_normalized_qt(const float q[4]);
+float angle_signed_normalized_qtqt(const float q1[4], const float q2[4]);
+float angle_signed_qt(const float q[4]);
+float angle_signed_qtqt(const float q1[4], const float q2[4]);
+
 /* TODO: don't what this is, but it's not the same as mat3_to_quat */
 void mat3_to_quat_is_ok(float q[4], float mat[3][3]);
 
index 23bd5e60e22316cbc1c4f135f4d1a8a9f191293c..29e7cf32ddcf029ec300ecea664b7c5a415c3d5f 100644 (file)
@@ -511,6 +511,14 @@ void rotation_between_quats_to_quat(float q[4], const float q1[4], const float q
 }
 
 
+/* -------------------------------------------------------------------- */
+/** \name Quaternion Angle
+ *
+ * Unlike the angle between vectors, this does NOT return the shortest angle.
+ * See signed functions below for this.
+ *
+ * \{ */
+
 float angle_normalized_qt(const float q[4])
 {
        BLI_ASSERT_UNIT_QUAT(q);
@@ -548,6 +556,64 @@ float angle_qtqt(const float q1[4], const float q2[4])
        return angle_normalized_qtqt(quat1, quat2);
 }
 
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Quaternion Angle (Signed)
+ *
+ * Angles with quaternion calculation can exceed 180d,
+ * Having signed versions of these functions allows 'fabsf(angle_signed_qtqt(...))'
+ * to give us the shortest angle between quaternions.
+ * With higher precision than subtracting pi afterwards.
+ *
+ * \{ */
+
+float angle_signed_normalized_qt(const float q[4])
+{
+       BLI_ASSERT_UNIT_QUAT(q);
+       if (q[0] >= 0.0f) {
+               return 2.0f * saacos(q[0]);
+       }
+       else {
+               return -2.0f * saacos(-q[0]);
+       }
+}
+
+float angle_signed_normalized_qtqt(const float q1[4], const float q2[4])
+{
+       if (dot_qtqt(q1, q2) >= 0.0f) {
+               return angle_normalized_qtqt(q1, q2);
+       }
+       else {
+               float q2_copy[4];
+               negate_v4_v4(q2_copy, q2);
+               return -angle_normalized_qtqt(q1, q2_copy);
+       }
+}
+
+float angle_signed_qt(const float q[4])
+{
+       float tquat[4];
+
+       normalize_qt_qt(tquat, q);
+
+       return angle_signed_normalized_qt(tquat);
+}
+
+float angle_signed_qtqt(const float q1[4], const float q2[4])
+{
+       if (dot_qtqt(q1, q2) >= 0.0f) {
+               return angle_qtqt(q1, q2);
+       }
+       else {
+               float q2_copy[4];
+               negate_v4_v4(q2_copy, q2);
+               return -angle_qtqt(q1, q2_copy);
+       }
+}
+
+/** \} */
+
 void vec_to_quat(float q[4], const float vec[3], short axis, const short upflag)
 {
        const float eps = 1e-4f;
index 2c6213dacce80b8f6ce5bd84e54f6ffa23a6d5b2..d00d0d508c7018148007343eb3c45f3d6988c88a 100644 (file)
@@ -718,14 +718,18 @@ static void slide_dist(EdgeHalf *e, BMVert *v, float d, float slideco[3])
 /* Is co not on the edge e? if not, return the closer end of e in ret_closer_v */
 static bool is_outside_edge(EdgeHalf *e, const float co[3], BMVert **ret_closer_v)
 {
-       float d_squared;
-
-       d_squared = dist_squared_to_line_segment_v3(co, e->e->v1->co, e->e->v2->co);
-       if (d_squared > BEVEL_EPSILON_BIG * BEVEL_EPSILON_BIG) {
-               if (len_squared_v3v3(co, e->e->v1->co) > len_squared_v3v3(co, e->e->v2->co))
-                       *ret_closer_v = e->e->v2;
-               else
-                       *ret_closer_v = e->e->v1;
+       float h[3], u[3], lambda, lenu, *l1 = e->e->v1->co;
+
+       sub_v3_v3v3(u, e->e->v2->co, l1);
+       sub_v3_v3v3(h, co, l1);
+       lenu = normalize_v3(u);
+       lambda = dot_v3v3(u, h);
+       if (lambda <= -BEVEL_EPSILON_BIG * lenu) {
+               *ret_closer_v = e->e->v1;
+               return true;
+       }
+       else if (lambda >= (1.0f + BEVEL_EPSILON_BIG) * lenu) {
+               *ret_closer_v = e->e->v2;
                return true;
        }
        else {
index 882f0ec0bc030b57bc8524b26594c6899d8e5686..880707f3b4bebabcf510109fd689dd90b34cb398 100644 (file)
@@ -273,7 +273,7 @@ void ED_view3d_smooth_view_ex(
                         * this means small rotations wont lag */
                        if (sview->quat && !sview->ofs && !sview->dist) {
                                /* scale the time allowed by the rotation */
-                               sms.time_allowed *= (double)angle_normalized_qtqt(sms.dst.quat, sms.src.quat) / M_PI; /* 180deg == 1.0 */
+                               sms.time_allowed *= (double)fabsf(angle_signed_normalized_qtqt(sms.dst.quat, sms.src.quat)) / M_PI; /* 180deg == 1.0 */
                        }
 
                        /* ensure it shows correct */
@@ -1069,7 +1069,7 @@ char ED_view3d_quat_to_axis_view(const float quat[4], const float epsilon)
        char view;
 
        for (view = RV3D_VIEW_FRONT; view <= RV3D_VIEW_BOTTOM; view++) {
-               if (angle_qtqt(quat, view3d_quat_axis[view - RV3D_VIEW_FRONT]) < epsilon) {
+               if (fabsf(angle_signed_qtqt(quat, view3d_quat_axis[view - RV3D_VIEW_FRONT])) < epsilon) {
                        return view;
                }
        }
index 9ea62ef860cde8eb313b74cd1b23ca5a0734eefe..ccf20e08702ee6424edbda01544bb9f8bc386de4 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 9ea62ef860cde8eb313b74cd1b23ca5a0734eefe
+Subproject commit ccf20e08702ee6424edbda01544bb9f8bc386de4