fix error in single vertex ripping where the edit-selection could be left on unselected verts or not set on the newly ripped vertex.
also some corrections to comments.
This commit is contained in:
parent
1d6a5a4aa4
commit
830013aabe
@ -134,7 +134,7 @@ static float edbm_rip_edge_side_measure(BMEdge *e,
|
|||||||
* connected edge loops.
|
* connected edge loops.
|
||||||
* The reason for using loops like this is because when the edges are split we don't which face user gets the newly
|
* The reason for using loops like this is because when the edges are split we don't which face user gets the newly
|
||||||
* created edge (its as good as random so we cant assume new edges will be on once side).
|
* created edge (its as good as random so we cant assume new edges will be on once side).
|
||||||
* After splitting walking along boundary loops is very simple and each has only edges from one side of another.
|
* After splittingm, its very simple to walk along boundary loops since each only has one edge from a single side.
|
||||||
* - The end loop pairs are stored in an array however to support multiple edge-selection-islands, so you can rip
|
* - The end loop pairs are stored in an array however to support multiple edge-selection-islands, so you can rip
|
||||||
* multiple selections at once.
|
* multiple selections at once.
|
||||||
* - * Execute the split *
|
* - * Execute the split *
|
||||||
@ -142,8 +142,7 @@ static float edbm_rip_edge_side_measure(BMEdge *e,
|
|||||||
* - Deselect the edge loop facing away.
|
* - Deselect the edge loop facing away.
|
||||||
*
|
*
|
||||||
* Limitation!
|
* Limitation!
|
||||||
* This currently works very poorly for edge selections that include junctions of 3+ split edges at one vertex.
|
* This currently works very poorly with intersecting edge islands (verts with more then 2 tagged edges)
|
||||||
* It this wont work with intersecting edge islands (verts with more then 2 tagged edges)
|
|
||||||
* This is nice to but for now not essential.
|
* This is nice to but for now not essential.
|
||||||
*
|
*
|
||||||
* - campbell.
|
* - campbell.
|
||||||
@ -196,14 +195,14 @@ static EdgeLoopPair *edbm_ripsel_looptag_helper(BMesh *bm)
|
|||||||
BLI_array_declare(eloop_pairs);
|
BLI_array_declare(eloop_pairs);
|
||||||
EdgeLoopPair *lp;
|
EdgeLoopPair *lp;
|
||||||
|
|
||||||
/* untag all loops */
|
/* initialize loops with dummy invalid index values */
|
||||||
BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
|
BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
|
||||||
BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
|
BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
|
||||||
BM_elem_index_set(l, INVALID_UID);
|
BM_elem_index_set(l, INVALID_UID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* build contiguous array */
|
/* set contiguous loops ordered 'uid' values for walking after split */
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
int tot = 0;
|
int tot = 0;
|
||||||
BMIter eiter;
|
BMIter eiter;
|
||||||
@ -227,7 +226,7 @@ static EdgeLoopPair *edbm_ripsel_looptag_helper(BMesh *bm)
|
|||||||
|
|
||||||
e_first = e;
|
e_first = e;
|
||||||
|
|
||||||
/* initialize, avoid loop on loop */
|
/* initialize */
|
||||||
v_step = e_first->v1;
|
v_step = e_first->v1;
|
||||||
|
|
||||||
uid_start = uid;
|
uid_start = uid;
|
||||||
@ -238,12 +237,14 @@ static EdgeLoopPair *edbm_ripsel_looptag_helper(BMesh *bm)
|
|||||||
tot++;
|
tot++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* always store the highest 'uid' edge */
|
/* this edges loops have the highest uid's, store this to walk down later */
|
||||||
e_last = e_step;
|
e_last = e_step;
|
||||||
|
|
||||||
|
/* always store the highest 'uid' edge for the stride */
|
||||||
uid_end = uid - 1;
|
uid_end = uid - 1;
|
||||||
uid = uid_start - 1;
|
uid = uid_start - 1;
|
||||||
|
|
||||||
|
/* initialize */
|
||||||
v_step = e_first->v1;
|
v_step = e_first->v1;
|
||||||
|
|
||||||
while ((e = edbm_ripsel_edge_mark_step(bm, v_step, uid))) {
|
while ((e = edbm_ripsel_edge_mark_step(bm, v_step, uid))) {
|
||||||
@ -390,6 +391,8 @@ static int edbm_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|||||||
v = (BMVert *)ese.ele;
|
v = (BMVert *)ese.ele;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
ese.ele = NULL;
|
||||||
|
|
||||||
BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
|
BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
|
||||||
if (BM_elem_flag_test(v, BM_ELEM_SELECT))
|
if (BM_elem_flag_test(v, BM_ELEM_SELECT))
|
||||||
break;
|
break;
|
||||||
@ -436,6 +439,8 @@ static int edbm_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|||||||
bmesh_vert_separate(bm, v, &vout, &vout_len);
|
bmesh_vert_separate(bm, v, &vout, &vout_len);
|
||||||
|
|
||||||
if (vout_len < 2) {
|
if (vout_len < 2) {
|
||||||
|
/* set selection back to avoid active-unselected vertex */
|
||||||
|
BM_elem_select_set(bm, v, TRUE);
|
||||||
/* should never happen */
|
/* should never happen */
|
||||||
BKE_report(op->reports, RPT_ERROR, "Error ripping vertex from faces");
|
BKE_report(op->reports, RPT_ERROR, "Error ripping vertex from faces");
|
||||||
return OPERATOR_CANCELLED;
|
return OPERATOR_CANCELLED;
|
||||||
@ -443,6 +448,10 @@ static int edbm_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|||||||
else {
|
else {
|
||||||
int vi_best = 0;
|
int vi_best = 0;
|
||||||
|
|
||||||
|
if (ese.ele) {
|
||||||
|
EDBM_editselection_remove(em, &ese.ele->head);
|
||||||
|
}
|
||||||
|
|
||||||
dist = FLT_MAX;
|
dist = FLT_MAX;
|
||||||
|
|
||||||
for (i = 0; i < vout_len; i++) {
|
for (i = 0; i < vout_len; i++) {
|
||||||
@ -469,6 +478,10 @@ static int edbm_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
|||||||
v = vout[vi_best];
|
v = vout[vi_best];
|
||||||
BM_elem_select_set(bm, v, TRUE);
|
BM_elem_select_set(bm, v, TRUE);
|
||||||
|
|
||||||
|
if (ese.ele) {
|
||||||
|
EDBM_editselection_store(em, &v->head);
|
||||||
|
}
|
||||||
|
|
||||||
/* splice all others back together */
|
/* splice all others back together */
|
||||||
if (vout_len > 2) {
|
if (vout_len > 2) {
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user