[Bf-blender-cvs] [ca5b2d3] soc-2014-nurbs: An entire day spent chasing mem management bugs :(

Jonathan deWerd noreply at git.blender.org
Tue Jul 29 07:21:55 CEST 2014


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. @@




More information about the Bf-blender-cvs mailing list