[Bf-blender-cvs] [3a9d719] gsoc2016-improved_extrusion: Curves: Offset operator
João Araújo
noreply at git.blender.org
Sat Jul 30 16:28:09 CEST 2016
Commit: 3a9d719df88a5093d5d2c7dac4b6903f0d84941e
Author: João Araújo
Date: Sat Jul 30 15:27:28 2016 +0100
Branches: gsoc2016-improved_extrusion
https://developer.blender.org/rB3a9d719df88a5093d5d2c7dac4b6903f0d84941e
Curves: Offset operator
Added support for mouse interaction with the offset operator.
Fixed a memory leak in the get_intersections function.
===================================================================
M source/blender/editors/curve/editcurve.c
===================================================================
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 6eaffeb..482ba72 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -6544,8 +6544,10 @@ static void get_intersections(ListBase* il, float *p1, float *p2, ListBase *nuba
}
BLI_freelistN(spl->data);
BLI_freelistN(points_list);
+ MEM_freeN(points_list);
}
BLI_freelistN(&spline_list);
+ MEM_freeN(&spline_list);
}
static int extend_curve_exec(bContext *C, wmOperator *op)
@@ -7379,26 +7381,9 @@ void CURVE_OT_trim_curve(wmOperatorType *ot)
/******************** Offset curve operator ********************/
-static void get_curve_centroid(Nurb *nu, float r_v[3])
-{
- /* This function returns the average xyz coordinates of the spline. */
- float a[3] = {0.0,0.0,0.0};
- copy_v3_v3(r_v, a);
- for (int i = 0; i < nu->pntsu; i++) {
- add_v3_v3(r_v, nu->bezt[i].vec[1]);
- if (i > 0) {
- add_v3_v3(r_v, nu->bezt[i].vec[0]);
- }
- if (i < nu->pntsu - 1) {
- add_v3_v3(r_v, nu->bezt[i].vec[2]);
- }
- }
- mul_v3_fl(r_v, 1.0/(nu->pntsu * 3 - 2));
-}
-
static void get_offset_vecs(BezTriple *bezt1, BezTriple *bezt2, float *r_v1, float *r_v2)
{
- int i = 0, dims = 3;
+ int dims = 3;
float *coord_array, *vx, *vy, *helper;
coord_array = MEM_callocN(dims * (12 + 1) * sizeof(float), "get_offset_vecs1");
vx = MEM_callocN(dims * sizeof(float), "get_offset_vecs2");
@@ -7416,7 +7401,7 @@ static void get_offset_vecs(BezTriple *bezt1, BezTriple *bezt2, float *r_v1, flo
sub_v3_v3v3(vx, coord_array + 3, coord_array);
sub_v3_v3v3(vy, coord_array + 3 * 12, coord_array + 3 * 11);
- float plane_a_co[3], plane_a_no[3], plane_b_co[3], plane_b_no[3];
+ float plane_b_no[3];
float plane_a[4], plane_b[4];
float isect_co[3];
float isect_no[3];
@@ -7517,25 +7502,11 @@ static bool reverse_offset(BezTriple *offset1, BezTriple *offset2, ListBase *nur
return ret;
}
-static int offset_curve_exec(bContext *C, wmOperator *op)
+static Nurb *offset_curve(Nurb *nu, ListBase *nubase, float distance)
{
- Object *obedit = CTX_data_edit_object(C);
- ListBase *nubase = object_editcurve_get(obedit);
- Nurb *nu, *new_nu;
- BezTriple *bezt, *new_bezt;
- float distance = RNA_float_get(op->ptr, "distance");
-
- /* 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;
- }
- bezt = nu->bezt;
- new_nu = BKE_nurb_duplicate(nu);
+ BezTriple *bezt = nu->bezt, *new_bezt;
+ Nurb *new_nu = BKE_nurb_duplicate(nu);
new_bezt = new_nu->bezt;
-
/* offset the first handle */
/* control point */
float *v1, *v2, *co;
@@ -7620,6 +7591,26 @@ static int offset_curve_exec(bContext *C, wmOperator *op)
MEM_freeN(v2);
MEM_freeN(co);
+ return new_nu;
+}
+
+static int offset_curve_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit = CTX_data_edit_object(C);
+ ListBase *nubase = object_editcurve_get(obedit);
+ Nurb *nu, *new_nu;
+ float distance = RNA_float_get(op->ptr, "distance");
+
+ /* 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;
+ }
+
+ new_nu = offset_curve(nu, nubase, distance);
+
BKE_nurb_handles_calc(new_nu);
BLI_addtail(nubase, new_nu);
@@ -7633,32 +7624,63 @@ static int offset_curve_modal(bContext *C, wmOperator *op, const wmEvent *event)
{
Object *obedit = CTX_data_edit_object(C);
ED_area_tag_redraw(CTX_wm_area(C));
+ char str[UI_MAX_DRAW_STR];
+ size_t ofs = 0;
ListBase *nubase = object_editcurve_get(obedit);
- int *init_mouse = op->customdata;
+ Nurb *nu, *new_nu;
+ int *init_mouse = op->customdata, changed = init_mouse[2];
float curr_mouse[2] = {event->x, event->y};
float prev_mouse[2] = {init_mouse[0], init_mouse[1]};
+ float distance = 1.0;
+ 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;
+ }
if (event->type == MOUSEMOVE) {
- float d = len_v2v2(prev_mouse, curr_mouse);
- RNA_float_set(op->ptr, "distance", d/1000);
- offset_curve_exec(C, op);
+ if (changed) {
+ new_nu = nubase->last;
+ BLI_poptail(nubase);
+ BKE_nurb_free(new_nu);
+ }
+ //float d = len_v2v2(prev_mouse, curr_mouse);
+ float dy = curr_mouse[1] - prev_mouse[1];
+ //RNA_float_set(op->ptr, "distance", d/1000);
+ RNA_float_set(op->ptr, "distance", dy/100);
+ distance = RNA_float_get(op->ptr, "distance");
+ new_nu = offset_curve(nu, nubase, distance);
+ BLI_addtail(nubase, new_nu);
+ init_mouse[2] = 1;
}
else if (event->type == LEFTMOUSE) {
- offset_curve_exec(C, op);
+ //offset_curve_exec(C, op);
+ ED_area_headerprint(CTX_wm_area(C), NULL);
+ MEM_freeN(init_mouse);
return OPERATOR_FINISHED;
}
else if (event->type == ESCKEY) {
+ ED_area_headerprint(CTX_wm_area(C), NULL);
+ MEM_freeN(init_mouse);
return OPERATOR_CANCELLED;
}
+ ofs += BLI_snprintf(str + ofs, sizeof(str) - ofs, IFACE_("Offset distance: %.2f"), distance);
+ ED_area_headerprint(CTX_wm_area(C), str);
+
+ WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+ DAG_id_tag_update(obedit->data, 0);
+
return OPERATOR_RUNNING_MODAL;
}
static int offset_curve_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
- int *mouse = MEM_callocN(2 * sizeof(int), "offset_curve_invoke");
+ int *mouse = MEM_callocN(3 * sizeof(int), "offset_curve_invoke");
mouse[0] = event->x;
mouse[1] = event->y;
+ mouse[2] = 0; /* this is a flag to check if the operator is currently running or if it has just been called */
op->customdata = mouse;
@@ -7679,8 +7701,8 @@ void CURVE_OT_offset_curve(wmOperatorType *ot)
/* api callbacks */
ot->exec = offset_curve_exec;
ot->poll = ED_operator_editsurfcurve;
- //ot->modal = offset_curve_modal;
- //ot->invoke = offset_curve_invoke;
+ ot->modal = offset_curve_modal;
+ ot->invoke = offset_curve_invoke;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -7773,14 +7795,13 @@ static void add_bezt(Nurb *nu, float *p, int position, Curve *cu)
BKE_nurb_handles_calc(nu);
}
-static int batch_extend_exec(bContext *C, wmOperator *op)
+static int batch_extend_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit = CTX_data_edit_object(C);
ListBase *nubase = object_editcurve_get(obedit);
Nurb *nu;
Curve *cu = obedit->data;
- EditNurb *editnurb = cu->editnurb;
- BezTriple *bezt, **selected_triples, **selected_endpoints = NULL;
+ BezTriple *bezt, **selected_triples;
ListBase first_extend = {NULL}, last_extend = {NULL};
LinkData *link;
/* at most, both endpoints can be selected for all splines */
More information about the Bf-blender-cvs
mailing list