Fix T57045: Unhandled degenerate case in bevel code
authorJacques Lucke <mail@jlucke.com>
Thu, 20 Dec 2018 09:58:50 +0000 (10:58 +0100)
committerJacques Lucke <mail@jlucke.com>
Thu, 20 Dec 2018 09:58:50 +0000 (10:58 +0100)
Reviewers: howardt

Differential Revision: https://developer.blender.org/D4104

source/blender/bmesh/tools/bmesh_bevel.c

index 8499db2..f0c2a34 100644 (file)
@@ -1261,31 +1261,36 @@ static bool make_unit_square_map(
 
        sub_v3_v3v3(va_vmid, vmid, va);
        sub_v3_v3v3(vb_vmid, vmid, vb);
-       if (fabsf(angle_v3v3(va_vmid, vb_vmid) - (float)M_PI) > BEVEL_EPSILON_ANG) {
-               sub_v3_v3v3(vo, va, vb_vmid);
-               cross_v3_v3v3(vddir, vb_vmid, va_vmid);
-               normalize_v3(vddir);
-               add_v3_v3v3(vd, vo, vddir);
-
-               /* The cols of m are: {vmid - va, vmid - vb, vmid + vd - va -vb, va + vb - vmid;
-                * blender transform matrices are stored such that m[i][*] is ith column;
-                * the last elements of each col remain as they are in unity matrix */
-               sub_v3_v3v3(&r_mat[0][0], vmid, va);
-               r_mat[0][3] = 0.0f;
-               sub_v3_v3v3(&r_mat[1][0], vmid, vb);
-               r_mat[1][3] = 0.0f;
-               add_v3_v3v3(&r_mat[2][0], vmid, vd);
-               sub_v3_v3(&r_mat[2][0], va);
-               sub_v3_v3(&r_mat[2][0], vb);
-               r_mat[2][3] = 0.0f;
-               add_v3_v3v3(&r_mat[3][0], va, vb);
-               sub_v3_v3(&r_mat[3][0], vmid);
-               r_mat[3][3] = 1.0f;
 
-               return true;
+       if (is_zero_v3(va_vmid) || is_zero_v3(vb_vmid)) {
+               return false;
        }
-       else
+
+       if (fabsf(angle_v3v3(va_vmid, vb_vmid) - (float)M_PI) <= BEVEL_EPSILON_ANG) {
                return false;
+       }
+
+       sub_v3_v3v3(vo, va, vb_vmid);
+       cross_v3_v3v3(vddir, vb_vmid, va_vmid);
+       normalize_v3(vddir);
+       add_v3_v3v3(vd, vo, vddir);
+
+       /* The cols of m are: {vmid - va, vmid - vb, vmid + vd - va -vb, va + vb - vmid;
+               * blender transform matrices are stored such that m[i][*] is ith column;
+               * the last elements of each col remain as they are in unity matrix */
+       sub_v3_v3v3(&r_mat[0][0], vmid, va);
+       r_mat[0][3] = 0.0f;
+       sub_v3_v3v3(&r_mat[1][0], vmid, vb);
+       r_mat[1][3] = 0.0f;
+       add_v3_v3v3(&r_mat[2][0], vmid, vd);
+       sub_v3_v3(&r_mat[2][0], va);
+       sub_v3_v3(&r_mat[2][0], vb);
+       r_mat[2][3] = 0.0f;
+       add_v3_v3v3(&r_mat[3][0], va, vb);
+       sub_v3_v3(&r_mat[3][0], vmid);
+       r_mat[3][3] = 1.0f;
+
+       return true;
 }
 
 /* Like make_unit_square_map, but this one makes a matrix that transforms the