[Bf-blender-cvs] [d4eb10e] gsoc2016-improved_extrusion: Curves: Fillet and chamfer operator

João Araújo noreply at git.blender.org
Wed Dec 14 22:50:38 CET 2016


Commit: d4eb10ecc6efa516df91c3346fb145db5322774b
Author: João Araújo
Date:   Wed Oct 5 14:05:51 2016 +0100
Branches: gsoc2016-improved_extrusion
https://developer.blender.org/rBd4eb10ecc6efa516df91c3346fb145db5322774b

Curves: Fillet and chamfer operator

Refactored the fillet and chamfer operators. Fixed user interaction for MOUSEMOVE event for fillet operator. Numinput still needs to be checked.

===================================================================

M	source/blender/editors/curve/editcurve.c

===================================================================

diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 6757a89..3f73406 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -8259,6 +8259,59 @@ typedef struct CD {
 	BezTriple *selected_points;
 } CD;
 
+static void curve_chamfer_modal_loop(EditNurb *editnurb, Nurb *nu, CD *cd, float angle, float distance)
+{
+	BezTriple *bezt, *bezt1, *bezt2, *original, *helper;
+	int selected = 0;
+	for (int i = 0; i < nu->pntsu; i++) {
+		bezt = &nu->bezt[i];
+		if (BEZT_ISSEL_ANY(bezt) && bezt->h1 == 2 && bezt->h2 == 2) {
+			selected += 1;
+			original = &cd->selected_points[selected - 1];
+			bezt1 = MEM_callocN(sizeof(BezTriple), "curve_chamfer_modal1");
+			bezt2 = MEM_callocN(sizeof(BezTriple), "curve_chamfer_modal2");
+			chamfer_handle(original, bezt1, bezt2, angle, distance);
+			BEZT_SEL_ALL(bezt1);
+
+			ED_curve_beztcpy(editnurb, bezt, bezt1, 1);
+			ED_curve_beztcpy(editnurb, &bezt[1], bezt2, 1);
+
+			MEM_freeN(bezt1);
+			MEM_freeN(bezt2);
+
+			/* set the handles for the first chamfered triple */
+			float v[3];
+			bezt1 = &nu->bezt[i];
+			helper = &nu->bezt[i - 1];
+			/* left handle */
+			sub_v3_v3v3(v, helper->vec[2], bezt1->vec[1]);
+			mul_v3_fl(v, 0.4 * len_v3(v));
+			copy_v3_v3(bezt1->vec[0], bezt1->vec[1]);
+			add_v3_v3(bezt1->vec[0], v);
+			/* right handle */
+			bezt2 = &nu->bezt[i + 1];
+			sub_v3_v3v3(v, bezt2->vec[1], bezt1->vec[1]);
+			mul_v3_fl(v, 0.4 * len_v3(v));
+			copy_v3_v3(bezt1->vec[2], bezt1->vec[1]);
+			add_v3_v3(bezt1->vec[2], v);
+
+			/* second chamfered triple */
+			helper = &nu->bezt[i + 2];
+			/* left handle */
+			sub_v3_v3v3(v, bezt1->vec[1], bezt2->vec[1]);
+			mul_v3_fl(v, 0.4 * len_v3(v));
+			copy_v3_v3(bezt2->vec[0], bezt2->vec[1]);
+			add_v3_v3(bezt2->vec[0], v);
+			/* right handle */
+			bezt2 = &nu->bezt[i + 1];
+			sub_v3_v3v3(v, helper->vec[0], bezt2->vec[1]);
+			mul_v3_fl(v, 0.4 * len_v3(v));
+			copy_v3_v3(bezt2->vec[2], bezt2->vec[1]);
+			add_v3_v3(bezt2->vec[2], v);
+		}
+	}
+}
+
 static int curve_chamfer_modal(bContext *C, wmOperator *op, const wmEvent *event)
 {
 	/* modal function for curve chamfer */
@@ -8270,7 +8323,7 @@ static int curve_chamfer_modal(bContext *C, wmOperator *op, const wmEvent *event
 	EditNurb *editnurb = cu->editnurb;
 	ListBase *nubase = object_editcurve_get(obedit);
 	Nurb *nu;
-	BezTriple *bezt, *bezt1, *bezt2, *helper, *original;
+	BezTriple *bezt, *bezt1, *bezt2, *helper;
 	CD *cd = op->customdata;
 	OffsetData *opdata = cd->data;
 	float *init_mouse = cd->data->mcenter;
@@ -8280,7 +8333,6 @@ static int curve_chamfer_modal(bContext *C, wmOperator *op, const wmEvent *event
 	float angle = RNA_float_get(op->ptr, "angle");
 	int spline_id = cd->data->spline_id;
 	nu = BLI_findlink(nubase, spline_id);
-	int selected = 0;
 
 	/* handle events */
 	const bool has_numinput = hasNumInput(&opdata->num_input[opdata->value_mode]);
@@ -8290,53 +8342,7 @@ static int curve_chamfer_modal(bContext *C, wmOperator *op, const wmEvent *event
 		/* TODO: numinput for angle (handleNumInput returns false when event->ctrl )*/
 		RNA_float_set(op->ptr, "distance", opdata->num_input->val[0]);
 		distance = RNA_float_get(op->ptr, "distance");
-		for (int i = 0; i < nu->pntsu; i++) {
-			bezt = &nu->bezt[i];
-			if (BEZT_ISSEL_ANY(bezt) && bezt->h1 == 2 && bezt->h2 == 2) {
-				selected += 1;
-				original = &cd->selected_points[selected - 1];
-				bezt1 = MEM_callocN(sizeof(BezTriple), "curve_chamfer_modal1");
-				bezt2 = MEM_callocN(sizeof(BezTriple), "curve_chamfer_modal2");
-				chamfer_handle(original, bezt1, bezt2, angle, distance);
-				BEZT_SEL_ALL(bezt1);
-
-				ED_curve_beztcpy(editnurb, bezt, bezt1, 1);
-				ED_curve_beztcpy(editnurb, &bezt[1], bezt2, 1);
-
-				MEM_freeN(bezt1);
-				MEM_freeN(bezt2);
-
-				/* set the handles for the first chamfered triple */
-				float v[3];
-				bezt1 = &nu->bezt[i];
-				helper = &nu->bezt[i - 1];
-				/* left handle */
-				sub_v3_v3v3(v, helper->vec[2], bezt1->vec[1]);
-				mul_v3_fl(v, 0.4 * len_v3(v));
-				copy_v3_v3(bezt1->vec[0], bezt1->vec[1]);
-				add_v3_v3(bezt1->vec[0], v);
-				/* right handle */
-				bezt2 = &nu->bezt[i + 1];
-				sub_v3_v3v3(v, bezt2->vec[1], bezt1->vec[1]);
-				mul_v3_fl(v, 0.4 * len_v3(v));
-				copy_v3_v3(bezt1->vec[2], bezt1->vec[1]);
-				add_v3_v3(bezt1->vec[2], v);
-
-				/* second chamfered triple */
-				helper = &nu->bezt[i + 2];
-				/* left handle */
-				sub_v3_v3v3(v, bezt1->vec[1], bezt2->vec[1]);
-				mul_v3_fl(v, 0.4 * len_v3(v));
-				copy_v3_v3(bezt2->vec[0], bezt2->vec[1]);
-				add_v3_v3(bezt2->vec[0], v);
-				/* right handle */
-				bezt2 = &nu->bezt[i + 1];
-				sub_v3_v3v3(v, helper->vec[0], bezt2->vec[1]);
-				mul_v3_fl(v, 0.4 * len_v3(v));
-				copy_v3_v3(bezt2->vec[2], bezt2->vec[1]);
-				add_v3_v3(bezt2->vec[2], v);
-			}
-		}
+		curve_chamfer_modal_loop(editnurb, nu, cd, angle, distance);
 	}
 	else {
 		bool handled = false;
@@ -8375,53 +8381,7 @@ static int curve_chamfer_modal(bContext *C, wmOperator *op, const wmEvent *event
 					}
 					angle = RNA_float_get(op->ptr, "angle");
 					distance = RNA_float_get(op->ptr, "distance");
-					for (int i = 0; i < nu->pntsu; i++) {
-						bezt = &nu->bezt[i];
-						if (BEZT_ISSEL_ANY(bezt) && bezt->h1 == 2 && bezt->h2 == 2) {
-							selected += 1;
-							original = &cd->selected_points[selected - 1];
-							bezt1 = MEM_callocN(sizeof(BezTriple), "curve_chamfer_modal1");
-							bezt2 = MEM_callocN(sizeof(BezTriple), "curve_chamfer_modal2");
-							chamfer_handle(original, bezt1, bezt2, angle, distance);
-							BEZT_SEL_ALL(bezt1);
-
-							ED_curve_beztcpy(editnurb, bezt, bezt1, 1);
-							ED_curve_beztcpy(editnurb, &bezt[1], bezt2, 1);
-
-							MEM_freeN(bezt1);
-							MEM_freeN(bezt2);
-
-							/* set the handles for the first chamfered triple */
-							float v[3];
-							bezt1 = &nu->bezt[i];
-							helper = &nu->bezt[i - 1];
-							/* left handle */
-							sub_v3_v3v3(v, helper->vec[2], bezt1->vec[1]);
-							mul_v3_fl(v, 0.4 * len_v3(v));
-							copy_v3_v3(bezt1->vec[0], bezt1->vec[1]);
-							add_v3_v3(bezt1->vec[0], v);
-							/* right handle */
-							bezt2 = &nu->bezt[i + 1];
-							sub_v3_v3v3(v, bezt2->vec[1], bezt1->vec[1]);
-							mul_v3_fl(v, 0.4 * len_v3(v));
-							copy_v3_v3(bezt1->vec[2], bezt1->vec[1]);
-							add_v3_v3(bezt1->vec[2], v);
-
-							/* second chamfered triple */
-							helper = &nu->bezt[i + 2];
-							/* left handle */
-							sub_v3_v3v3(v, bezt1->vec[1], bezt2->vec[1]);
-							mul_v3_fl(v, 0.4 * len_v3(v));
-							copy_v3_v3(bezt2->vec[0], bezt2->vec[1]);
-							add_v3_v3(bezt2->vec[0], v);
-							/* right handle */
-							bezt2 = &nu->bezt[i + 1];
-							sub_v3_v3v3(v, helper->vec[0], bezt2->vec[1]);
-							mul_v3_fl(v, 0.4 * len_v3(v));
-							copy_v3_v3(bezt2->vec[2], bezt2->vec[1]);
-							add_v3_v3(bezt2->vec[2], v);
-						}
-					}
+					curve_chamfer_modal_loop(editnurb, nu, cd, angle, distance);
 					handled = true;
 					opdata->changed = 1;
 				}
@@ -8431,53 +8391,7 @@ static int curve_chamfer_modal(bContext *C, wmOperator *op, const wmEvent *event
 		if (!handled && event->val == KM_PRESS && handleNumInput(C, &opdata->num_input[opdata->value_mode], event)) {
 			RNA_float_set(op->ptr, "distance", opdata->num_input->val[0]);
 			distance = RNA_float_get(op->ptr, "distance");
-			for (int i = 0; i < nu->pntsu; i++) {
-				bezt = &nu->bezt[i];
-				if (BEZT_ISSEL_ANY(bezt) && bezt->h1 == 2 && bezt->h2 == 2) {
-					selected += 1;
-					original = &cd->selected_points[selected - 1];
-					bezt1 = MEM_callocN(sizeof(BezTriple), "curve_chamfer_modal1");
-					bezt2 = MEM_callocN(sizeof(BezTriple), "curve_chamfer_modal2");
-					chamfer_handle(original, bezt1, bezt2, angle, distance);
-					BEZT_SEL_ALL(bezt1);
-
-					ED_curve_beztcpy(editnurb, bezt, bezt1, 1);
-					ED_curve_beztcpy(editnurb, &bezt[1], bezt2, 1);
-
-					MEM_freeN(bezt1);
-					MEM_freeN(bezt2);
-
-					/* set the handles for the first chamfered triple */
-					float v[3];
-					bezt1 = &nu->bezt[i];
-					helper = &nu->bezt[i - 1];
-					/* left handle */
-					sub_v3_v3v3(v, helper->vec[2], bezt1->vec[1]);
-					mul_v3_fl(v, 0.4 * len_v3(v));
-					copy_v3_v3(bezt1->vec[0], bezt1->vec[1]);
-					add_v3_v3(bezt1->vec[0], v);
-					/* right handle */
-					bezt2 = &nu->bezt[i + 1];
-					sub_v3_v3v3(v, bezt2->vec[1], bezt1->vec[1]);
-					mul_v3_fl(v, 0.4 * len_v3(v));
-					copy_v3_v3(bezt1->vec[2], bezt1->vec[1]);
-					add_v3_v3(bezt1->vec[2], v);
-
-					/* second chamfered triple */
-					helper = &nu->bezt[i + 2];
-					/* left handle */
-					sub_v3_v3v3(v, bezt1->vec[1], bezt2->vec[1]);
-					mul_v3_fl(v, 0.4 * len_v3(v));
-					copy_v3_v3(bezt2->vec[0], bezt2->vec[1]);
-					add_v3_v3(bezt2->vec[0], v);
-					/* right handle */
-					bezt2 = &nu->bezt[i + 1];
-					sub_v3_v3v3(v, helper->vec[0], bezt2->vec[1]);
-					mul_v3_fl(v, 0.4 * len_v3(v));
-					copy_v3_v3(bezt2->vec[2], bezt2->vec[1]);
-					add_v3_v3(bezt2->vec[2], v);
-				}
-			}
+			curve_chamfer_modal_loop(editnurb, nu, cd, angle, distance);
 			opdata->changed = 1;
 		}
 	}
@@ -8569,8 +8483,8 @@ void CURVE_OT_curve_chamfer(wmOperatorType *ot)
 	/* api callbacks */
 	ot->exec = curve_chamfer_exec;
 	ot->poll = ED_operator_editsurfcurve;
-	//ot->modal = curve_chamfer_modal;
-	//ot->invoke = curve_chamfer_invoke;
+	ot->modal = curve_chamfer_modal;
+	ot->invoke = curve_chamfer_invoke;
 
 	/* flags */
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -8689,6 +8603,59 @@ static int curve_fillet_exec(bContext *C, wmOperator *op)
 	return OPERATOR_FINISHED;
 }
 
+static void curve_fillet_modal_loop(EditNurb *editnurb, Nurb *nu, CD *cd, float distance)
+{
+	BezTriple *bezt, *original, *bezt1, *bezt2, *helper;
+	int selected = 0;
+	float v1[3], v2[3];
+	for (int i = 0; i < nu->pntsu; i++) {
+		bezt = &nu->bezt[i];
+		if (BEZT_ISSEL_ANY(bezt)) {
+			selected += 1;
+			original = &cd->selected_points[selected - 1];
+			bezt1 = MEM_callocN(sizeof(BezTriple), "curve_fillet_modal1");
+			bezt2 = MEM_callocN(sizeof(BezTriple), "curve_fillet_modal2");
+			sub_v3_v3v3(v1, original->vec[1], original->vec[0]);
+			normalize_v

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list