[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