[Bf-blender-cvs] [b4d795b] soc-2014-nurbs: Stopgap bugfix for trim tessellator failure when trim curve hits vert, read/write unstashed & bugfixed to not crash on undo push, changed UV axis orientation and coloring for consistency with RGB={+x, +y, +z} mnemonic.

Jonathan deWerd noreply at git.blender.org
Thu Aug 7 22:43:00 CEST 2014


Commit: b4d795b9b78d127206d67c1dacb4ea14d0f9412a
Author: Jonathan deWerd
Date:   Wed Aug 6 23:58:52 2014 -0400
Branches: soc-2014-nurbs
https://developer.blender.org/rBb4d795b9b78d127206d67c1dacb4ea14d0f9412a

Stopgap bugfix for trim tessellator failure when trim curve hits vert, read/write unstashed & bugfixed to not crash on undo push, changed UV axis orientation and coloring for consistency with RGB={+x,+y,+z} mnemonic.

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

M	release/scripts/presets/interface_theme/back_to_black.xml
M	release/scripts/presets/interface_theme/elsyiun.xml
M	release/scripts/presets/interface_theme/hexagon.xml
M	release/scripts/presets/interface_theme/ubuntu_ambiance.xml
M	source/blender/blenkernel/intern/curve.cpp
M	source/blender/blenkernel/intern/surf_gridmesh.cpp
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/editors/curve/editcurve_add.c
M	source/blender/editors/interface/resources.c
M	source/blender/editors/io/io_rhino_import.cpp
M	source/blender/editors/space_view3d/drawobject.c
M	source/blender/makesdna/DNA_curve_types.h
M	tests/interactive/nurbs_trimtess.cpp

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

diff --git a/release/scripts/presets/interface_theme/back_to_black.xml b/release/scripts/presets/interface_theme/back_to_black.xml
index b9e84e1..2660dcc 100644
--- a/release/scripts/presets/interface_theme/back_to_black.xml
+++ b/release/scripts/presets/interface_theme/back_to_black.xml
@@ -252,10 +252,10 @@
                    face_dot="#ffa900"
                    facedot_size="4"
                    freestyle_face_mark="#7fff7f33"
-                   nurb_uline="#909000"
-                   nurb_vline="#803060"
-                   nurb_sel_uline="#f0ff40"
-                   nurb_sel_vline="#f090a0"
+                   nurb_uline="#900000"
+                   nurb_vline="#009000"
+                   nurb_sel_uline="#e00000"
+                   nurb_sel_vline="#00cc00"
                    act_spline="#db2512"
                    handle_free="#7f7f7f"
                    handle_auto="#909000"
diff --git a/release/scripts/presets/interface_theme/elsyiun.xml b/release/scripts/presets/interface_theme/elsyiun.xml
index 3fef948..9473630 100644
--- a/release/scripts/presets/interface_theme/elsyiun.xml
+++ b/release/scripts/presets/interface_theme/elsyiun.xml
@@ -252,10 +252,10 @@
                    face_dot="#be6925"
                    facedot_size="3"
                    freestyle_face_mark="#7fff7f33"
-                   nurb_uline="#909000"
-                   nurb_vline="#803060"
-                   nurb_sel_uline="#f0ff40"
-                   nurb_sel_vline="#f090a0"
+                   nurb_uline="#900000"
+                   nurb_vline="#009000"
+                   nurb_sel_uline="#e00000"
+                   nurb_sel_vline="#00cc00"
                    act_spline="#db2512"
                    handle_free="#000000"
                    handle_auto="#909000"
diff --git a/release/scripts/presets/interface_theme/hexagon.xml b/release/scripts/presets/interface_theme/hexagon.xml
index d32bd81..9f5e4e4 100644
--- a/release/scripts/presets/interface_theme/hexagon.xml
+++ b/release/scripts/presets/interface_theme/hexagon.xml
@@ -252,10 +252,10 @@
                    face_dot="#4fc9ff"
                    facedot_size="3"
                    freestyle_face_mark="#7fff7f33"
-                   nurb_uline="#909000"
-                   nurb_vline="#803060"
-                   nurb_sel_uline="#f0ff40"
-                   nurb_sel_vline="#f090a0"
+                   nurb_uline="#900000"
+                   nurb_vline="#009000"
+                   nurb_sel_uline="#e00000"
+                   nurb_sel_vline="#00cc00"
                    act_spline="#db2512"
                    handle_free="#000000"
                    handle_auto="#909000"
diff --git a/release/scripts/presets/interface_theme/ubuntu_ambiance.xml b/release/scripts/presets/interface_theme/ubuntu_ambiance.xml
index 9de72b9..0232895 100644
--- a/release/scripts/presets/interface_theme/ubuntu_ambiance.xml
+++ b/release/scripts/presets/interface_theme/ubuntu_ambiance.xml
@@ -252,10 +252,10 @@
                    face_dot="#f47421"
                    facedot_size="3"
                    freestyle_face_mark="#7fff7f33"
-                   nurb_uline="#909000"
-                   nurb_vline="#862074"
-                   nurb_sel_uline="#f0ff40"
-                   nurb_sel_vline="#d15d85"
+                   nurb_uline="#900000"
+                   nurb_vline="#009000"
+                   nurb_sel_uline="#e00000"
+                   nurb_sel_vline="#00cc00"
                    act_spline="#ee4000"
                    handle_free="#a5ca00"
                    handle_auto="#00c59a"
diff --git a/source/blender/blenkernel/intern/curve.cpp b/source/blender/blenkernel/intern/curve.cpp
index 4b8b6a2..1909ddb 100644
--- a/source/blender/blenkernel/intern/curve.cpp
+++ b/source/blender/blenkernel/intern/curve.cpp
@@ -617,10 +617,12 @@ Nurb *BKE_nurb_duplicate(Nurb *nu)
 	newnu->trims.first = newnu->trims.last = NULL;
 	for (NurbTrim *nt = (NurbTrim*)nu->trims.first; nt; nt=nt->next) {
 		NurbTrim *dup_nt = BKE_nurbTrim_duplicate(nt);
+		printf("\tTrim: 0x%lx->0x%lx\n",nt,dup_nt);
 		BLI_addtail(&newnu->trims, dup_nt);
 	}
 	BKE_nurb_clear_cached_UV_mesh(newnu,false);
 
+	printf("Duplicated nurb 0x%lx->0x%lx\n",nu,newnu);
 	return newnu;
 }
 
@@ -4066,9 +4068,18 @@ void BKE_nurb_domain(struct Nurb *nu, float *umin, float *umax, float *vmin, flo
 
 GridMesh *BKE_nurb_compute_trimmed_GridMesh(struct Nurb* nu) {
 	// Figure out the domain
-	int totu=(nu->pntsu-nu->orderu+1)*nu->resolu, totv=(nu->pntsv-nu->orderv+1)*nu->resolv;
 	float ustart,uend,vstart,vend;
 	BKE_nurb_domain(nu,&ustart,&uend,&vstart,&vend);
+	int totu_knot = round(uend-ustart)*nu->resolu;
+	int totv_knot = round(vend-vstart)*nu->resolv;
+	int totu_geom = (nu->pntsu-1)*nu->resolu;
+	int totv_geom = (nu->pntsv-1)*nu->resolv;
+	int totu=totu_knot, totv=totv_knot;
+	if (totu<2 || totv<2 || totu_knot>totu_geom || totv_knot>totv_geom) {
+		printf("Nonsensical NURBS tessellation level. Using geometric fallback.\n");
+		totu = totu_geom;
+		totv = totv_geom;
+	}
 	
 	// Trim the uniform grid in 2D UV space
 	GridMesh *gm = new GridMesh();
@@ -4077,7 +4088,7 @@ GridMesh *BKE_nurb_compute_trimmed_GridMesh(struct Nurb* nu) {
 	
 	// Trim
 	if (nu->resol_trim<1) nu->resol_trim = 1;
-	//gm->begin_recording();
+//	gm->begin_recording();
 	for (NurbTrim *nt=(NurbTrim*)nu->trims.first; nt; nt=nt->next) {
 		float (*trim_uv_pts)[2];
 		int num_trimpts = BKE_nurbTrim_tess(nt, nu->resol_trim, &trim_uv_pts);
@@ -4095,14 +4106,14 @@ GridMesh *BKE_nurb_compute_trimmed_GridMesh(struct Nurb* nu) {
 		}
 		MEM_freeN(trim_uv_pts);
 	}
-	//	static ThreadMutex *mutex = NULL;
-	//	if (!mutex) {
-	//		mutex = (ThreadMutex*)MEM_callocN(sizeof(ThreadMutex), "ThreadMutex");
-	//		BLI_mutex_init(mutex);
-	//	}
-	//	BLI_mutex_lock(mutex);
-	//	gm->dump_recording();
-	//	BLI_mutex_unlock(mutex);
+//	static ThreadMutex *mutex = NULL;
+//	if (!mutex) {
+//		mutex = (ThreadMutex*)MEM_callocN(sizeof(ThreadMutex), "ThreadMutex");
+//		BLI_mutex_init(mutex);
+//	}
+//	BLI_mutex_lock(mutex);
+//	gm->dump_recording();
+//	BLI_mutex_unlock(mutex);
 	return gm;
 }
 
@@ -4130,7 +4141,6 @@ void BKE_nurb_compute_trimmed_UV_mesh(struct Nurb* nu) {
 			int cell = gm->poly_for_cell(i, j);
 			GridMeshVert *v = &gm->v[0];
 			
-			// 
 			for (int poly=cell; poly; poly=v[poly].next_poly) {
 				if (!v[poly].next) {
 					continue;
@@ -4317,7 +4327,6 @@ void nurbs_meshinfo_pass_2(Nurb *nu, NurbsMeshInfo &nmi) {
 	int loopnum=0, polynum=0;
 	for (GridMeshIterator gmi=nmi.gm->begin(); !gmi.done(); gmi.next()) {
 		int poly = gmi.poly;
-		printf("%i: ",poly);
 		int vert=poly;
 		GridMeshVert *gmvert = &nmi.gm->v[vert];
 		int coordidx = gmvert->coord_idx;
@@ -4349,12 +4358,12 @@ void nurbs_meshinfo_pass_2(Nurb *nu, NurbsMeshInfo &nmi) {
 			copy_v3_v3(mesh_v->co, surfpt[0].vec);
 			float norm[3];
 			cross_v3_v3v3(norm, surfpt[1].vec, surfpt[2].vec);
+			normalize_v3(norm);
 			normal_float_to_short_v3(mesh_v->no, norm);
 
 			/* MEdge, MLoop, MLoopUV */
 			mesh_e->v1 = remapped_vert_idx;
 			mesh_e->v2 = remapped_nextvert_idx;
-			printf("(%i-%i.%i.%i-%i) ",coordidx,nextcoordidx,remapped_edge_idx,remapped_vert_idx,remapped_nextvert_idx);
 			mesh_l->v = remapped_vert_idx;
 			mesh_l->e = remapped_edge_idx;
 			mesh_luv->uv[0] = gmcoord->x;
@@ -4365,7 +4374,6 @@ void nurbs_meshinfo_pass_2(Nurb *nu, NurbsMeshInfo &nmi) {
 			remapped_vert_idx = remapped_nextvert_idx;
 			coordidx = gmvert->coord_idx;
 		} while (vert!=poly);
-		printf("\n");
 		MPoly *mesh_p = nmi.polys + (polynum++);
 		mesh_p->loopstart = first_loop_of_poly;
 		mesh_p->totloop = num_edge_in_poly;
@@ -4396,7 +4404,6 @@ void BKE_surf_to_mesh(Object *ob) {
 		NurbsMeshInfo &nmi = NMIs[i];
 
 		nurbs_meshinfo_pass_1(nu, nmi);
-		printf("Meshinfo %i %i %i %i\n",nmi.verts,nmi.loops,nmi.edges,nmi.polys);
 
 		totvert += nmi.num_vert;
 		totloop += nmi.num_loop;
@@ -4406,11 +4413,11 @@ void BKE_surf_to_mesh(Object *ob) {
 	}
 	
 	/* Allocate mesh storage now that we know total counts */
-	MVert *allvert = (MVert*)MEM_callocN(sizeof(MVert)*totvert+4, "NURBS2mesh_verts");	unsigned *cvert = (unsigned*)(allvert+totvert); *cvert=0xDEADBEEF;
-	MEdge *alledge = (MEdge*)MEM_callocN(sizeof(MEdge)*totedge+4, "NURBS2mesh_edges");	unsigned *cedge = (unsigned*)(alledge+totedge); *cedge=0xDEADBEEF;
-	MLoop *allloop = (MLoop*)MEM_callocN(sizeof(MLoop)*totloop+4, "NURBS2mesh_loop");		unsigned *cloop = (unsigned*)(allloop+totloop); *cloop=0xDEADBEEF;
-	MPoly *allpoly = (MPoly*)MEM_callocN(sizeof(MPoly)*totpoly+4, "NURBS2mesh_poly");		unsigned *cpoly = (unsigned*)(allpoly+totpoly); *cpoly=0xDEADBEEF;
-	MLoopUV *alluv = (MLoopUV*)MEM_callocN(sizeof(MLoopUV)*totloop+4, "NURBS2mesh_uv");	unsigned *cuv = (unsigned*)(alluv+totloop);     *cuv=0xDEADBEEF;
+	MVert *allvert = (MVert*)MEM_callocN(sizeof(MVert)*totvert+4, "NURBS2mesh_verts");
+	MEdge *alledge = (MEdge*)MEM_callocN(sizeof(MEdge)*totedge+4, "NURBS2mesh_edges");
+	MLoop *allloop = (MLoop*)MEM_callocN(sizeof(MLoop)*totloop+4, "NURBS2mesh_loop");
+	MPoly *allpoly = (MPoly*)MEM_callocN(sizeof(MPoly)*totpoly+4, "NURBS2mesh_poly");
+	MLoopUV *alluv = (MLoopUV*)MEM_callocN(sizeof(MLoopUV)*totloop+4, "NURBS2mesh_uv");
 
 	/* Pass 2 fills the newly allocated buffers */
 	nu = (Nurb*)cu->nurb.first;
diff --git a/source/blender/blenkernel/intern/surf_gridmesh.cpp b/source/blender/blenkernel/intern/surf_gridmesh.cpp
index 708731b..fa8fbc9 100644
--- a/source/blender/blenkernel/intern/surf_gridmesh.cpp
+++ b/source/blender/blenkernel/intern/surf_gridmesh.cpp
@@ -1263,7 +1263,8 @@ int line_line_intersection(double ax, double ay, // Line 1, vert 1 A
 						   double *ix, double *iy, // Intersection point
 						   double *alpha1
 ) {
-	double tol = .001;
+	double shallow_ang_tol = 1e-6; // sin^2th < ang_tol   =>  return false
+	double endpt_frac_tol = 1e-6;  // alpha1 or alpha2 < endpt_frac_tol  => ret 0
 	// (ax,ay)--------(bx,by)
 	//   (cx,cy)------------(dx,dy)
 	// Do they intersect? If so, return true and fill alpha{1,2} with the
@@ -1278,13 +1279,19 @@ int line_line_intersection(double ax, double ay, // Line 1, vert 1 A
 	double a12 = cx - dx;
 	double a21 = by - ay;
 	double a22 = cy - dy;
+	double ABsq = 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list