[Bf-blender-cvs] [7d43550c720] soc-2021-knife-tools: Fix: Local angle snapping with cuts started from edge or vertex

Cian Jinks noreply at git.blender.org
Wed Aug 11 17:53:01 CEST 2021


Commit: 7d43550c720f767a2c90af344161b85c330f1f74
Author: Cian Jinks
Date:   Wed Aug 11 16:51:13 2021 +0100
Branches: soc-2021-knife-tools
https://developer.blender.org/rB7d43550c720f767a2c90af344161b85c330f1f74

Fix: Local angle snapping with cuts started from edge or vertex

Cuts that were started on an edge or vertex were not be able to use local angle snapping even though they should have been.

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

M	source/blender/editors/mesh/editmesh_knife.c

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

diff --git a/source/blender/editors/mesh/editmesh_knife.c b/source/blender/editors/mesh/editmesh_knife.c
index a71e12c7244..4124c58704c 100644
--- a/source/blender/editors/mesh/editmesh_knife.c
+++ b/source/blender/editors/mesh/editmesh_knife.c
@@ -3585,14 +3585,11 @@ static float snap_v3_angle_plane(
 /* Snap to required angle along the plane of the face nearest to kcd->prev. */
 static bool knife_snap_angle_local(KnifeTool_OpData *kcd)
 {
-  /* Calculate a reference vector using previous cut segment. If none exists then exit. */
+  Ref *ref;
+  KnifeEdge *kfe;
+  KnifeVert *kfv;
+  BMFace *f;
   float refv[3];
-  if (kcd->mdata.is_stored && !kcd->prev.is_space) {
-    sub_v3_v3v3(refv, kcd->mdata.cage, kcd->prev.cage);
-  }
-  else {
-    return false;
-  }
 
   /* Ray for kcd->curr. */
   float curr_origin[3];
@@ -3615,12 +3612,36 @@ static bool knife_snap_angle_local(KnifeTool_OpData *kcd)
     return false;
   }
 
+  /* Calculate a reference vector using previous cut segment, edge or vertex.
+   * If none exists then exit. */
+  if (kcd->mdata.is_stored) {
+    sub_v3_v3v3(refv, kcd->mdata.cage, kcd->prev.cage);
+  }
+  else if (kcd->prev.vert && kcd->prev.vert->v) {
+    for (ref = kcd->prev.vert->edges.first; ref; ref = ref->next) {
+      kfe = ((KnifeEdge *)(ref->ref));
+      if (kfe->e) {
+        if (BM_edge_in_face(kfe->e, fcurr)) {
+          kfv = equals_v3v3(kfe->v1->cageco, kcd->prev.cage) ? kfe->v2 : kfe->v1;
+          sub_v3_v3v3(refv, kfv->cageco, kcd->prev.cage);
+        }
+      }
+    }
+  }
+  else if (kcd->prev.edge) {
+    kfv = equals_v3v3(kcd->prev.edge->v1->cageco, kcd->prev.cage) ? kcd->prev.edge->v2 :
+                                                                    kcd->prev.edge->v1;
+    sub_v3_v3v3(refv, kfv->cageco, kcd->prev.cage);
+  }
+  else {
+    return false;
+  }
+
   /* Choose best face for plane. */
-  Ref *ref;
   BMFace *fprev = NULL;
   if (kcd->prev.vert && kcd->prev.vert->v) {
     for (ref = kcd->prev.vert->faces.first; ref; ref = ref->next) {
-      BMFace *f = ((BMFace *)(ref->ref));
+      f = ((BMFace *)(ref->ref));
       if (f == fcurr) {
         fprev = f;
       }
@@ -3628,7 +3649,7 @@ static bool knife_snap_angle_local(KnifeTool_OpData *kcd)
   }
   else if (kcd->prev.edge) {
     for (ref = kcd->prev.edge->faces.first; ref; ref = ref->next) {
-      BMFace *f = ((BMFace *)(ref->ref));
+      f = ((BMFace *)(ref->ref));
       if (f == fcurr) {
         fprev = f;
       }



More information about the Bf-blender-cvs mailing list