Revision: 44832
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44832
Author:   howardt
Date:     2012-03-12 12:45:55 +0000 (Mon, 12 Mar 2012)
Log Message:
-----------
Code cleanup: knife gathers pos-related state into a struct. No functional 
change.

This is in preparation for bug fixing and cleanup related to tracking
of bmface and is_space state variables.  And makes it more likely
to avoid bugs in future where some part of state is copied but not all.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/mesh/knifetool.c

Modified: trunk/blender/source/blender/editors/mesh/knifetool.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/knifetool.c       2012-03-12 
12:03:52 UTC (rev 44831)
+++ trunk/blender/source/blender/editors/mesh/knifetool.c       2012-03-12 
12:45:55 UTC (rev 44832)
@@ -19,7 +19,7 @@
  * All rights reserved.
  *
  * 
- * Contributor(s): Joseph Eagar, Joshua Leung
+ * Contributor(s): Joseph Eagar, Joshua Leung, Howard Trickey
  *
  * ***** END GPL LICENSE BLOCK *****
  */
@@ -62,7 +62,6 @@
 
 /* this code here is kindof messy. . .I might need to eventually rework it - 
joeedh */
 
-#define MAXGROUP       30
 #define KMAXDIST       10      /* max mouse distance from edge before not 
detecting it */
 
 /* knifetool operator */
@@ -99,6 +98,21 @@
        BMFace *f;
 } BMEdgeHit;
 
+typedef struct KnifePosData {
+       float co[3];
+       float cage[3];
+
+       /* At most one of vert, edge, or bmface should be non-NULL,
+        * saying whether the point is snapped to a vertex, edge, or in a face.
+        * If none are set, this point is in space and is_space should be true. 
*/
+       KnifeVert *vert;
+       KnifeEdge *edge;
+       BMFace *bmface;
+       int is_space;
+
+       int mval[2];  /* mouse screen position */
+} KnifePosData;
+
 /* struct for properties used while drawing */
 typedef struct knifetool_opdata {
        ARegion *ar;            /* region that knifetool was activated in */
@@ -124,21 +138,14 @@
        float vthresh;
        float ethresh;
        
-       float vertco[3], vertcage[3];
-       float prevco[3], prevcage[3];
-       
        /* used for drag-cutting */
        BMEdgeHit *linehits;
        int totlinehit;
        
-       /* if curedge is NULL, attach to curvert;
-        * if curvert is NULL, attach to curbmface,
-        * otherwise create null vert */
-       KnifeEdge *curedge, *prevedge;
-       KnifeVert *curvert, *prevvert;
-       BMFace *curbmface, *prevbmface;
+       /* Data for mouse-position-derived data (cur) and previous click (prev) 
*/
+       KnifePosData cur, prev;
 
-       int totkedge, totkvert, cutnr;
+       int totkedge, totkvert;
        
        BLI_mempool *refs;
        
@@ -156,7 +163,6 @@
        
        int snap_midpoints, prevmode, extend;
        int ignore_edge_snapping, ignore_vert_snapping;
-       int prevmval[2];
        
        enum {
                ANGLE_FREE,
@@ -166,7 +172,6 @@
                ANGLE_135
        } angle_snapping;
 
-       int is_space, prev_is_space; /*1 if current cut location, vertco, isn't 
on the mesh */
        float (*cagecos)[3];
 } knifetool_opdata;
 
@@ -180,6 +185,16 @@
        ED_view3d_project_float_v3(kcd->ar, co, sco, kcd->projmat);
 }
 
+static void knife_pos_data_clear(KnifePosData *kpd) {
+       zero_v3(kpd->co);
+       zero_v3(kpd->cage);
+       kpd->vert = NULL;
+       kpd->edge = NULL;
+       kpd->bmface = NULL;
+       kpd->mval[0] = 0;
+       kpd->mval[1] = 0;
+}
+
 static ListBase *knife_empty_list(knifetool_opdata *kcd)
 {
        ListBase *lst;
@@ -280,33 +295,26 @@
        return kfe;
 }
 
+/* User has just clicked for first time or first time after a restart (E key).
+ * Copy the current position data into prev. */
 static void knife_start_cut(knifetool_opdata *kcd)
 {
-       kcd->prevedge = kcd->curedge;
-       kcd->prevvert = kcd->curvert;
-       kcd->prevbmface = kcd->curbmface;
-       kcd->cutnr++;
-       kcd->prev_is_space = kcd->is_space;
-       kcd->is_space = 0;
-       kcd->prevmval[0] = kcd->vc.mval[0];
-       kcd->prevmval[1] = kcd->vc.mval[1];
+       kcd->prev = kcd->cur;
+       kcd->cur.is_space = 0; /*TODO: why do we do this? */
 
-       copy_v3_v3(kcd->prevco, kcd->vertco);
-       copy_v3_v3(kcd->prevcage, kcd->vertcage);
-
-       if (kcd->prevvert == NULL && kcd->prevedge == NULL && 
is_zero_v3(kcd->prevcage)) {
+       if (kcd->prev.vert == NULL && kcd->prev.edge == NULL && 
is_zero_v3(kcd->prev.cage)) {
                /* Make prevcage a point on the view ray to mouse closest to a 
point on model: choose vertex 0 */
                float origin[3], ray[3], co[3];
                BMVert *v0;
 
-               knife_input_ray_cast(kcd, kcd->vc.mval, origin, ray);
+               knife_input_ray_cast(kcd, kcd->cur.mval, origin, ray);
                add_v3_v3v3(co, origin, ray);
                v0 = BM_vert_at_index(kcd->em->bm, 0);
                if (v0) {
-                       closest_to_line_v3(kcd->prevcage, v0->co, co, origin);
-                       copy_v3_v3(kcd->prevco, kcd->prevcage);
-                       copy_v3_v3(kcd->vertcage, kcd->prevcage);
-                       copy_v3_v3(kcd->vertco, kcd->prevco);
+                       closest_to_line_v3(kcd->prev.cage, v0->co, co, origin);
+                       copy_v3_v3(kcd->prev.co, kcd->prev.cage); /*TODO: do we 
need this? */
+                       copy_v3_v3(kcd->cur.cage, kcd->prev.cage);
+                       copy_v3_v3(kcd->cur.co, kcd->prev.co);
                }
        }
 }
@@ -339,9 +347,9 @@
 
                if (kfe->v1->isface || kfe->v2->isface) {
                        if (kfe->v2->isface)
-                               kfe->basef = kcd->curbmface;
+                               kfe->basef = kcd->cur.bmface;
                        else 
-                               kfe->basef = kcd->prevbmface;
+                               kfe->basef = kcd->prev.bmface;
                }
                else {
                        for (r1 = kfe->v1->edges.first; r1 && !kfe->basef; r1 = 
r1->next) {
@@ -408,48 +416,50 @@
        return newkfe->v2;
 }
 
+/* Make a single KnifeEdge for cut from kcd->prev to kcd->cur.
+ * and move cur data to prev. */
 static void knife_add_single_cut(knifetool_opdata *kcd)
 {
        KnifeEdge *kfe = new_knife_edge(kcd), *kfe2 = NULL, *kfe3 = NULL;
 
-       if (kcd->prevvert && kcd->prevvert == kcd->curvert)
+       if (kcd->prev.vert && kcd->prev.vert == kcd->cur.vert)
                return;
-       if (kcd->prevedge && kcd->prevedge == kcd->curedge)
+       if (kcd->prev.edge && kcd->prev.edge == kcd->cur.edge)
                return;
 
        kfe->draw = 1;
 
-       if (kcd->prevvert) {
-               kfe->v1 = kcd->prevvert;
+       if (kcd->prev.vert) {
+               kfe->v1 = kcd->prev.vert;
        }
-       else if (kcd->prevedge) {
-               kfe->v1 = knife_split_edge(kcd, kcd->prevedge, kcd->prevco, 
&kfe2);
+       else if (kcd->prev.edge) {
+               kfe->v1 = knife_split_edge(kcd, kcd->prev.edge, kcd->prev.co, 
&kfe2);
        }
        else {
-               kfe->v1 = new_knife_vert(kcd, kcd->prevco, kcd->prevco);
-               kfe->v1->draw = kfe->draw = !kcd->prev_is_space;
-               kfe->v1->inspace = kcd->prev_is_space;
-               kfe->draw = !kcd->prev_is_space;
+               kfe->v1 = new_knife_vert(kcd, kcd->prev.co, kcd->prev.co);
+               kfe->v1->draw = kfe->draw = !kcd->prev.is_space;
+               kfe->v1->inspace = kcd->prev.is_space;
+               kfe->draw = !kcd->prev.is_space;
                kfe->v1->isface = 1;
        }
 
-       if (kcd->curvert) {
-               kfe->v2 = kcd->curvert;
+       if (kcd->cur.vert) {
+               kfe->v2 = kcd->cur.vert;
        }
-       else if (kcd->curedge) {
-               kfe->v2 = knife_split_edge(kcd, kcd->curedge, kcd->vertco, 
&kfe3);
-               kcd->curvert = kfe->v2;
+       else if (kcd->cur.edge) {
+               kfe->v2 = knife_split_edge(kcd, kcd->cur.edge, kcd->cur.co, 
&kfe3);
+               kcd->cur.vert = kfe->v2;
        }
        else {
-               kfe->v2 = new_knife_vert(kcd, kcd->vertco, kcd->vertco);
-               kfe->v2->draw = !kcd->is_space;
+               kfe->v2 = new_knife_vert(kcd, kcd->cur.co, kcd->cur.co);
+               kfe->v2->draw = !kcd->cur.is_space;
                kfe->v2->isface = 1;
-               kfe->v2->inspace = kcd->is_space;
+               kfe->v2->inspace = kcd->cur.is_space;
                
-               if (kcd->is_space)
+               if (kcd->cur.is_space)
                        kfe->draw = 0;
 
-               kcd->curvert = kfe->v2;
+               kcd->cur.vert = kfe->v2;
        }
 
        knife_find_basef(kcd, kfe);
@@ -460,27 +470,20 @@
                knife_edge_append_face(kcd, kfe, kfe->basef);
 
        /* sanity check to make sure we're in the right edge/face lists */
-       if (kcd->curbmface) {
-               if (!find_ref(&kfe->faces, kcd->curbmface)) {
-                       knife_edge_append_face(kcd, kfe, kcd->curbmface);
+       if (kcd->cur.bmface) {
+               if (!find_ref(&kfe->faces, kcd->cur.bmface)) {
+                       knife_edge_append_face(kcd, kfe, kcd->cur.bmface);
                }
 
-               if (kcd->prevbmface && kcd->prevbmface != kcd->curbmface) {
-                       if (!find_ref(&kfe->faces, kcd->prevbmface)) {
-                               knife_edge_append_face(kcd, kfe, 
kcd->prevbmface);
+               if (kcd->prev.bmface && kcd->prev.bmface != kcd->cur.bmface) {
+                       if (!find_ref(&kfe->faces, kcd->prev.bmface)) {
+                               knife_edge_append_face(kcd, kfe, 
kcd->prev.bmface);
                        }
                }
        }
 
        /* set up for next cut */
-       kcd->prevbmface = kcd->curbmface;
-       kcd->prevvert = kcd->curvert;
-       kcd->prevedge = kcd->curedge;
-       copy_v3_v3(kcd->prevco, kcd->vertco);
-       copy_v3_v3(kcd->prevcage, kcd->vertcage);
-       kcd->prev_is_space = kcd->is_space;
-       kcd->prevmval[0] = kcd->vc.mval[0];
-       kcd->prevmval[1] = kcd->vc.mval[1];
+       kcd->prev = kcd->cur;
 }
 
 static int verge_linehit(const void *vlh1, const void *vlh2)
@@ -562,26 +565,26 @@
        qsort(kcd->linehits, kcd->totlinehit, sizeof(BMEdgeHit), verge_linehit);
        splitkfe = MEM_callocN(kcd->totlinehit * sizeof(KnifeEdge *), 
"knife_cut_through");
 
-       if (kcd->prevvert) {
-               if (kcd->prevvert == kcd->curvert)
+       if (kcd->prev.vert) {
+               if (kcd->prev.vert == kcd->cur.vert)
                        return;
-               firstv = kcd->prevvert;
-               knife_get_vert_faces(kcd, firstv, kcd->prevbmface, &firstfaces);
+               firstv = kcd->prev.vert;
+               knife_get_vert_faces(kcd, firstv, kcd->prev.bmface, 
&firstfaces);
        }
-       else if (kcd->prevedge) {
-               if (kcd->prevedge == kcd->curedge)
+       else if (kcd->prev.edge) {
+               if (kcd->prev.edge == kcd->cur.edge)
                        return;
-               firstv = knife_split_edge(kcd, kcd->prevedge, kcd->prevco, 
&kfe3);
-               knife_get_edge_faces(kcd, kcd->prevedge, &firstfaces);
+               firstv = knife_split_edge(kcd, kcd->prev.edge, kcd->prev.co, 
&kfe3);
+               knife_get_edge_faces(kcd, kcd->prev.edge, &firstfaces);
        }
 
-       if (kcd->curvert) {
-               lastv = kcd->curvert;
-               knife_get_vert_faces(kcd, lastv, kcd->curbmface, &lastfaces);
+       if (kcd->cur.vert) {
+               lastv = kcd->cur.vert;
+               knife_get_vert_faces(kcd, lastv, kcd->cur.bmface, &lastfaces);
        }
-       else if (kcd->curedge) {
-               lastv = knife_split_edge(kcd, kcd->curedge, kcd->vertco, &kfe3);
-               knife_get_edge_faces(kcd, kcd->curedge, &lastfaces);
+       else if (kcd->cur.edge) {
+               lastv = knife_split_edge(kcd, kcd->cur.edge, kcd->cur.co, 
&kfe3);
+               knife_get_edge_faces(kcd, kcd->cur.edge, &lastfaces);
        }
 
        if (firstv) {
@@ -650,19 +653,15 @@
        kcd->totlinehit = 0;
 
        /* set up for next cut */
-       kcd->prevbmface = kcd->curbmface;
-       kcd->prevvert = kcd->curvert;
-       kcd->prevedge = kcd->curedge;
-       copy_v3_v3(kcd->prevco, kcd->vertco);
-       copy_v3_v3(kcd->prevcage, kcd->vertcage);
-       kcd->prev_is_space = kcd->is_space;
-       kcd->prevmval[0] = kcd->vc.mval[0];
-       kcd->prevmval[1] = kcd->vc.mval[1];
+       kcd->prev = kcd->cur;
 }
 
+/* User has just left-clicked after the first time.
+ * Add all knife cuts implied by line from prev to cur.
+ * If that line crossed edges then kcd->linehits will be non-NULL. */
 static void knife_add_cut(knifetool_opdata *kcd)
 {
-       knifetool_opdata oldkcd = *kcd;
+       KnifePosData savcur = kcd->cur;
 
        if (kcd->cut_through) {
                knife_cut_through(kcd);
@@ -687,56 +686,46 @@
                                if (firstlh->v || lastlh->v) {
                                        KnifeVert *kfv = firstlh->v ? 
firstlh->v : lastlh->v;
                                        
-                                       kcd->prevvert = kfv;
-                                       copy_v3_v3(kcd->prevco, firstlh->hit);
-                                       copy_v3_v3(kcd->prevcage, 
firstlh->cagehit);
-                                       kcd->prevedge = NULL;
-                                       kcd->prevbmface = f;
+                                       kcd->prev.vert = kfv;
+                                       copy_v3_v3(kcd->prev.co, firstlh->hit);

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to