[Bf-blender-cvs] [d9992fb] soc-2014-nurbs: UV editor editing functionality (drag pts / knots, add trim, etc) is finally stable\! Commence cleanup\!

Jonathan deWerd noreply at git.blender.org
Tue Aug 19 08:12:16 CEST 2014


Commit: d9992fbb53eb484bd738f8ceb3c0bb774b9cf5ef
Author: Jonathan deWerd
Date:   Tue Aug 19 02:12:05 2014 -0400
Branches: soc-2014-nurbs
https://developer.blender.org/rBd9992fbb53eb484bd738f8ceb3c0bb774b9cf5ef

UV editor editing functionality (drag pts / knots, add trim, etc) is finally stable\! Commence cleanup\!

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

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/include/UI_resources.h
M	source/blender/editors/interface/resources.c
M	source/blender/editors/io/io_rhino_import.cpp
M	source/blender/editors/space_image/image_intern.h
M	source/blender/editors/space_image/image_ops.c
M	source/blender/editors/space_image/space_image.c
M	source/blender/editors/transform/transform_conversions.c
M	source/blender/editors/transform/transform_generics.c
M	source/blender/editors/transform/transform_ops.c
M	source/blender/editors/uvedit/uvedit_draw.c
M	source/blender/editors/uvedit/uvedit_intern.h
M	source/blender/editors/uvedit/uvedit_ops.c
M	source/blender/makesdna/DNA_curve_types.h
M	source/blender/makesdna/DNA_userdef_types.h
M	source/blender/makesrna/intern/rna_userdef.c

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

diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index 589b56b..44fe516 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -191,7 +191,7 @@ void BKE_nurb_makeFaces(struct Nurb *nu, float *coord_array, int rowstride, int
 void BKE_nurb_makeCurve(struct Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, float *weight_array, int resolu, int stride);
 struct GridMesh *BKE_nurb_compute_trimmed_GridMesh(struct Nurb* nu);
 void BKE_nurb_compute_trimmed_UV_mesh(struct Nurb* nu);
-void BKE_nurb_clear_cached_UV_mesh(struct Nurb* nu, bool free_mem);
+void BKE_nurbs_cached_UV_mesh_clear(struct Nurb* nu, bool free_mem);
 void BKE_nurb_make_displist(struct Nurb *nurb, struct DispList *dl);
 void BKE_surf_to_mesh(struct Object *surf);
 
diff --git a/source/blender/blenkernel/intern/curve.cpp b/source/blender/blenkernel/intern/curve.cpp
index f04f34b..1858e3d 100644
--- a/source/blender/blenkernel/intern/curve.cpp
+++ b/source/blender/blenkernel/intern/curve.cpp
@@ -151,6 +151,7 @@ void BKE_curve_editNurb_free(Curve *cu)
 void BKE_nurb_knot_calc_u(Nurb *nu)
 {
 	int pnts=nu->pntsu, order=nu->orderu;
+	BKE_nurbs_editKnot_destroy(nu);
 	float *knots = (float*)MEM_mallocN(sizeof(float)*(pnts+2*order), "NURB_knots_u");
 	BKE_bspline_knot_calc(nu->flagu, pnts, order, knots);
 	if (nu->knotsu) MEM_freeN(nu->knotsu);
@@ -160,6 +161,7 @@ void BKE_nurb_knot_calc_u(Nurb *nu)
 void BKE_nurb_knot_calc_v(Nurb *nu)
 {
 	int pnts=nu->pntsv, order=nu->orderv;
+	BKE_nurbs_editKnot_destroy(nu);
 	float *knots = (float*)MEM_mallocN(sizeof(float)*(pnts+2*order), "NURB_knots_v");
 	BKE_bspline_knot_calc(nu->flagv, pnts, order, knots);
 	if (nu->knotsv) MEM_freeN(nu->knotsv);
@@ -475,46 +477,48 @@ void BKE_nurbs_editKnot_propagate_ek2nurb(struct Nurb *nu) {
 	if (!ek) return;
 	int ek_knotu=0, ek_knotv=0;
 
-	for (int i=0; i<ek->num_breaksu; i++) ek_knotu += ek->multiplicityu[i];
+	for (int i=0; i<ek->num_breaksu; i++) ek_knotu += ek->breaksu[i].multiplicity;
 	BLI_assert(KNOTSU(nu)==ek_knotu);
 	for (int i=0,flatidx=0; i<ek->num_breaksu; i++) {
-		int mult = ek->multiplicityu[i];
-		float breakpt = ek->breaksu[i];
+		int mult = ek->breaksu[i].multiplicity;
+		float breakpt = ek->breaksu[i].loc;
 		for (int j=0; j<mult; j++)
 			nu->knotsu[flatidx++] = breakpt;
 	}
 
 	if (ek->num_breaksv) {
-		for (int i=0; i<ek->num_breaksv; i++) ek_knotv += ek->multiplicityv[i];
+		for (int i=0; i<ek->num_breaksv; i++) ek_knotv += ek->breaksv[i].multiplicity;
 		BLI_assert(KNOTSV(nu)==ek_knotv);
 		for (int i=0,flatidx=0; i<ek->num_breaksv; i++) {
-			int mult = ek->multiplicityv[i];
-			float breakpt = ek->breaksv[i];
+			int mult = ek->breaksv[i].multiplicity;
+			float breakpt = ek->breaksv[i].loc;
 			for (int j=0; j<mult; j++)
 				nu->knotsv[flatidx++] = breakpt;
 		}
 	}
 }
 
-/* Maintains flags for knots at a given location across knot update */
+/* Maintains flags for knots at a given location across knot update
+ * Also clears NurbTrim SELECT flag whenever it allocates a new editknot (which
+ * happens on editmode enter) */
 void BKE_nurbs_editKnot_propagate_nurb2ek(struct Nurb *nu) {
 	NurbEditKnot *ek = nu->editknot;
 	NurbEditKnot old_ek;
+	NurbTrim *nt;
 	bool update_ek;
 	if (ek) {
 		old_ek = *ek;
 		update_ek = true;
 	} else {
 		ek = nu->editknot = (NurbEditKnot*)MEM_callocN(sizeof(*ek),"NURBS_editknot_prop");
+		for (nt=(NurbTrim*)nu->trims.first; nt; nt=nt->next) {
+			nt->flag &= ~SELECT;
+		}
 		update_ek = false;
 	}
-	int bytes_per_knot = sizeof(float) + sizeof(int) + sizeof(int);
 
 	int capu = ek->capu = KNOTSU(nu);
-	uint8_t *ubuf = (uint8_t*)MEM_callocN(capu*bytes_per_knot, "NURBS_editknot_u");
-	ek->breaksu = (float*)ubuf;
-	ek->multiplicityu = (int*)(ubuf + capu*sizeof(float));
-	ek->flagu = (int*)(ubuf + capu*sizeof(float) + capu*sizeof(int));
+	ek->breaksu = (NurbBreakpt*)MEM_callocN(capu*sizeof(NurbBreakpt), "NURBS_editknot_u");
 	float last_knot=INFINITY;
 	int old_idx=0, breakidx=-1;
 	for (int i=0; i<KNOTSU(nu); i++) {
@@ -524,13 +528,13 @@ void BKE_nurbs_editKnot_propagate_nurb2ek(struct Nurb *nu) {
 			last_knot = knot;
 		}
 		if (update_ek) { /* try to propagate SELECT etc from old ek to new ek */
-			while (old_ek.breaksu[old_idx]<knot && old_idx<old_ek.num_breaksu)
+			while (old_ek.breaksu[old_idx].loc<knot && old_idx<old_ek.num_breaksu)
 				old_idx++;
-			if (old_ek.breaksu[old_idx]==knot)
-				ek->flagu[breakidx] = old_ek.flagu[old_idx];
+			if (old_ek.breaksu[old_idx].loc==knot)
+				ek->breaksu[breakidx].flag = old_ek.breaksu[old_idx].flag;
 		}
-		ek->breaksu[breakidx] = knot;
-		ek->multiplicityu[breakidx] += 1;
+		ek->breaksu[breakidx].loc = knot;
+		ek->breaksu[breakidx].multiplicity += 1;
 	}
 	ek->num_breaksu = breakidx+1;
 
@@ -541,10 +545,7 @@ void BKE_nurbs_editKnot_propagate_nurb2ek(struct Nurb *nu) {
 		ek->multiplicityv = NULL;
 	} else {
 		int capv = ek->capv = KNOTSV(nu);
-		uint8_t *vbuf = (uint8_t*)MEM_callocN(capv*bytes_per_knot, "NURBS_editknot_v");
-		ek->breaksv = (float*)vbuf;
-		ek->multiplicityv = (int*)(vbuf + capv*sizeof(float));
-		ek->flagv = (int*)(vbuf + capv*sizeof(float) + capv*sizeof(int));
+		ek->breaksv = (NurbBreakpt*)MEM_callocN(capv*sizeof(NurbBreakpt), "NURBS_editknot_v");
 		last_knot=INFINITY;
 		old_idx=0; breakidx=-1;
 		for (int i=0; i<KNOTSV(nu); i++) {
@@ -554,13 +555,13 @@ void BKE_nurbs_editKnot_propagate_nurb2ek(struct Nurb *nu) {
 				last_knot = knot;
 			}
 			if (update_ek) { /* try to propagate SELECT etc from old ek to new ek */
-				while (old_ek.breaksv[old_idx]<knot && old_idx<old_ek.num_breaksv)
+				while (old_ek.breaksv[old_idx].loc<knot && old_idx<old_ek.num_breaksv)
 					old_idx++;
-				if (old_ek.breaksv[old_idx]==knot)
-					ek->flagv[breakidx] = old_ek.flagv[old_idx];
+				if (old_ek.breaksv[old_idx].loc==knot)
+					ek->breaksv[breakidx].flag = old_ek.breaksv[old_idx].flag;
 			}
-			ek->breaksv[breakidx] = knot;
-			ek->multiplicityv[breakidx] += 1;
+			ek->breaksv[breakidx].loc = knot;
+			ek->breaksv[breakidx].multiplicity += 1;
 		}
 		ek->num_breaksv = breakidx+1;
 	}
@@ -573,12 +574,12 @@ void BKE_nurbs_editKnot_propagate_nurb2ek(struct Nurb *nu) {
 //	printf("U: Propagated {");
 //	for (int i=0; i<KNOTSU(nu); i++) printf("%3.1f ",nu->knotsu[i]);
 //	printf("} -> {");
-//	for (int i=0; i<ek->num_breaksu; i++) printf("%3.1fx%i ",ek->breaksu[i],ek->multiplicityu[i]);
+//	for (int i=0; i<ek->num_breaksu; i++) printf("%3.1fx%i ",ek->breaksu[i].loc,ek->breaksu[i].multiplicity);
 //	printf("}\n");
 //	printf("V: Propagated {");
 //	for (int i=0; i<KNOTSV(nu); i++) printf("%3.1f ",nu->knotsv[i]);
 //	printf("} -> {");
-//	for (int i=0; i<ek->num_breaksv; i++) printf("%3.1fx%i ",ek->breaksv[i],ek->multiplicityv[i]);
+//	for (int i=0; i<ek->num_breaksv; i++) printf("%3.1fx%i ",ek->breaksv[i].loc,ek->breaksv[i].multiplicity);
 //	printf("}\n");
 }
 
@@ -747,7 +748,7 @@ Nurb *BKE_nurb_duplicate(Nurb *nu)
 		NurbTrim *dup_nt = BKE_nurbTrim_duplicate(nt);
 		BLI_addtail(&newnu->trims, dup_nt);
 	}
-	BKE_nurb_clear_cached_UV_mesh(newnu,false);
+	BKE_nurbs_cached_UV_mesh_clear(newnu,false);
 	newnu->editknot = NULL;
 
 	return newnu;
@@ -775,7 +776,7 @@ Nurb *BKE_nurb_copy(Nurb *src, int pntsu, int pntsv)
 		NurbTrim *dup_nt = BKE_nurbTrim_duplicate(nt);
 		BLI_addtail(&newnu->trims, dup_nt);
 	}
-	BKE_nurb_clear_cached_UV_mesh(newnu,false);
+	BKE_nurbs_cached_UV_mesh_clear(newnu,false);
 	newnu->editknot = NULL;
 
 	return newnu;
@@ -928,7 +929,7 @@ void BKE_nurb_points_add(Nurb *nu, int number)
 	}
 
 	nu->pntsu += number;
-	BKE_nurb_clear_cached_UV_mesh(nu, true);
+	BKE_nurbs_cached_UV_mesh_clear(nu, true);
 }
 
 void BKE_nurb_bezierPoints_add(Nurb *nu, int number)
@@ -943,7 +944,7 @@ void BKE_nurb_bezierPoints_add(Nurb *nu, int number)
 	}
 
 	nu->pntsu += number;
-	BKE_nurb_clear_cached_UV_mesh(nu, true);
+	BKE_nurbs_cached_UV_mesh_clear(nu, true);
 }
 
 
@@ -4378,7 +4379,7 @@ void BKE_nurb_compute_trimmed_UV_mesh(struct Nurb* nu) {
 	delete gm;
 }
 
-void BKE_nurb_clear_cached_UV_mesh(struct Nurb* nu, bool free_mem) {
+void BKE_nurbs_cached_UV_mesh_clear(struct Nurb* nu, bool free_mem) {
 	nu->UV_verts_count = nu->UV_tri_count = 0;
 	if (free_mem) {
 		if (nu->UV_verts) MEM_freeN(nu->UV_verts);
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 06358da..2943205 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -1328,11 +1328,14 @@ static void remap_hooks_and_vertex_parents(Object *obedit)
 /* load editNurb in object */
 void load_editNurb(Object *obedit)
 {
-	if (obedit == NULL) return;
-	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);
+	Nurb *nu;
+	if (obedit == NULL) return;
+	if (!ELEM(obedit->type, OB_CURVE, OB_SURF)) return;
+	for (nu=(Nurb*)editnurb->first; nu; nu=nu->next) {
+		BKE_nurbs_editKnot_propagate_ek2nurb(nu);
+	}
 	BKE_nurbList_duplicate(&cu->nurb, editnurb);
 	calc_shapeKeys(obedit);
 	ED_curve_updateAnimPaths(obedit->data);
@@ -5102,7 +5105,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
 				newbp->f1 |= SELECT;
 
 				newnu = (Nurb *)MEM_mallocN(sizeof(Nurb), "addvert_Nurb newnu");
-				BKE_nurb_clear_cached_UV_mesh(newnu, false);
+				BKE_nurbs_cached_UV_mesh_clear(newnu, false);
 				memcpy(newnu, nu, sizeof(Nurb));
 				BLI_addtail(&editnurb->nurbs, newnu);
 				newnu->bp = newbp;
diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h
index 2e78940..f62061d 100644
--- a/source/blender/editors/include/UI_resources.h
+++ b/source/blender/editors/include/UI_resources.h
@@ -280,6 +280,13 @@ enum {
 	TH_INFO_DEBUG,
 	TH_INFO_DEBUG_TEXT,
 	TH_VIEW_OVERLAY,
+
+	TH_NURB_TRIM_AND,
+	TH_NURB_TRIM_SUB,
+	TH_NURB_TRIM_ADD,
+	TH_NURB_SEL_TRIM_AND,
+	TH_NURB_SEL_TRIM_SUB,
+	TH_NURB_SEL_TRIM_ADD
 };
 /* XXX WARNING: previous is saved in file, so do not change order! */
 
diff --git a/source/blender/editors/interface/resources.c

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list