Commit: 96af6e19abcacc5509594ccabdc6f0b9cb0b1974
Author: João Araújo
Date:   Mon Aug 1 12:59:22 2016 +0100
Branches: gsoc2016-improved_extrusion
https://developer.blender.org/rB96af6e19abcacc5509594ccabdc6f0b9cb0b1974

Curves: Fillet operator

Implemented a fillet operator. This operator is everything but mathematically 
correct (to get a radius 1 fillet, you need to input radius 1.73; endpoints do 
not match), but it achieves a nice visual result.

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

M       source/blender/editors/curve/curve_intern.h
M       source/blender/editors/curve/curve_ops.c
M       source/blender/editors/curve/editcurve.c

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

diff --git a/source/blender/editors/curve/curve_intern.h 
b/source/blender/editors/curve/curve_intern.h
index b4788cd..43c8576 100644
--- a/source/blender/editors/curve/curve_intern.h
+++ b/source/blender/editors/curve/curve_intern.h
@@ -133,6 +133,7 @@ void CURVE_OT_trim_curve(struct wmOperatorType *ot);
 void CURVE_OT_offset_curve(struct wmOperatorType *ot);
 void CURVE_OT_batch_extend(struct wmOperatorType *ot);
 void CURVE_OT_curve_chamfer(struct wmOperatorType *ot);
+void CURVE_OT_curve_fillet(struct wmOperatorType *ot);
 
 bool ED_curve_pick_vert(
         struct ViewContext *vc, short sel, const int mval[2],
diff --git a/source/blender/editors/curve/curve_ops.c 
b/source/blender/editors/curve/curve_ops.c
index 398f4dc..4de74f5 100644
--- a/source/blender/editors/curve/curve_ops.c
+++ b/source/blender/editors/curve/curve_ops.c
@@ -144,6 +144,7 @@ void ED_operatortypes_curve(void)
        WM_operatortype_append(CURVE_OT_offset_curve);
        WM_operatortype_append(CURVE_OT_batch_extend);
        WM_operatortype_append(CURVE_OT_curve_chamfer);
+       WM_operatortype_append(CURVE_OT_curve_fillet);
 
        WM_operatortype_append(CURVE_OT_match_texture_space);
 }
diff --git a/source/blender/editors/curve/editcurve.c 
b/source/blender/editors/curve/editcurve.c
index 0cba6f3..40e6134 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -7930,6 +7930,7 @@ static int curve_chamfer_exec(bContext *C, wmOperator *op)
        Nurb *nu;
        float distance = RNA_float_get(op->ptr, "distance");
        float angle = RNA_float_get(op->ptr, "angle");
+       int aaa = RNA_enum_get(op->ptr, "type");
 
        /* get selected spline */
        int spline_id = get_selected_spline_id(nubase);
@@ -8136,7 +8137,7 @@ static int curve_chamfer_invoke(bContext *C, wmOperator 
*op, const wmEvent *even
                        bezt1 = MEM_callocN(sizeof(BezTriple), 
"curve_chamfer_modal1");
                        BEZT_SEL_ALL(bezt1);
                        bezt2 = MEM_callocN(sizeof(BezTriple), 
"curve_chamfer_modal2");
-                       chamfer_handle(bezt, bezt1, bezt2, DEG2RAD(45.0f), 
1.0f); /* here a copy of the original bezt is required <---------------------- 
*/
+                       chamfer_handle(bezt, bezt1, bezt2, DEG2RAD(45.0f), 
1.0f);
 
                        memcpy(&nu->bezt[i + 1], &nu->bezt[i], (nu->pntsu - i - 
1) * sizeof(BezTriple));
                        memcpy(&nu->bezt[i], bezt1, sizeof(BezTriple));
@@ -8157,7 +8158,6 @@ static int curve_chamfer_invoke(bContext *C, wmOperator 
*op, const wmEvent *even
 
 void CURVE_OT_curve_chamfer(wmOperatorType *ot)
 {
-
        /* identifiers */
        ot->name = "Chamfer";
        ot->description = "Chamfer selected points";
@@ -8177,4 +8177,111 @@ void CURVE_OT_curve_chamfer(wmOperatorType *ot)
        //RNA_def_float(ot->srna, "angle", DEG2RAD(45.0f), 0.0f, 
DEG2RAD(90.0f), "Chamfer angle", "", 0.0f, DEG2RAD(90.0f));
        RNA_def_float(ot->srna, "distance", 1.0f, 0.0f, OBJECT_ADD_SIZE_MAXF, 
"Chamfer length", "", 0.0f, 10.0f);
        RNA_def_float_rotation(ot->srna, "angle", 0, NULL, -FLT_MAX, FLT_MAX, 
"Angle", "", -M_PI * 2, M_PI * 2);
+}
+
+/******************** Fillet operator ********************/
+/* In an ideal world, chamfer and fillet would be the same operator, since 
they share 90% of the code
+ * TODO: Make the above true */
+
+static void fillet_handle(BezTriple *bezt, BezTriple *r_new_bezt1, BezTriple 
*r_new_bezt2, float theta, float r)
+{
+       float d = r * 2 * sin(theta/2);
+       chamfer_handle(bezt, r_new_bezt1, r_new_bezt2, theta, d);
+
+       float v1[3], v2[3];
+       sub_v3_v3v3(v1, bezt->vec[1], bezt->vec[0]);
+       normalize_v3(v1);
+       mul_v3_fl(v1, r * 4.0/3 * tan(theta/4));
+       copy_v3_v3(r_new_bezt1->vec[2], r_new_bezt1->vec[1]);
+       add_v3_v3(r_new_bezt1->vec[2], v1);
+
+       sub_v3_v3v3(v2, bezt->vec[1], bezt->vec[2]);
+       normalize_v3(v2);
+       mul_v3_fl(v2, r * 4.0/3 * tan(theta/4));
+       copy_v3_v3(r_new_bezt2->vec[0], r_new_bezt2->vec[1]);
+       add_v3_v3(r_new_bezt2->vec[0], v2);
+
+       r_new_bezt1->h1 = r_new_bezt2->h1 = r_new_bezt1->h2 = r_new_bezt2->h2 = 
HD_FREE;
+}
+
+static int curve_fillet_exec(bContext *C, wmOperator *op)
+{
+       Object *obedit = CTX_data_edit_object(C);
+       ListBase *nubase = object_editcurve_get(obedit);
+       Nurb *nu;
+       float distance = RNA_float_get(op->ptr, "distance");
+       float angle = RNA_float_get(op->ptr, "angle");
+
+       /* get selected spline */
+       int spline_id = get_selected_spline_id(nubase);
+       nu = BLI_findlink(nubase, spline_id);
+       if (!nu) {
+               BKE_report(op->reports, RPT_ERROR, "One spline must be 
selected");
+               return OPERATOR_CANCELLED;
+       }
+
+       /* check if handles are vector type! */
+       BezTriple *bezt = nu->bezt, *bezt1, *bezt2, *helper;
+       int selected_point = 0;
+       for (int i = 0; i < nu->pntsu; i++) {
+               bezt = &nu->bezt[i];
+               if (BEZT_ISSEL_ANY(bezt) && bezt->h1 == 2 && bezt->h2 == 2) {
+                       bezt1 = MEM_callocN(sizeof(BezTriple), 
"curve_chamfer1");
+                       bezt2 = MEM_callocN(sizeof(BezTriple), 
"curve_chamfer2");
+                       fillet_handle(bezt, bezt1, bezt2, angle, distance);
+                       selected_point = i;
+                       BKE_nurb_bezierPoints_add(nu, 1);
+
+                       memcpy(&nu->bezt[selected_point + 1], 
&nu->bezt[selected_point], (nu->pntsu - selected_point - 1) * 
sizeof(BezTriple));
+                       memcpy(&nu->bezt[selected_point], bezt1, 
sizeof(BezTriple));
+                       memcpy(&nu->bezt[selected_point + 1], bezt2, 
sizeof(BezTriple));
+
+                       MEM_freeN(bezt1);
+                       MEM_freeN(bezt2);
+
+                       /* set the handles for the first chamfered triple */
+                       float v[3];
+                       bezt1 = &nu->bezt[selected_point];
+                       helper = &nu->bezt[selected_point - 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);
+
+                       /* second chamfered triple */
+                       helper = &nu->bezt[selected_point + 2];
+                       /* right handle */
+                       bezt2 = &nu->bezt[selected_point + 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);
+               }
+       }
+
+       WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+       DAG_id_tag_update(obedit->data, 0);
+
+       return OPERATOR_FINISHED;
+}
+
+void CURVE_OT_curve_fillet(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name = "Fillet";
+       ot->description = "Fillet selected points";
+       ot->idname = "CURVE_OT_curve_fillet";
+
+       /* api callbacks */
+       ot->exec = curve_fillet_exec;
+       ot->poll = ED_operator_editsurfcurve;
+
+       /* flags */
+       ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+       /* Properties */
+       //RNA_def_float(ot->srna, "angle", DEG2RAD(45.0f), 0.0f, 
DEG2RAD(90.0f), "Chamfer angle", "", 0.0f, DEG2RAD(90.0f));
+       RNA_def_float(ot->srna, "distance", 1.0f, 0.0f, OBJECT_ADD_SIZE_MAXF, 
"Radius", "", 0.0f, 10.0f);
+       RNA_def_float_rotation(ot->srna, "angle", 0, NULL, -FLT_MAX, FLT_MAX, 
"Angle", "", -M_PI * 2, M_PI * 2);
 }
\ No newline at end of file

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to