Fix #32198: UV unwrap of half a UV sphere would not give a perfect sphere as a
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Fri, 24 Aug 2012 13:29:48 +0000 (13:29 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Fri, 24 Aug 2012 13:29:48 +0000 (13:29 +0000)
result. This wasn't really guaranteed anyway, because of numerical precision and
possible asymmetry in the triangulation, but we can do a bit better.

Now we bias the choice of how to split a quad into two triangles slightly
towards one of two possibilities, so that in case they are equal, floating point
errors do not decide the direction and symmetry is preserved.

source/blender/editors/uvedit/uvedit_parametrizer.c

index 2161d4989db23257051e75eb13cd696768c92833..72c38be5398e1bec293191773919b42e3761967c 100644 (file)
@@ -1135,7 +1135,11 @@ static PFace *p_face_add_fill(PChart *chart, PVert *v1, PVert *v2, PVert *v3)
 
 static PBool p_quad_split_direction(PHandle *handle, float **co, PHashKey *vkeys)
 {
-       float fac = len_v3v3(co[0], co[2]) - len_v3v3(co[1], co[3]);
+       /* slight bias to prefer one edge over the other in case they are equal, so
+        * that in symmetric models we choose the same split direction instead of
+        * depending on floating point errors to decide */
+       float bias = 1.0f + 1e-6f;
+       float fac = len_v3v3(co[0], co[2])*bias - len_v3v3(co[1], co[3]);
        PBool dir = (fac <= 0.0f);
 
        /* the face exists check is there because of a special case: when