[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