From 06d4fad31326b54cff9b90762179f2bf0dd067cc Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 25 Sep 2018 13:31:29 +1000 Subject: BMesh: option to flip normals for extrude/spin --- source/blender/editors/mesh/editmesh_extrude.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'source/blender/editors/mesh/editmesh_extrude.c') diff --git a/source/blender/editors/mesh/editmesh_extrude.c b/source/blender/editors/mesh/editmesh_extrude.c index 7ea89c56432..e381cfdbdea 100644 --- a/source/blender/editors/mesh/editmesh_extrude.c +++ b/source/blender/editors/mesh/editmesh_extrude.c @@ -161,15 +161,15 @@ static bool edbm_extrude_discrete_faces(BMEditMesh *em, wmOperator *op, const ch } /* extrudes individual edges */ -static bool edbm_extrude_edges_indiv(BMEditMesh *em, wmOperator *op, const char hflag) +static bool edbm_extrude_edges_indiv(BMEditMesh *em, wmOperator *op, const char hflag, const bool use_normal_flip) { BMesh *bm = em->bm; BMOperator bmop; EDBM_op_init( em, &bmop, op, - "extrude_edge_only edges=%he use_select_history=%b", - hflag, true); + "extrude_edge_only edges=%he use_normal_flip=%b use_select_history=%b", + hflag, use_normal_flip, true); /* deselect original verts */ BM_SELECT_HISTORY_BACKUP(bm); @@ -236,6 +236,7 @@ static char edbm_extrude_htype_from_em_select(BMEditMesh *em) static bool edbm_extrude_ex( Object *obedit, BMEditMesh *em, char htype, const char hflag, + const bool use_normal_flip, const bool use_mirror, const bool use_select_history) { @@ -250,6 +251,7 @@ static bool edbm_extrude_ex( } BMO_op_init(bm, &extop, BMO_FLAG_DEFAULTS, "extrude_face_region"); + BMO_slot_bool_set(extop.slots_in, "use_normal_flip", use_normal_flip); BMO_slot_bool_set(extop.slots_in, "use_select_history", use_select_history); BMO_slot_buffer_from_enabled_hflag(bm, &extop, extop.slots_in, "geom", htype, hflag); @@ -302,7 +304,7 @@ static int edbm_extrude_repeat_exec(bContext *C, wmOperator *op) mul_m3_v3(tmat, dvec); for (a = 0; a < steps; a++) { - edbm_extrude_ex(obedit, em, BM_ALL_NOLOOP, BM_ELEM_SELECT, false, false); + edbm_extrude_ex(obedit, em, BM_ALL_NOLOOP, BM_ELEM_SELECT, false, false, false); BMO_op_callf( em->bm, BMO_FLAG_DEFAULTS, @@ -345,9 +347,10 @@ void MESH_OT_extrude_repeat(wmOperatorType *ot) /* generic extern called extruder */ static bool edbm_extrude_mesh(Object *obedit, BMEditMesh *em, wmOperator *op) { - bool changed = false; + const bool use_normal_flip = RNA_boolean_get(op->ptr, "use_normal_flip"); const char htype = edbm_extrude_htype_from_em_select(em); enum {NONE = 0, ELEM_FLAG, VERT_ONLY, EDGE_ONLY} nr; + bool changed = false; if (em->selectmode & SCE_SELECT_VERTEX) { if (em->bm->totvertsel == 0) nr = NONE; @@ -369,13 +372,13 @@ static bool edbm_extrude_mesh(Object *obedit, BMEditMesh *em, wmOperator *op) case NONE: return false; case ELEM_FLAG: - changed = edbm_extrude_ex(obedit, em, htype, BM_ELEM_SELECT, true, true); + changed = edbm_extrude_ex(obedit, em, htype, BM_ELEM_SELECT, use_normal_flip, true, true); break; case VERT_ONLY: changed = edbm_extrude_verts_indiv(em, op, BM_ELEM_SELECT); break; case EDGE_ONLY: - changed = edbm_extrude_edges_indiv(em, op, BM_ELEM_SELECT); + changed = edbm_extrude_edges_indiv(em, op, BM_ELEM_SELECT, use_normal_flip); break; } @@ -421,6 +424,7 @@ void MESH_OT_extrude_region(wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + RNA_def_boolean(ot->srna, "use_normal_flip", false, "Flip Normals", ""); Transform_Properties(ot, P_NO_DEFAULTS | P_MIRROR_DUMMY); } @@ -471,7 +475,7 @@ static int edbm_extrude_edges_exec(bContext *C, wmOperator *op) Object *obedit = CTX_data_edit_object(C); BMEditMesh *em = BKE_editmesh_from_object(obedit); - edbm_extrude_edges_indiv(em, op, BM_ELEM_SELECT); + edbm_extrude_edges_indiv(em, op, BM_ELEM_SELECT, false); EDBM_update_generic(em, true, true); @@ -493,6 +497,7 @@ void MESH_OT_extrude_edges_indiv(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; /* to give to transform */ + RNA_def_boolean(ot->srna, "use_normal_flip", false, "Flip Normals", ""); Transform_Properties(ot, P_NO_DEFAULTS | P_MIRROR_DUMMY); } @@ -664,7 +669,7 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, const w EDBM_project_snap_verts(C, vc.ar, vc.em); } - edbm_extrude_ex(vc.obedit, vc.em, extrude_htype, BM_ELEM_SELECT, true, true); + edbm_extrude_ex(vc.obedit, vc.em, extrude_htype, BM_ELEM_SELECT, false, true, true); EDBM_op_callf(vc.em, op, "rotate verts=%hv cent=%v matrix=%m3", BM_ELEM_SELECT, center, mat); EDBM_op_callf(vc.em, op, "translate verts=%hv vec=%v", -- cgit v1.2.3 From 0083c69624d2ae3df511c2ed9ae9baced75394af Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 25 Sep 2018 13:44:25 +1000 Subject: Missing from last commit --- source/blender/editors/mesh/editmesh_extrude.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source/blender/editors/mesh/editmesh_extrude.c') diff --git a/source/blender/editors/mesh/editmesh_extrude.c b/source/blender/editors/mesh/editmesh_extrude.c index e381cfdbdea..1e5e279ef35 100644 --- a/source/blender/editors/mesh/editmesh_extrude.c +++ b/source/blender/editors/mesh/editmesh_extrude.c @@ -474,8 +474,9 @@ static int edbm_extrude_edges_exec(bContext *C, wmOperator *op) { Object *obedit = CTX_data_edit_object(C); BMEditMesh *em = BKE_editmesh_from_object(obedit); + const bool use_normal_flip = RNA_boolean_get(op->ptr, "use_normal_flip"); - edbm_extrude_edges_indiv(em, op, BM_ELEM_SELECT, false); + edbm_extrude_edges_indiv(em, op, BM_ELEM_SELECT, use_normal_flip); EDBM_update_generic(em, true, true); -- cgit v1.2.3