Commit: ca5b2d3c5c71278a4f9409a3c9d4063a70feca8c
Author: Jonathan deWerd
Date:   Mon Jul 28 01:21:45 2014 -0400
Branches: soc-2014-nurbs
https://developer.blender.org/rBca5b2d3c5c71278a4f9409a3c9d4063a70feca8c

An entire day spent chasing mem management bugs :(

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

M       source/blender/blenkernel/BKE_curve.h
M       source/blender/blenkernel/intern/curve.cpp
M       source/blender/editors/curve/editcurve.c
M       source/blender/editors/curve/editcurve_add.c
M       source/blender/editors/io/io_rhino_import.cpp
M       source/blender/editors/space_view3d/view3d_buttons.c
M       source/blender/editors/transform/transform_generics.c
M       source/blender/editors/util/ed_transverts.c
M       source/blender/makesdna/DNA_curve_types.h

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

diff --git a/source/blender/blenkernel/BKE_curve.h 
b/source/blender/blenkernel/BKE_curve.h
index e8d27715..386324b 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -47,7 +47,7 @@ struct Path;
 struct TextBox;
 struct rctf;
 struct DispList;
-typedef struct BPoint BPoint;
+struct BPoint;
 
 typedef struct CurveCache {
        ListBase disp;
@@ -140,17 +140,17 @@ void BKE_curve_rect_from_textbox(const struct Curve *cu, 
const struct TextBox *t
 void BKE_bspline_knot_calc(int flags, int pnts, int order, float knots[]);
 int BKE_bspline_nz_basis_range(float u, float *knots, int num_pts, int order);
 void BKE_bspline_basis_eval(float u, int i, float *U, int num_knots, int 
order, int nd, float out[][NURBS_MAX_ORDER]);
-void BKE_bspline_curve_eval(float u, float *U, int num_pts, int order, BPoint 
*P, int stride, int nd, BPoint *out, bool premultiply_weight DEFAULT_FALSE);
-void BKE_nurbs_curve_eval(float u, float *U, int num_pts, int order, BPoint 
*P, int stride, int nd, BPoint *out);
+void BKE_bspline_curve_eval(float u, float *U, int num_pts, int order, struct 
BPoint *P, int stride, int nd, struct BPoint *out, bool premultiply_weight 
DEFAULT_FALSE);
+void BKE_nurbs_curve_eval(float u, float *U, int num_pts, int order, struct 
BPoint *P, int stride, int nd, struct BPoint *out);
 void BKE_bspline_surf_eval(float u, float v,
                                                   int pntsu, int orderu, float 
*U,
                                                   int pntsv, int orderv, float 
*V,
-                                                  BPoint *P, int nd, BPoint 
*out,
+                                                  struct BPoint *P, int nd, 
struct BPoint *out,
                                                   bool premultiply_weights 
DEFAULT_FALSE, BSplineCacheU *ucache DEFAULT_NULL);
 void BKE_nurbs_surf_eval(float u, float v,
                                                 int pntsu, int orderu, float 
*U,
                                                 int pntsv, int orderv, float 
*V,
-                                                BPoint *P, int nd, BPoint 
*out, BSplineCacheU *ucache DEFAULT_NULL);
+                                                struct BPoint *P, int nd, 
struct BPoint *out, BSplineCacheU *ucache DEFAULT_NULL);
 
 
 bool BKE_nurbList_index_get_co(struct ListBase *editnurb, const int index, 
float r_co[3]);
@@ -170,7 +170,7 @@ void BKE_nurb_free(struct Nurb *nu);
 struct Nurb *BKE_nurb_duplicate(struct Nurb *nu);
 struct Nurb *BKE_nurb_copy(struct Nurb *src, int pntsu, int pntsv);
 
-void BKE_nurb_test2D(struct Nurb *nu);
+void BKE_nurb_ensure2D(struct Nurb *nu);
 void BKE_nurb_minmax(struct Nurb *nu, bool use_radius, float min[3], float 
max[3]);
 
 void BKE_nurb_makeFaces(struct Nurb *nu, float *coord_array, int rowstride, 
int resolu, int resolv);
diff --git a/source/blender/blenkernel/intern/curve.cpp 
b/source/blender/blenkernel/intern/curve.cpp
index e78249d..b4660d2 100644
--- a/source/blender/blenkernel/intern/curve.cpp
+++ b/source/blender/blenkernel/intern/curve.cpp
@@ -368,7 +368,7 @@ void BKE_curve_curve_dimension_update(Curve *cu)
        else {
                for (; nu; nu = nu->next) {
                        nu->flag |= CU_2D;
-                       BKE_nurb_test2D(nu);
+                       BKE_nurb_ensure2D(nu);
 
                        /* since the handles are moved they need to be 
auto-located again */
                        if (nu->type == CU_BEZIER)
@@ -524,7 +524,7 @@ int BKE_nurbList_verts_count_without_handles(ListBase *nurb)
 
 void BKE_nurb_free(Nurb *nu)
 {
-
+       printf("BKE_nurb_free 0x%lx\n",(unsigned long)nu);
        if (nu == NULL) return;
 
        if (nu->bezt)
@@ -539,24 +539,14 @@ void BKE_nurb_free(Nurb *nu)
        if (nu->knotsv)
                MEM_freeN(nu->knotsv);
        nu->knotsv = NULL;
-       Nurb *outertrim = (Nurb*)nu->outer_trim.first;
-       while (outertrim) {
-               Nurb *tofree = outertrim;
-               outertrim = outertrim->next;
-               MEM_freeN(tofree);
-       }
-       LinkData *innertrim = (LinkData*)nu->inner_trim.first;
+
+       BKE_nurbList_free(&nu->outer_trim);
+       
+       LinkedNurbList *innertrim = (LinkedNurbList*)nu->inner_trim.first;
        while (innertrim) {
-               if (innertrim->data) {
-                       Nurb *it_nurb = (Nurb*)innertrim->data;
-                       while (it_nurb) {
-                               Nurb *tofree = it_nurb;
-                               it_nurb = it_nurb->next;
-                               MEM_freeN(tofree);
-                       }
-               }
-               LinkData *tofree = innertrim;
+               LinkedNurbList *tofree = innertrim;
                innertrim = innertrim->next;
+               BKE_nurbList_free(&tofree->nurb_list);
                MEM_freeN(tofree);
        }
 
@@ -579,10 +569,6 @@ void BKE_nurbList_free(ListBase *lb)
        BLI_listbase_clear(lb);
 }
 
-ListBase *BKE_nurbList_duplicate(ListBase *lb) {
-       ListBase *newbase = (ListBase*)MEM_callocN(sizeof(ListBase),"NURBS 
duplicate listbase");
-}
-
 Nurb *BKE_nurb_duplicate(Nurb *nu)
 {
        Nurb *newnu;
@@ -620,6 +606,19 @@ Nurb *BKE_nurb_duplicate(Nurb *nu)
                        }
                }
        }
+       
+       newnu->inner_trim.first = newnu->inner_trim.last = NULL;
+       newnu->outer_trim.first = newnu->outer_trim.last = NULL;
+       
+       BKE_nurbList_duplicate(&newnu->outer_trim, &nu->outer_trim);
+       
+       LinkedNurbList *lnl = (LinkedNurbList*)nu->inner_trim.first;
+       while (lnl) {
+               LinkedNurbList *lnl_dup = 
(LinkedNurbList*)MEM_callocN(sizeof(LinkedNurbList),"duplicateNurb6");
+               BKE_nurbList_duplicate(&lnl_dup->nurb_list, &lnl->nurb_list);
+               lnl = lnl->next;
+               BLI_addtail(&newnu->inner_trim, lnl_dup);
+       }
 
        return newnu;
 }
@@ -659,7 +658,7 @@ void BKE_nurbList_duplicate(ListBase *lb1, ListBase *lb2)
        }
 }
 
-void BKE_nurb_test2D(Nurb *nu)
+void BKE_nurb_ensure2D(Nurb *nu)
 {
        BezTriple *bezt;
        BPoint *bp;
diff --git a/source/blender/editors/curve/editcurve.c 
b/source/blender/editors/curve/editcurve.c
index 6c3e477..2968b68 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -1306,33 +1306,14 @@ static void remap_hooks_and_vertex_parents(Object 
*obedit)
 /* load editNurb in object */
 void load_editNurb(Object *obedit)
 {
-       ListBase *editnurb = object_editcurve_get(obedit);
-
        if (obedit == NULL) return;
-
-       if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
-               Curve *cu = obedit->data;
-               Nurb *nu, *newnu;
-               ListBase newnurb = {NULL, NULL}, oldnurb = cu->nurb;
-
-               remap_hooks_and_vertex_parents(obedit);
-
-               for (nu = editnurb->first; nu; nu = nu->next) {
-                       newnu = BKE_nurb_duplicate(nu);
-                       BLI_addtail(&newnurb, newnu);
-
-                       if (nu->type == CU_NURBS) {
-                               BKE_nurb_order_clamp_u(nu);
-                       }
-               }
-
-               cu->nurb = newnurb;
-
-               calc_shapeKeys(obedit);
-               ED_curve_updateAnimPaths(obedit->data);
-
-               BKE_nurbList_free(&oldnurb);
-       }
+       if (!ELEM(obedit->type, OB_CURVE, OB_SURF)) return;
+       Curve *cu = obedit->data;
+       ListBase *editnurb = object_editcurve_get(obedit);
+       //      for nu in editnurb: if (nu->type == CU_NURBS)  
BKE_nurb_order_clamp_u(nu);
+       BKE_nurbList_duplicate(&cu->nurb, editnurb);
+       calc_shapeKeys(obedit);
+       ED_curve_updateAnimPaths(obedit->data);
 }
 
 /* make copy in cu->editnurb */
@@ -1365,7 +1346,7 @@ void make_editNurb(Object *obedit)
                nu = cu->nurb.first;
                while (nu) {
                        newnu = BKE_nurb_duplicate(nu);
-                       BKE_nurb_test2D(newnu); // after join, or any other 
creation of curve
+                       BKE_nurb_ensure2D(newnu); // after join, or any other 
creation of curve
                        BLI_addtail(&editnurb->nurbs, newnu);
                        nu = nu->next;
                }
@@ -1771,7 +1752,7 @@ void ed_editnurb_translate_flag(ListBase *editnurb, short 
flag, const float vec[
                        }
                }
 
-               BKE_nurb_test2D(nu);
+               BKE_nurb_ensure2D(nu);
        }
 }
 
@@ -5182,7 +5163,7 @@ static int addvert_Nurb(bContext *C, short mode, float 
location[3])
                        BKE_curve_nurb_vert_active_set(cu, nu, newbp);
                }
 
-               BKE_nurb_test2D(nu);
+               BKE_nurb_ensure2D(nu);
 
                if (ED_curve_updateAnimPaths(obedit->data))
                        WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit);
diff --git a/source/blender/editors/curve/editcurve_add.c 
b/source/blender/editors/curve/editcurve_add.c
index d8b4f38..68f5af5 100644
--- a/source/blender/editors/curve/editcurve_add.c
+++ b/source/blender/editors/curve/editcurve_add.c
@@ -460,7 +460,7 @@ Nurb *add_nurbs_primitive(bContext *C, Object *obedit, 
float mat[4][4], int type
                cu->actnu = BLI_countlist(editnurb);
                cu->actvert = CU_ACT_NONE;
 
-               BKE_nurb_test2D(nu);
+               BKE_nurb_ensure2D(nu);
        }
 
        return nu;
diff --git a/source/blender/editors/io/io_rhino_import.cpp 
b/source/blender/editors/io/io_rhino_import.cpp
index d1d6383..fddc97c 100644
--- a/source/blender/editors/io/io_rhino_import.cpp
+++ b/source/blender/editors/io/io_rhino_import.cpp
@@ -691,24 +691,30 @@ static void rhino_import_brep_face(bContext *C,
                ON_BrepLoop *loop = face->Loop(loopnum);
                int trim_count = loop->TrimCount();
                printf("   loop: 0x%lx\n",long(loop));
-               struct LinkData *loop_ll_item = (struct 
LinkData*)MEM_callocN(sizeof(LinkData),"NURBS trim link data");
-               struct ListBase *loop_ll = (struct 
ListBase*)MEM_callocN(sizeof(ListBase),"NURBS trim link list");
-               loop_ll_item->data = loop_ll;
+               ListBase *nurb_list;
+               if (loop!=outer_loop) {
+                       LinkedNurbList *lnl = 
(LinkedNurbList*)MEM_callocN(sizeof(LinkedNurbList),"NURBS trim link");
+                       BLI_addtail(&nu->inner_trim, lnl);
+                       nurb_list = &lnl->nurb_list;
+               } else {
+                       nurb_list = &nu->outer_trim;
+               }
                for (int trimnum=0; trimnum<trim_count; trimnum++) {
                        ON_BrepTrim *trim = loop->Trim(trimnum);
                        ON_Curve *cu = 
const_cast<ON_Curve*>(trim->ProxyCurve());
                        printf("      trim: 0x%lx 
%s\n",long(trim),cu->ClassId()->ClassName());
                        Nurb *trim_nurb = rhino_import_curve(C, cu, parentObj, 
parentAttrs, false, true, true);
-                       if (loop==outer_loop) {
-                               BLI_addtail(&nu->outer_trim, trim_nurb);
-                       } else {
-                               BLI_addtail(loop_ll, trim_nurb);
-                       }
+                       BLI_addtail(nurb_list, trim_nurb);
                }
-               if (loop!=outer_loop) {
-                       BLI_addtail(&nu->inner_trim, loop_ll_item);
+       }
+       
+       for (LinkedNurbList *lnl = (LinkedNurbList*)nu->inner_trim.first; lnl; 
lnl=lnl->next) {
+               printf("lnl 0x%lx first:0x%lx 
last:0x%lx\n",lnl,lnl->nurb_list.first,lnl->nurb_list.last);
+               for (Nurb *ln=(Nurb*)lnl->nurb_list.first; ln; ln=ln->next) {
+                       printf("\tln 0x%lx->0x%lx outer_trim:0x%lx 
inner_trim:0x%lx\n",ln->prev,ln->next,ln->outer_trim.first,ln->inner_trim.first);
                }
        }
+
        if (should_destroy_ns) delete ns;
 }
 
diff --git a/source/blender/editors/space_view3d/view3d_buttons.c 
b/source/blender/editors/space_view3d/view3d_buttons.c
index cf589cd..8e77892 100644
--- a/source/blender/editors/space_view3d/view3d_buttons.c
+++ b/source/blender/editors/space_view3d/view3d_buttons.c
@@ -699,7 +699,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D 
*v3d, Object *ob, float
                                                }
                                        }
                                }
-                               BKE_nurb_test2D(nu);
+                               BKE_nurb_ensure2D(nu);
                                BKE_nurb_handles_test(nu,

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to