correct problem with limited-dissolve not leaving the selection correctly (caused by BM_elem_attrs_copy no longer dealing with selection)

This commit is contained in:
Campbell Barton 2013-07-25 06:05:44 +00:00
parent ec3fce8e27
commit 3270031660
5 changed files with 24 additions and 11 deletions

@ -947,7 +947,9 @@ static BMOpDefine bmo_dissolve_limit_def = {
{"delimit", BMO_OP_SLOT_INT},
{{'\0'}},
},
{{{'\0'}}}, /* no output */
/* slots_out */
{{"region.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}},
{{'\0'}}},
bmo_dissolve_limit_exec,
BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH,
};
@ -1044,7 +1046,7 @@ static BMOpDefine bmo_subdivide_edgering_def = {
{{'\0'}},
},
{{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* output faces */
{{'\0'}}}, /* no output */
{{'\0'}}},
bmo_subdivide_edgering_exec,
BMO_OPTYPE_FLAG_UNTAN_MULTIRES | BMO_OPTYPE_FLAG_NORMALS_CALC | BMO_OPTYPE_FLAG_SELECT_FLUSH,
};
@ -1224,7 +1226,6 @@ static BMOpDefine bmo_rotate_uvs_def = {
{"use_ccw", BMO_OP_SLOT_BOOL}, /* rotate counter-clockwise if true, otherwise clockwise */
{{'\0'}},
},
/* slots_out */
{{{'\0'}}}, /* no output */
bmo_rotate_uvs_exec,
BMO_OPTYPE_FLAG_NOP,

@ -430,5 +430,8 @@ void bmo_dissolve_limit_exec(BMesh *bm, BMOperator *op)
BM_mesh_decimate_dissolve_ex(bm, angle_limit, do_dissolve_boundaries, delimit,
(BMVert **)BMO_SLOT_AS_BUFFER(vinput), vinput->len,
(BMEdge **)BMO_SLOT_AS_BUFFER(einput), einput->len);
(BMEdge **)BMO_SLOT_AS_BUFFER(einput), einput->len,
FACE_NEW);
BMO_slot_buffer_from_enabled_flag(bm, op, op->slots_out, "region.out", BM_FACE, FACE_NEW);
}

@ -35,7 +35,8 @@ void BM_mesh_decimate_unsubdivide(BMesh *bm, const int iterations);
void BM_mesh_decimate_dissolve_ex(BMesh *bm, const float angle_limit, const bool do_dissolve_boundaries,
const BMO_Delimit delimit,
BMVert **vinput_arr, const int vinput_len,
BMEdge **einput_arr, const int einput_len);
BMEdge **einput_arr, const int einput_len,
const short oflag_out);
void BM_mesh_decimate_dissolve(BMesh *bm, const float angle_limit, const bool do_dissolve_boundaries,
const BMO_Delimit delimit);

@ -72,7 +72,8 @@ static int dissolve_elem_cmp(const void *a1, const void *a2)
void BM_mesh_decimate_dissolve_ex(BMesh *bm, const float angle_limit, const bool do_dissolve_boundaries,
const BMO_Delimit delimit,
BMVert **vinput_arr, const int vinput_len,
BMEdge **einput_arr, const int einput_len)
BMEdge **einput_arr, const int einput_len,
const short oflag_out)
{
const float angle_max = (float)M_PI / 2.0f;
DissolveElemWeight *weight_elems = MEM_mallocN(max_ii(einput_len, vinput_len) *
@ -155,6 +156,9 @@ void BM_mesh_decimate_dissolve_ex(BMesh *bm, const float angle_limit, const bool
/* there may be some errors, we don't mind, just move on */
if (f_new) {
BM_face_normal_update(f_new);
if (oflag_out) {
BMO_elem_flag_enable(bm, f_new, oflag_out);
}
}
else {
BMO_error_clear(bm);
@ -269,7 +273,8 @@ void BM_mesh_decimate_dissolve(BMesh *bm, const float angle_limit, const bool do
BM_mesh_decimate_dissolve_ex(bm, angle_limit, do_dissolve_boundaries,
delimit,
vinput_arr, vinput_len,
einput_arr, einput_len);
einput_arr, einput_len,
0);
MEM_freeN(vinput_arr);
MEM_freeN(einput_arr);

@ -3057,6 +3057,7 @@ static int edbm_dissolve_limited_exec(bContext *C, wmOperator *op)
Object *obedit = CTX_data_edit_object(C);
BMEditMesh *em = BKE_editmesh_from_object(obedit);
BMesh *bm = em->bm;
BMOperator bmop;
const float angle_limit = RNA_float_get(op->ptr, "angle_limit");
const bool use_dissolve_boundaries = RNA_boolean_get(op->ptr, "use_dissolve_boundaries");
const int delimit = RNA_enum_get(op->ptr, "delimit");
@ -3094,10 +3095,12 @@ static int edbm_dissolve_limited_exec(bContext *C, wmOperator *op)
dissolve_flag = BM_ELEM_SELECT;
}
if (!EDBM_op_callf(em, op,
EDBM_op_init(em, &bmop, op,
"dissolve_limit edges=%he verts=%hv angle_limit=%f use_dissolve_boundaries=%b delimit=%i",
dissolve_flag, dissolve_flag, angle_limit, use_dissolve_boundaries, delimit))
{
dissolve_flag, dissolve_flag, angle_limit, use_dissolve_boundaries, delimit);
BMO_op_exec(em->bm, &bmop);
BMO_slot_buffer_hflag_enable(em->bm, bmop.slots_out, "region.out", BM_FACE, BM_ELEM_SELECT, true);
if (!EDBM_op_finish(em, &bmop, op, true)) {
return OPERATOR_CANCELLED;
}