[Bf-blender-cvs] [11509c14c38] master: Fix T75588: Missing loop cuts preview for edges without quads

Germano Cavalcante noreply at git.blender.org
Tue Aug 11 18:02:45 CEST 2020


Commit: 11509c14c38bdc818f60037921f3455ff626d61b
Author: Germano Cavalcante
Date:   Tue Aug 11 13:02:11 2020 -0300
Branches: master
https://developer.blender.org/rB11509c14c38bdc818f60037921f3455ff626d61b

Fix T75588: Missing loop cuts preview for edges without quads

The preview of points was only done when the edge is wire.

Now the preview of points is done when the edge is not connected to any
quad.

Also to avoid edge slide in this case, all new vertices created in this
specific case are not selected.

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

===================================================================

M	source/blender/bmesh/intern/bmesh_query.c
M	source/blender/bmesh/intern/bmesh_query.h
M	source/blender/editors/mesh/editmesh_loopcut.c
M	source/blender/editors/mesh/editmesh_preselect_edgering.c

===================================================================

diff --git a/source/blender/bmesh/intern/bmesh_query.c b/source/blender/bmesh/intern/bmesh_query.c
index a9d1972bd7e..61a81e56a2e 100644
--- a/source/blender/bmesh/intern/bmesh_query.c
+++ b/source/blender/bmesh/intern/bmesh_query.c
@@ -2511,6 +2511,22 @@ bool BM_face_is_any_edge_flag_test(const BMFace *f, const char hflag)
   return false;
 }
 
+bool BM_edge_is_any_face_len_test(const BMEdge *e, const int len)
+{
+  if (e->l) {
+    BMLoop *l_iter, *l_first;
+
+    l_iter = l_first = e->l;
+    do {
+      if (l_iter->f->len == len) {
+        return true;
+      }
+    } while ((l_iter = l_iter->radial_next) != l_first);
+  }
+
+  return false;
+}
+
 /**
  * Use within assert's to check normals are valid.
  */
diff --git a/source/blender/bmesh/intern/bmesh_query.h b/source/blender/bmesh/intern/bmesh_query.h
index 4ec6b0e50d1..1ff2558ce83 100644
--- a/source/blender/bmesh/intern/bmesh_query.h
+++ b/source/blender/bmesh/intern/bmesh_query.h
@@ -243,6 +243,9 @@ bool BM_face_is_any_vert_flag_test(const BMFace *f, const char hflag) ATTR_WARN_
 bool BM_face_is_any_edge_flag_test(const BMFace *f, const char hflag) ATTR_WARN_UNUSED_RESULT
     ATTR_NONNULL();
 
+bool BM_edge_is_any_face_len_test(const BMEdge *e, const int len) ATTR_WARN_UNUSED_RESULT
+    ATTR_NONNULL();
+
 bool BM_face_is_normal_valid(const BMFace *f) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
 
 double BM_mesh_calc_volume(BMesh *bm, bool is_signed) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
diff --git a/source/blender/editors/mesh/editmesh_loopcut.c b/source/blender/editors/mesh/editmesh_loopcut.c
index 2f453369d92..b57e486634f 100644
--- a/source/blender/editors/mesh/editmesh_loopcut.c
+++ b/source/blender/editors/mesh/editmesh_loopcut.c
@@ -174,8 +174,10 @@ static void ringsel_finish(bContext *C, wmOperator *op)
     if (lcd->do_cut) {
       const bool is_macro = (op->opm != NULL);
       /* a single edge (rare, but better support) */
-      const bool is_single = (BM_edge_is_wire(lcd->eed));
-      const int seltype = is_single ? SUBDIV_SELECT_INNER : SUBDIV_SELECT_LOOPCUT;
+      const bool is_edge_wire = BM_edge_is_wire(lcd->eed);
+      const bool is_single = is_edge_wire || !BM_edge_is_any_face_len_test(lcd->eed, 4);
+      const int seltype = is_edge_wire ? SUBDIV_SELECT_INNER :
+                                         is_single ? SUBDIV_SELECT_NONE : SUBDIV_SELECT_LOOPCUT;
 
       /* Enable gridfill, so that intersecting loopcut works as one would expect.
        * Note though that it will break edgeslide in this specific case.
diff --git a/source/blender/editors/mesh/editmesh_preselect_edgering.c b/source/blender/editors/mesh/editmesh_preselect_edgering.c
index 50af79fc5e1..d9bd63ef35f 100644
--- a/source/blender/editors/mesh/editmesh_preselect_edgering.c
+++ b/source/blender/editors/mesh/editmesh_preselect_edgering.c
@@ -343,12 +343,12 @@ void EDBM_preselect_edgering_update_from_edge(struct EditMesh_PreSelEdgeRing *ps
     BM_mesh_elem_index_ensure(bm, BM_VERT);
   }
 
-  if (BM_edge_is_wire(eed_start)) {
-    view3d_preselect_mesh_edgering_update_verts_from_edge(
+  if (BM_edge_is_any_face_len_test(eed_start, 4)) {
+    view3d_preselect_mesh_edgering_update_edges_from_edge(
         psel, bm, eed_start, previewlines, coords);
   }
   else {
-    view3d_preselect_mesh_edgering_update_edges_from_edge(
+    view3d_preselect_mesh_edgering_update_verts_from_edge(
         psel, bm, eed_start, previewlines, coords);
   }
 }



More information about the Bf-blender-cvs mailing list