[Bf-blender-cvs] [44b5e6c] soc-2014-nurbs: UV Edit Selection Propagation

Jonathan deWerd noreply at git.blender.org
Wed Aug 13 17:24:31 CEST 2014


Commit: 44b5e6c0df87191060eac1fd68f1a403a7274071
Author: Jonathan deWerd
Date:   Fri Aug 8 23:24:54 2014 -0400
Branches: soc-2014-nurbs
https://developer.blender.org/rB44b5e6c0df87191060eac1fd68f1a403a7274071

UV Edit Selection Propagation

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

M	source/blender/blenkernel/BKE_curve.h
M	source/blender/blenkernel/intern/curve.cpp
M	source/blender/blenloader/intern/readfile.c
M	source/blender/editors/io/io_rhino_import.cpp
M	source/blender/editors/uvedit/uvedit_draw.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 a044c31..bb70dea 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -49,6 +49,7 @@ struct rctf;
 struct DispList;
 struct BPoint;
 struct NurbTrim;
+struct NurbEditKnot;
 struct GridMesh;
 
 typedef struct CurveCache {
@@ -154,6 +155,11 @@ void BKE_nurbs_surf_eval(float u, float v,
 						 int pntsv, int orderv, float *V,
 						 struct BPoint *P, int nd, struct BPoint *out, BSplineCacheU *ucache DEFAULT_NULL);
 
+struct NurbEditKnot* BKE_nurbs_editKnot_get(struct Nurb *nu); /* Creates editknot if necessary */
+void BKE_nurbs_editKnot_propagate_ek2nurb(struct Nurb *nu);
+void BKE_nurbs_editKnot_propagate_nurb2ek(struct Nurb *nu);
+void BKE_nurbs_editKnot_destroy(struct Nurb *nu);
+
 bool BKE_nurbList_index_get_co(struct ListBase *editnurb, const int index, float r_co[3]);
 
 int BKE_nurbList_verts_count(struct ListBase *nurb);
diff --git a/source/blender/blenkernel/intern/curve.cpp b/source/blender/blenkernel/intern/curve.cpp
index 993b465..7e2e63a 100644
--- a/source/blender/blenkernel/intern/curve.cpp
+++ b/source/blender/blenkernel/intern/curve.cpp
@@ -464,6 +464,111 @@ void BKE_curve_texspace_get(Curve *cu, float r_loc[3], float r_rot[3], float r_s
 	if (r_size) copy_v3_v3(r_size, cu->size);
 }
 
+struct NurbEditKnot* BKE_nurbs_editKnot_get(struct Nurb *nu) {
+	if (nu->editknot) return nu->editknot;
+	int capu=KNOTSU(nu), capv=KNOTSV(nu);
+	NurbEditKnot* ek = nu->editknot = (NurbEditKnot*)MEM_mallocN(sizeof(NurbEditKnot),"NURBS_editknot");
+	int bytes_per_knot = sizeof(float) + sizeof(int) + sizeof(int);
+	uint8_t *ubuf = (uint8_t*)MEM_mallocN(capu*bytes_per_knot, "NURBS_editknot_u");
+	uint8_t *vbuf = (uint8_t*)MEM_mallocN(capv*bytes_per_knot, "NURBS_editknot_v");
+	ek->breaksu = (float*)ubuf;
+	ek->multiplicityu = (int*)(ubuf + capu*sizeof(float));
+	ek->flagu = (int*)(ubuf + capu*sizeof(float) + capu*sizeof(int));
+	ek->breaksv = (float*)vbuf;
+	ek->multiplicityv = (int*)(vbuf + capv*sizeof(float));
+	ek->flagv = (int*)(vbuf + capv*sizeof(float) + capv*sizeof(int));
+	return ek;
+}
+
+void BKE_nurbs_editKnot_propagate_ek2nurb(struct Nurb *nu) {
+	NurbEditKnot *ek = nu->editknot;
+	if (!ek) return;
+	int ek_knotu=0, ek_knotv=0;
+
+	for (int i=0; i<ek->num_breaksu; i++) ek_knotu += ek->multiplicityu[i];
+	if (KNOTSU(nu)<ek_knotu || !nu->knotsu) {
+		if (nu->knotsu) MEM_freeN(nu->knotsu);
+		nu->knotsu = (float*)MEM_mallocN(sizeof(float)*ek_knotu,"NURBS_edk_prop_u");
+	}
+	for (int i=0,flatidx=0; i<ek->num_breaksu; i++) {
+		int mult = ek->multiplicityu[i];
+		float breakpt = ek->breaksu[i];
+		for (int j=0; j<mult; j++)
+			nu->knotsu[flatidx++] = breakpt;
+	}
+
+	for (int i=0; i<ek->num_breaksv; i++) ek_knotv += ek->multiplicityv[i];
+	if (KNOTSV(nu)<ek_knotv || !nu->knotsv) {
+		if (nu->knotsv) MEM_freeN(nu->knotsv);
+		nu->knotsv = (float*)MEM_mallocN(sizeof(float)*ek_knotv,"NURBS_edk_prop_v");
+	}
+	for (int i=0,flatidx=0; i<ek->num_breaksv; i++) {
+		int mult = ek->multiplicityv[i];
+		float breakpt = ek->breaksv[i];
+		for (int j=0; j<mult; j++)
+			nu->knotsv[flatidx++] = breakpt;
+	}
+}
+
+void BKE_nurbs_editKnot_propagate_nurb2ek(struct Nurb *nu) {
+	NurbEditKnot* ek = nu->editknot;
+	if (!ek) ek = nu->editknot = (NurbEditKnot*)MEM_callocN(sizeof(*ek),"NURBS_editknot_prop");
+	float *old_breaksu=ek->breaksu, *old_breaksv=ek->breaksv;
+	int *old_flagu=ek->flagu, *old_flagv=ek->flagv;
+	int old_idx=0, old_num_breaksu=ek->num_breaksu, old_num_breaksv=ek->num_breaksv;
+	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));
+	float last_knot=INFINITY; old_idx=0;
+	for (int i=0,breakidx=-1; i<KNOTSU(nu); i++) {
+		float knot = nu->knotsu[i];
+		if (knot!=last_knot) {
+			breakidx += 1;
+			last_knot = knot;
+		}
+		while (old_breaksu[old_idx]<knot && old_idx<old_num_breaksu) old_idx++;
+		if (old_breaksu[old_idx]==knot)
+			ek->flagu[breakidx] = old_flagu[old_idx];
+		ek->breaksu[breakidx] = knot;
+		ek->multiplicityu[breakidx] += 1;
+	}
+
+	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));
+	last_knot=INFINITY; old_idx=0;
+	for (int i=0,breakidx=-1; i<KNOTSV(nu); i++) {
+		float knot = nu->knotsv[i];
+		if (knot!=last_knot) {
+			breakidx += 1;
+			last_knot = knot;
+		}
+		while (old_breaksv[old_idx]<knot && old_idx<old_num_breaksv) old_idx++;
+		if (old_breaksv[old_idx]==knot)
+			ek->flagv[breakidx] = old_flagv[old_idx];
+		ek->breaksv[breakidx] = knot;
+		ek->multiplicityv[breakidx] += 1;
+	}
+
+	if (old_breaksu) MEM_freeN(old_breaksu);
+	if (old_breaksv) MEM_freeN(old_breaksv);
+}
+
+void BKE_nurbs_editKnot_destroy(struct Nurb *nu) {
+	NurbEditKnot* ek = nu->editknot;
+	if (!ek) return;
+	if (ek->breaksu) MEM_freeN(ek->breaksu);
+	if (ek->breaksv) MEM_freeN(ek->breaksv);
+	MEM_freeN(nu->editknot);
+	nu->editknot = NULL;
+}
+
 bool BKE_nurbList_index_get_co(ListBase *nurb, const int index, float r_co[3])
 {
 	Nurb *nu;
@@ -3899,6 +4004,7 @@ bool BKE_curve_minmax(Curve *cu, bool use_radius, float min[3], float max[3])
 	return (BLI_listbase_is_empty(nurb_lb) == false);
 }
 
+/* Fills cent with the median of the control points. Does not alter cu. */
 bool BKE_curve_center_median(Curve *cu, float cent[3])
 {
 	ListBase *nurb_lb = BKE_curve_nurbs_get(cu);
@@ -3937,6 +4043,7 @@ bool BKE_curve_center_median(Curve *cu, float cent[3])
 	return (total != 0);
 }
 
+/* Fills cent with the center of the AABB. Does not alter cu. */
 bool BKE_curve_center_bounds(Curve *cu, float cent[3])
 {
 	float min[3], max[3];
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index f87a927..ae535a9 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3355,10 +3355,11 @@ static void direct_link_nurblist(FileData *fd, ListBase *nurblist)
 			switch_endian_knots(nu);
 		}
 
-		/* Clear cached UV-space tessellation of trimmed surface */
+		/* Clear cached UV-space tessellation of trimmed surface & other runtime fields */
 		nu->UV_tri_count = nu->UV_verts_count = 0;
 		nu->UV_idxs = NULL;
 		nu->UV_verts = NULL;
+		nu->editknot = NULL;
 
 		/* Recurse to load trim curves */
 		if (nu->flag & CU_TRIMMED) {
diff --git a/source/blender/editors/io/io_rhino_import.cpp b/source/blender/editors/io/io_rhino_import.cpp
index dac256d..d1822e6 100644
--- a/source/blender/editors/io/io_rhino_import.cpp
+++ b/source/blender/editors/io/io_rhino_import.cpp
@@ -34,6 +34,7 @@ extern "C" {
 	#include "DNA_scene_types.h"
 	#include "BLF_translation.h"
 	#include "BLI_listbase.h"
+	#include "BLI_math.h"
 	#include "BKE_context.h"
 	#include "BKE_global.h"
 	#include "BKE_main.h"
@@ -602,6 +603,12 @@ static Curve* rhino_import_nurbs_surf_start(bContext *C,
 }
 
 static void rhino_import_nurbs_surf_end(bContext *C) {
+	Curve *cu = (Curve*)CTX_data_edit_object(C)->data;
+	float cent[3];
+	BKE_curve_center_median(cu, cent);
+	copy_v3_v3(cu->loc, cent);
+	mul_v3_fl(cent, -1);
+	BKE_curve_translate(cu, cent, false);
 	ED_object_editmode_exit(C, EM_FREEDATA);
 	printf("nurbssurf done\n");
 }
diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c
index fffee0a..10ad98d 100644
--- a/source/blender/editors/uvedit/uvedit_draw.c
+++ b/source/blender/editors/uvedit/uvedit_draw.c
@@ -66,6 +66,8 @@
 #include "UI_interface.h"
 #include "UI_view2d.h"
 
+#include "MEM_guardedalloc.h"
+
 #include "uvedit_intern.h"
 
 /* use editmesh tessface */
@@ -945,17 +947,15 @@ void draw_nurbuv(const struct bContext *C, SpaceImage *sima, ARegion *ar, Scene
 		if (nu->knotsv[KNOTSV(nu)-1]>vmax) vmax = nu->knotsv[KNOTSV(nu)-1];
 	}
 	printf("\n");
-	umin = floor(umin);
-	vmin = floor(vmin);
-	umax = ceil(umax);
-	vmax = ceil(vmax);
+	umin = floor(umin)-1;
+	vmin = floor(vmin)-1;
+	umax = ceil(umax)+1;
+	vmax = ceil(vmax)+1;
 	UI_view2d_view_to_region(&ar->v2d, umax, vmax, &xmax_region, &ymax_region);
 
 	/******* (Normalized Coordinates) draw background grid *********/
-	UI_ThemeColorShade(TH_BACK, 30);
-	glRectf(umin, vmin, umax, vmax);
 	glBegin(GL_LINES);
-	UI_ThemeColor(TH_GRID);
+	UI_ThemeColorShade(TH_GRID, 10);
 	regionx2viewx = (cur.xmax-cur.xmin)/(mask.xmax-mask.xmin);
 	regiony2viewy = (cur.ymax-cur.ymin)/(mask.ymax-mask.ymin);
 	widget_unit = U.widget_unit * regiony2viewy;
@@ -973,8 +973,7 @@ void draw_nurbuv(const struct bContext *C, SpaceImage *sima, ARegion *ar, Scene
 	/******* (Pixel Coordinates) draw coordinate numbers *********/
 	UI_view2d_view_restore(C);
 	UI_ThemeColor(TH_TITLE);
-	printf("v2d.cur %f %f\n",ar->v2d.cur.xmin,ar->v2d.cur.xmax);
-	printf("mask %i %i\n",ar->v2d.mask.xmin,ar->v2d.mask.xmax);
+	/* UI_ThemeColor(TH_GRID); probably more correct but too hard to see */
 	fonth = BLF_height_default("1",1);
 	for (i=umin; i<=umax; i++) {
 		x_view=i; y_view=vmin-widget_unit;
@@ -1008,28 +1007,30 @@ void draw_nurbuv(const struct bContext *C, SpaceImage *sima, ARegion *ar, Scene
 	glDisable(GL_BLEND);
 		
 	/******* (Normalized Coordinates) draw knot grid *********/
-	glLineWidth(1);
-	glBegin(GL_LINES);
 	for (nu=cu->editnurb->nurbs.first; nu; nu=nu->next) {
-		vmin = nu->knotsv[0];
-		vmax = nu->knotsv[KNOTSV(nu)-1];
-		umin = nu->knotsu[0];
-		umax = nu->knotsu[KNOTSU(nu)-1];
-		UI_ThemeColor(TH_NURB_ULINE);
-		j = KNOTSU(nu);
-		for (i=0; i<j; i++) {
+		NurbEditKnot *ek = BKE_nurbs_editKnot_get(nu);
+		vmin = ek->breaksv[0];
+		vmax = ek->breaksv[ek->num_breaksv-1];
+		umin = ek->breaksu[0];
+		umax = ek->breaksu[ek->num_breaksu-1];
+		UI_ThemeColor(TH_NURB_VLINE);
+		for (i=0; i<ek->num_breaksu; i++)  {
+			glLineWidth(ek->multiplicityu[i]);
+			glBegin(GL_LINE);
 			glVertex2f(nu->knotsu[i],

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list