Commit: c6200a6c6713bf3b384a2a77b64ab96d14f96ecb
Author: João Araújo
Date:   Wed Aug 3 17:27:46 2016 +0100
Branches: gsoc2016-improved_extrusion
https://developer.blender.org/rBc6200a6c6713bf3b384a2a77b64ab96d14f96ecb

Curves: Extend and Trim operator

Extend operator: fixed memory related issues
Trim operator: idem, and some bugs

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

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

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

diff --git a/source/blender/editors/curve/editcurve.c 
b/source/blender/editors/curve/editcurve.c
index 5a32f91..c84a0cc 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -6307,7 +6307,7 @@ void CURVE_OT_match_texture_space(wmOperatorType *ot)
 
 /******************** Extend curve operator ********************/
 
-static void get_selected_splines(ListBase* spline_list, ListBase *nubase, int 
*r_number_splines, bool return_cyclic)
+static void get_selected_bezier_splines(ListBase* spline_list, ListBase 
*nubase, int *r_number_splines, bool return_cyclic)
 {
        /* receives a list with all Bezier splines in a "curve" object
         * returns the first spline of a linked list with all the selected 
splines,
@@ -6322,6 +6322,9 @@ static void get_selected_splines(ListBase* spline_list, 
ListBase *nubase, int *r
        {
                handles = nu->pntsu;
                bezt = nu->bezt;
+               if (!nu->bezt) {
+                       continue;
+               }
                while (handles--)
                { /* cycle through all the handles. see if any is selected */
                        if (BEZT_ISSEL_ANY(bezt) && (!(nu->flagu & 
CU_NURB_CYCLIC) || return_cyclic))
@@ -6467,6 +6470,10 @@ static ListBase *interpolate_all_segments(Nurb *nu)
         * If the cuve only has two handles, the final result is only on list
         * Otherwise, there is an overlap between the last element of a list and
         * the first of the next one */
+       if (!nu->bezt) { /* Not a Bezier curve */
+               return NULL;
+       }
+
        int i = 0, dims = 3;
        float *coord_array;
        ListBase *pl = (ListBase *)MEM_callocN(sizeof(ListBase), 
"interpolate_all_segments1");
@@ -6502,7 +6509,12 @@ static void linear_spline_list(ListBase *nubase, 
ListBase *spline_list)
        for (nu=nubase->first; nu; nu=nu->next) {
                link = MEM_callocN(sizeof(LinkData), "linearspllist1");
                link->data = interpolate_all_segments(nu);
-               BLI_addtail(spline_list, link);
+               if (link->data) {
+                       BLI_addtail(spline_list, link);
+               }
+               else {
+                       MEM_freeN(link);
+               }
        }
 }
 
@@ -6539,15 +6551,13 @@ static void get_intersections(ListBase* il, float *p1, 
float *p2, ListBase *nuba
                                        MEM_freeN(vi);
                                }
                        }
-                       MEM_freeN(link->data);   /* commenting either does not 
free the memory */
-                       MEM_freeN(coord_array);  /* running both gives an 
error, but seems to free the memory */
+                       MEM_freeN(link->data);
                }
                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)
@@ -6564,16 +6574,7 @@ static int extend_curve_exec(bContext *C, wmOperator *op)
        int n_selected_splines = 0, result = 0, a = 0;
        float p1[3], p2[3] = {0.0, 0.0, 0.0}, p1_handle[3], bound_box[4], 
p1_extend[2];
 
-       for (nu = nubase->first; nu; nu = nu->next)
-       {
-               if (!(nu->type & CU_BEZIER))
-               {
-                       BKE_report(op->reports, RPT_ERROR, "Only Bezier curves 
can be extended");
-                       return OPERATOR_CANCELLED;
-               }
-       }
-
-       get_selected_splines(&spline_list, nubase, &n_selected_splines, false);
+       get_selected_bezier_splines(&spline_list, nubase, &n_selected_splines, 
false);
 
        /* the user can only select one or two splines */
        if ((n_selected_splines == 0 || n_selected_splines > 2)) {
@@ -6693,8 +6694,8 @@ static int extend_curve_exec(bContext *C, wmOperator *op)
        }
        BLI_freelistN(&intersections_list);
        if(selected_endpoints) MEM_freeN(selected_endpoints);
-       //if(first_selected_endpoints) MEM_freeN(first_selected_endpoints);
-       //if(second_selected_endpoints) MEM_freeN(second_selected_endpoints);
+       if(first_selected_endpoints) MEM_freeN(first_selected_endpoints);
+       if(second_selected_endpoints) MEM_freeN(second_selected_endpoints);
 
        if (result != 1)
        {
@@ -6798,7 +6799,6 @@ static ListBase *spline_X_shape(Object *obedit, int 
selected_spline)
        intersections = (ListBase *)MEM_callocN(sizeof(ListBase), 
"splineXshape2");
        full_coord_array = (float *)MEM_callocN(3 * ((nu->pntsu - 1 + 
nu->flagu) * nu->resolu + 1) * sizeof(float), "splineXshape3");
 
-
        /* get the full coord_array for nu */
        float *original_first_coord_array;
        // original_first_coord_array = (float *)MEM_callocN(3 * (nu->resolu + 
1) * sizeof(float), "splineXshape7");
@@ -6900,7 +6900,6 @@ static ListBase *spline_X_shape(Object *obedit, int 
selected_spline)
        BLI_listbase_sort(intersections, XShape_cmp);
 
        MEM_freeN(full_coord_array);
-       MEM_freeN(original_first_coord_array);
 
        for (segment = all_segments->first; segment; segment = segment->next)
        {
@@ -6919,7 +6918,6 @@ static ListBase *spline_X_shape(Object *obedit, int 
selected_spline)
                MEM_freeN(spline->data);
        }
        BLI_freelistN(&shape_list);
-       MEM_freeN(&shape_list);
 
        return intersections;
 }
@@ -7032,25 +7030,27 @@ static void chop(float *x, float *p1, float *p2, float 
*p3, float *p4, int res,
                                 float *r_s1, float *r_s2)
 {
        float ratio = ratio_to_segment(x, p1, p2, p3, p4, res);
-
-       if (ratio != 0) {
-               split_segment(ratio, p1, p2, p3, p4, r_s1, r_s2);
-       }
-       else
-       {
-               r_s1 = r_s2 = NULL;
-       }
+       split_segment(ratio, p1, p2, p3, p4, r_s1, r_s2);
 }
 
 static int trim_curve_exec(bContext *C, wmOperator *op)
 {
        Object *obedit = CTX_data_edit_object(C);
+       Curve *cu = obedit->data;
        ListBase *nubase = object_editcurve_get(obedit);
-       ListBase selected_splines = {NULL};
+       ListBase selected_splines = {NULL}, high = {NULL}, low = {NULL};
        int n_sel_splines = 0, n_sel_handles = 0;
-       Nurb *nu;
+       Nurb *nu, *next, *new_spl = NULL;
+       bool changed = 0;
+
+       get_selected_bezier_splines(&selected_splines, nubase, &n_sel_splines, 
true);
 
-       get_selected_splines(&selected_splines, nubase, &n_sel_splines, true);
+       nu = selected_splines.first;
+       while (nu) {
+               next = nu->next;
+               BKE_nurb_free(nu);
+               nu = next;
+       }
 
        /* it only makes sense for one spline to be selected */
        if (n_sel_splines == 0) {
@@ -7062,7 +7062,7 @@ static int trim_curve_exec(bContext *C, wmOperator *op)
                return OPERATOR_CANCELLED;
        }
 
-       int spline_id = get_selected_spline_id(nubase);
+       int spline_id = cu->actnu;
        nu = BLI_findlink(nubase, spline_id);
 
        ListBase *spl_int = spline_X_shape(obedit, spline_id);
@@ -7081,8 +7081,6 @@ static int trim_curve_exec(bContext *C, wmOperator *op)
                BKE_report(op->reports, RPT_ERROR, "Something went terribly 
wrong! Report this bug and assign it to genio84");
                return OPERATOR_CANCELLED;
        }
-       ListBase *low = (ListBase *)MEM_callocN(sizeof(ListBase), 
"trim_exec1");;
-       ListBase *high = (ListBase *)MEM_callocN(sizeof(ListBase), 
"trim_exec2");;
        XShape *xshape;
 
        LinkData *link;
@@ -7091,17 +7089,17 @@ static int trim_curve_exec(bContext *C, wmOperator *op)
                if (xshape->order < point_id) {
                        link = (LinkData *)MEM_callocN(sizeof(LinkData), 
"trim_exec3");
                        link->data = xshape;
-                       BLI_addtail(low, link);
+                       BLI_addtail(&low, link);
                }
                else
                {
                        link = (LinkData *)MEM_callocN(sizeof(LinkData), 
"trim_exec4");
                        link->data = xshape;
-                       BLI_addtail(high, link);
+                       BLI_addtail(&high, link);
                }
        }
 
-       int len_low = BLI_listbase_count(low), len_high = 
BLI_listbase_count(high);
+       int len_low = BLI_listbase_count(&low), len_high = 
BLI_listbase_count(&high);
        float *s1, *s2, *s3, *s4;
        s1 = (float *)MEM_callocN(4 * 3 * sizeof(float), "trim_exec_coord1");
        s2 = (float *)MEM_callocN(4 * 3 * sizeof(float), "trim_exec_coord2");
@@ -7115,36 +7113,35 @@ static int trim_curve_exec(bContext *C, wmOperator *op)
                        return OPERATOR_CANCELLED;
                }
 
-               int npoints = 0;
+               int npoints = 0, high_first_order = 0, low_last_order = 0;
                if (len_low == 0)
                {
-                       MEM_freeN(low);
                        low = high;
-                       npoints = ((XShape *)((LinkData 
*)high->last)->data)->order - ((XShape *)((LinkData 
*)high->first)->data)->order + 2;
+                       npoints = ((XShape *)((LinkData 
*)high.last)->data)->order - ((XShape *)((LinkData *)high.first)->data)->order 
+ 2;
                }
                else if (len_high == 0)
                {
-                       MEM_freeN(high);
                        high = low;
-                       npoints = ((XShape *)((LinkData 
*)low->last)->data)->order - ((XShape *)((LinkData *)low->first)->data)->order 
+ 2;
+                       npoints = ((XShape *)((LinkData 
*)low.last)->data)->order - ((XShape *)((LinkData *)low.first)->data)->order + 
2;
                }
                else
                {
-                       npoints = nu->pntsu - ((XShape *)((LinkData 
*)high->first)->data)->order + ((XShape *)((LinkData *)low->last)->data)->order 
+ 2;
+                       npoints = nu->pntsu - ((XShape *)((LinkData 
*)high.first)->data)->order + ((XShape *)((LinkData *)low.last)->data)->order + 
2;
                }
 
-               int low_last_order = ((XShape *)((LinkData 
*)low->last)->data)->order;
-               int high_first_order = ((XShape *)((LinkData 
*)high->first)->data)->order;
+               low_last_order = ((XShape *)((LinkData 
*)low.last)->data)->order;
+               high_first_order = ((XShape *)((LinkData 
*)high.first)->data)->order;
 
-               Nurb *new_spl = BKE_nurb_duplicate(nu);
-               // new_spl->bezt = (BezTriple *)MEM_callocN(npoints * 
sizeof(BezTriple), "trimexec5");
+               new_spl = BKE_nurb_duplicate(nu);
+               MEM_freeN(new_spl->bezt);
+               new_spl->bezt = (BezTriple *)MEM_callocN(npoints * 
sizeof(BezTriple), "trimexec5");
                new_spl->pntsu = npoints;
                new_spl->flagu = 0;
                BezTriple *bezt = new_spl->bezt;
                for (int i = 0; i < new_spl->pntsu; i++) {
                        BezTriple *old_bezt = nu->bezt;
                        /* get the correct bezier point from the original 
spline */
-                       int a = (i + ((XShape *)((LinkData 
*)high->first)->data)->order ) % ( nu->pntsu );
+                       int a = (i + high_first_order ) % ( nu->pntsu );
                        while ( a-- ) {
                                old_bezt++;
                        }
@@ -7154,7 +7151,7 @@ static int trim_curve_exec(bContext *C, wmOperator *op)
                        bezt++;
                }
 
-               chop(((XShape *)((LinkData *)low->last)->data)->intersections,
+               chop(((XShape *)((LinkData *)low.last)->data)->intersections,
                         (float *)&nu->bezt[low_last_order].vec[1],
                         (float *)&nu->bezt[low_last_order].vec[2],
                         (float *)&nu->bezt[(low_last_order + 1) % 
nu->pntsu].vec[0],
@@ -7166,12 +7163,12 @@ static int trim_curve_exec(bContext *C, wmOperator *op)
                new_spl->bezt[new_spl->pntsu - 1].h2 = HD_FREE;
                new_spl->bezt[new_spl->pntsu - 2].h1 = HD_FREE;
                new_spl->bezt[new_spl->pntsu - 2].h2 = HD_FREE;
-               copy_v3_v3(new_spl->bezt[new_spl->pntsu - 1].vec[1], ((XShape 
*)((LinkData *)low->last)->data)->intersections);
+               copy_v3_v3(new_spl->bezt[new_spl->pntsu - 1].vec[1], ((XShape 
*)((LinkData *)low.last)->data)->intersections);
                

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to