Fix T49296, assert failure in Bevel code.
authorHoward Trickey <howard.trickey@gmail.com>
Mon, 12 Sep 2016 11:27:29 +0000 (07:27 -0400)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 14 Sep 2016 08:26:21 +0000 (10:26 +0200)
The mesh interpolation function failed to fill a fractions-of-the-way
array properly when the distances are very small but nonzero.

source/blender/bmesh/tools/bmesh_bevel.c

index 1dfb9de..45fbfdd 100644 (file)
@@ -2194,10 +2194,13 @@ static void fill_vmesh_fracs(VMesh *vm, float *frac, int i)
                total += len_v3v3(mesh_vert(vm, i, 0, k)->co, mesh_vert(vm, i, 0, k + 1)->co);
                frac[k + 1] = total;
        }
-       if (total > BEVEL_EPSILON) {
+       if (total > 0.0f) {
                for (k = 1; k <= ns; k++)
                        frac[k] /= total;
        }
+       else {
+               frac[ns] = 1.0f;
+       }
 }
 
 /* Like fill_vmesh_fracs but want fractions for profile points of bndv, with ns segments */
@@ -2215,11 +2218,14 @@ static void fill_profile_fracs(BevelParams *bp, BoundVert *bndv, float *frac, in
                frac[k + 1] = total;
                copy_v3_v3(co, nextco);
        }
-       if (total > BEVEL_EPSILON) {
+       if (total > 0.0f) {
                for (k = 1; k <= ns; k++) {
                        frac[k] /= total;
                }
        }
+       else {
+               frac[ns] = 1.0f;
+       }
 }
 
 /* Return i such that frac[i] <= f <= frac[i + 1], where frac[n] == 1.0