Merge branch 'master' into blender2.8
[blender.git] / source / blender / editors / transform / transform_orientations.c
index 63cd5291193b1e4883febef0ddb0a2a1df88ec4e..f8b11a0bcae4ec83705144f1dbb2a6c7c894e2cf 100644 (file)
@@ -735,10 +735,19 @@ int getTransformOrientation_ex(const bContext *C, float normal[3], float plane[3
                                                        SWAP(BMVert *, v_pair[0], v_pair[1]);
                                                }
 
-                                               add_v3_v3v3(normal, v_pair[0]->no, v_pair[1]->no);
-                                               sub_v3_v3v3(plane, v_pair[0]->co, v_pair[1]->co);
-                                               /* flip the plane normal so we point outwards */
-                                               negate_v3(plane);
+                                               add_v3_v3v3(normal, v_pair[1]->no, v_pair[0]->no);
+                                               sub_v3_v3v3(plane, v_pair[1]->co, v_pair[0]->co);
+
+                                               if (normalize_v3(plane) != 0.0f) {
+                                                       /* For edges it'd important the resulting matrix can rotate around the edge,
+                                                        * project onto the plane so we can use a fallback value. */
+                                                       project_plane_normalized_v3_v3v3(normal, normal, plane);
+                                                       if (UNLIKELY(normalize_v3(normal) == 0.0f)) {
+                                                               /* in the case the normal and plane are aligned,
+                                                                * use a fallback normal which is orthogonal to the plane. */
+                                                               ortho_v3_v3(normal, plane);
+                                                       }
+                                               }
                                        }
 
                                        result = ORIENTATION_EDGE;