Add 'cut-through' option for Knife Project operator.
authorHoward Trickey <howard.trickey@gmail.com>
Fri, 1 Nov 2013 11:42:11 +0000 (11:42 +0000)
committerHoward Trickey <howard.trickey@gmail.com>
Fri, 1 Nov 2013 11:42:11 +0000 (11:42 +0000)
If enabled, it makes knife project act as the
cut-through (Shift-K) version of knife.
This option will soon be more useful when a better
cut-though Knife change is submitted, allowing
this to work for cuts within faces in addition
to cuts across them.

source/blender/editors/mesh/editmesh_knife.c
source/blender/editors/mesh/editmesh_knife_project.c
source/blender/editors/mesh/mesh_intern.h

index 306aedaa9ece53f4ec53bf608f660e342cb030c2..adb03ab837bfe3fbeafe6fd8262cecf1271fd215 100644 (file)
@@ -3539,7 +3539,7 @@ static bool edbm_mesh_knife_face_isect(ARegion *ar, LinkNode *polys, BMFace *f,
 /**
  * \param use_tag  When set, tag all faces inside the polylines.
  */
-void EDBM_mesh_knife(bContext *C, LinkNode *polys, bool use_tag)
+void EDBM_mesh_knife(bContext *C, LinkNode *polys, bool use_tag, bool cut_through)
 {
        KnifeTool_OpData *kcd;
 
@@ -3548,7 +3548,6 @@ void EDBM_mesh_knife(bContext *C, LinkNode *polys, bool use_tag)
        /* init */
        {
                const bool only_select = false;
-               const bool cut_through = false;
                const bool is_interactive = false;  /* can enable for testing */
 
                kcd = MEM_callocN(sizeof(KnifeTool_OpData), __func__);
index f473939d0aa5a3e97f3356e7692f811ee8fc1fd8..57a85f1162d7b369205a378bf4a2fd9bb90492d0 100644 (file)
@@ -42,6 +42,9 @@
 #include "BKE_editmesh.h"
 #include "BKE_report.h"
 
+#include "RNA_define.h"
+#include "RNA_access.h"
+
 #include "MEM_guardedalloc.h"
 
 #include "WM_types.h"
@@ -117,6 +120,7 @@ static int knifeproject_exec(bContext *C, wmOperator *op)
        Scene *scene = CTX_data_scene(C);
        Object *obedit = CTX_data_edit_object(C);
        BMEditMesh *em = BKE_editmesh_from_object(obedit);
+       const bool cut_through = RNA_boolean_get(op->ptr, "cut_through");
 
        LinkNode *polys = NULL;
 
@@ -129,7 +133,7 @@ static int knifeproject_exec(bContext *C, wmOperator *op)
        CTX_DATA_END;
 
        if (polys) {
-               EDBM_mesh_knife(C, polys, true);
+               EDBM_mesh_knife(C, polys, true, cut_through);
 
                /* select only tagged faces */
                BM_mesh_elem_hflag_disable_all(em->bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_SELECT, false);
@@ -166,4 +170,7 @@ void MESH_OT_knife_project(wmOperatorType *ot)
 
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING;
+
+       /* parameters */
+       RNA_def_boolean(ot->srna, "cut_through", false, "Cut through", "Cut through all faces, not just visible ones");
 }
index ed026258e4b87c9238d3a33dc6cd3c968c5c39f1..98c145c9ce7d9565622489c1bb81478b6a30894b 100644 (file)
@@ -116,7 +116,8 @@ void MESH_OT_inset(struct wmOperatorType *ot);
 /* *** editmesh_knife.c *** */
 void MESH_OT_knife_tool(struct wmOperatorType *ot);
 void MESH_OT_knife_project(struct wmOperatorType *ot);
-void EDBM_mesh_knife(struct bContext *C, struct LinkNode *polys, bool use_tag);
+void EDBM_mesh_knife(struct bContext *C, struct LinkNode *polys,
+                     bool use_tag, bool cut_through);
 
 struct wmKeyMap *knifetool_modal_keymap(struct wmKeyConfig *keyconf);