[Bf-blender-cvs] [98e5bea] soc-2014-nurbs: Fixed bug that turned all booleans into bool_SUB, added code to get trims from Blender into 3dm viz for debug.

Jonathan deWerd noreply at git.blender.org
Fri Aug 1 18:28:41 CEST 2014


Commit: 98e5beabb5076a7e8a4cf08031955cc2353617ae
Author: Jonathan deWerd
Date:   Thu Jul 31 16:45:36 2014 -0400
Branches: soc-2014-nurbs
https://developer.blender.org/rB98e5beabb5076a7e8a4cf08031955cc2353617ae

Fixed bug that turned all booleans into bool_SUB, added code to get trims from Blender into 3dm viz for debug.

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

M	source/blender/blenkernel/intern/curve.cpp
M	source/blender/blenkernel/intern/surf_gridmesh.cpp
M	source/blender/blenkernel/intern/surf_gridmesh.h
M	tests/interactive/nurbs_trimtess.cpp

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

diff --git a/source/blender/blenkernel/intern/curve.cpp b/source/blender/blenkernel/intern/curve.cpp
index dad428c..a2a964d 100644
--- a/source/blender/blenkernel/intern/curve.cpp
+++ b/source/blender/blenkernel/intern/curve.cpp
@@ -41,6 +41,7 @@ extern "C" {
 #include "BLI_utildefines.h"
 #include "BLI_ghash.h"
 #include "BLI_polyfill2d.h"
+#include "BLI_threads.h"
 
 #include "DNA_curve_types.h"
 #include "DNA_material_types.h"
@@ -636,6 +637,11 @@ Nurb *BKE_nurb_copy(Nurb *src, int pntsu, int pntsv)
 		newnu->bp = (BPoint *)MEM_mallocN(pntsu * pntsv * sizeof(BPoint), "copyNurb3");
 	}
 	
+	newnu->trims.first = newnu->trims.last = NULL;
+	for (NurbTrim *nt = (NurbTrim*)src->trims.first; nt; nt=nt->next) {
+		NurbTrim *dup_nt = BKE_nurbTrim_duplicate(nt);
+		BLI_addtail(&newnu->trims, dup_nt);
+	}
 	BKE_nurb_clear_cached_UV_mesh(newnu,false);
 
 	return newnu;
@@ -644,6 +650,7 @@ Nurb *BKE_nurb_copy(Nurb *src, int pntsu, int pntsv)
 NurbTrim *BKE_nurbTrim_duplicate(NurbTrim *nt) {
 	NurbTrim *ret = (NurbTrim*)MEM_callocN(sizeof(NurbTrim), "duplicateNurbTrim");
 	BKE_nurbList_duplicate(&ret->nurb_list, &nt->nurb_list);
+	ret->type = nt->type;
 	return ret;
 }
 
@@ -669,7 +676,6 @@ int BKE_nurbTrim_tess(struct NurbTrim *nt, int resolution, float (**uv_out)[2])
 			BKE_nurbs_curve_eval(u, U, pntsu, orderu, bp, 1, 0, &pt);
 			uv[i][0] = pt.vec[0];
 			uv[i][1] = pt.vec[1];
-			printf("uv(%i/%i): %f %f\n",int(uv+i-*uv_out),tot_tess_pts,pt.vec[0],pt.vec[1]);
 		}
 		uv += tess_pts;
 	}
@@ -4078,6 +4084,7 @@ void BKE_nurb_compute_trimmed_UV_mesh(struct Nurb* nu) {
 	
 	// Trim
 	if (nu->resol_trim<1) nu->resol_trim = 1;
+	//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);
@@ -4087,11 +4094,22 @@ void BKE_nurb_compute_trimmed_UV_mesh(struct Nurb* nu) {
 				gm->bool_AND(trim_poly);
 				break;
 			case CU_TRIM_INTERIOR:
+				gm->bool_SUB(trim_poly);
+				break;
 			default:
+				fprintf(stderr,"WARNING: invalid trim type %i!\n",nt->type);
 				gm->bool_SUB(trim_poly);
 		}
 		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);
 	
 	// Extract the results
 	std::map<int,int> *used_idxs;
diff --git a/source/blender/blenkernel/intern/surf_gridmesh.cpp b/source/blender/blenkernel/intern/surf_gridmesh.cpp
index b43595f..119cdd7 100644
--- a/source/blender/blenkernel/intern/surf_gridmesh.cpp
+++ b/source/blender/blenkernel/intern/surf_gridmesh.cpp
@@ -63,6 +63,8 @@ GridMesh::GridMesh() {
 	coords_len = coords_reserved_len = 0;
 	mallocN = NULL;
 	reallocN = NULL;
+	recorded_AND = NULL;
+	recorded_SUB = NULL;
 }
 
 GridMesh::~GridMesh() {
@@ -358,6 +360,51 @@ std::pair<int,int> GridMesh::cell_for_vert(int vert) {
 	return std::make_pair(x,y);
 }
 
+void GridMesh::begin_recording() {
+	recorded_AND = new std::vector<int>();
+	recorded_SUB = new std::vector<int>();
+}
+
+void GridMesh::dump_poly(int poly) {
+	printf("{");
+	int vert=poly; do {
+		int next_v = v[vert].next;
+		GridMeshCoord &gmc = coords[v[vert].coord_idx];
+		printf((next_v==poly)?"%f,%f}":"%f,%f, ", gmc.x, gmc.y);
+		vert = next_v;
+	} while (vert!=poly);
+}
+
+void GridMesh::dump_recording() {
+	puts("#if defined(GRIDMESH_GEOM_TEST_6)");
+	if (recorded_AND->size()) {
+		printf("std::vector<float> clip_verts = ");
+		dump_poly(recorded_AND->at(0));
+		printf(";\n");
+	} else {
+		printf("std::vector<float> clip_verts = {.2,.2,  1.8,.2,  1.8,1.8,  .2,1.8};\n");
+	}
+	int num_SUB = (int)recorded_SUB->size();
+	for (int i=0; i<num_SUB; i++) {
+		printf("std::vector<float> subj%i = ",i);
+		dump_poly(recorded_SUB->at(i));
+		printf(";\n");
+	}
+	printf("std::vector<std::vector<float>> subj_polys = {");
+	for (int i=0; i<num_SUB; i++) {
+		printf((i==num_SUB-1)?"subj%i}":"subj%i,",i);
+	}
+	printf(";\n");
+	printf("float gm_llx=%f,gm_lly=%f,gm_urx=%f,gm_ury=%f; // GridMesh params\n",llx,lly,urx,ury);
+	printf("int gm_nx=%i, gm_ny=%i;\n",nx,ny);
+	puts("std::vector<float> inout_pts = {};");
+	puts("bool clip_cyclic = true; // Required for initialization");
+	puts("bool subj_cyclic = true;");
+	puts("#endif");
+	delete recorded_AND;
+	delete recorded_SUB;
+}
+
 void GridMesh::poly_grid_BB(int poly, int *bb) { //int bb[4] = {minx,maxx,miny,maxy}
 	int first = poly_first_vert(poly);
 	int vert = first;
@@ -599,6 +646,7 @@ int GridMesh::insert_vert(int poly1left,
 
 // gridmesh -> gridmesh (intersection) poly2
 void GridMesh::bool_AND(int poly2) {
+	if (recorded_AND) {recorded_AND->push_back(poly2); return;}
 	int bb[4];
 	poly_grid_BB(poly2, bb);
 	int num_v, num_e; insert_vert_poly_gridmesh(poly2, &num_v, &num_e);
@@ -627,6 +675,7 @@ void GridMesh::bool_AND(int poly2) {
 
 // gridmesh -> gridmesh (intersection) ~poly2
 void GridMesh::bool_SUB(int poly2) {
+	if (recorded_SUB) {recorded_SUB->push_back(poly2); return;}
 	int bb[4];
 	poly_grid_BB(poly2, bb);
 	int num_v, num_e; insert_vert_poly_gridmesh(poly2, &num_v, &num_e);
diff --git a/source/blender/blenkernel/intern/surf_gridmesh.h b/source/blender/blenkernel/intern/surf_gridmesh.h
index be327b4..6b9d6c6 100644
--- a/source/blender/blenkernel/intern/surf_gridmesh.h
+++ b/source/blender/blenkernel/intern/surf_gridmesh.h
@@ -113,6 +113,12 @@ struct GridMesh {
 	int gridpt_for_cell(int x, int y) {return (0<=x&&x<=nx&&0<=y&y<=ny)? 1+(y*(nx+1)+x) : 0;}
 	std::pair<int,int> cell_for_vert(int vert);
 	std::pair<float,float> cell_ll_corner(int x, int y) {return std::make_pair(llx+x*dx,lly+y*dy);}
+	
+	// Record & Debug Dump
+	std::vector<int> *recorded_AND, *recorded_SUB;
+	void begin_recording();
+	void dump_recording(); // Dumps the trim setup to stdout for copy/paste into tests/interactive/nurbs_trimtess.cpp
+	void dump_poly(int poly);
 
 	// Vert manipulation
 	int vert_new();
diff --git a/tests/interactive/nurbs_trimtess.cpp b/tests/interactive/nurbs_trimtess.cpp
index 5f54640..788b957 100644
--- a/tests/interactive/nurbs_trimtess.cpp
+++ b/tests/interactive/nurbs_trimtess.cpp
@@ -25,7 +25,7 @@ float intersect_check_tol = .001; //Maximum Euclidean dist between intersect pts
 /***************************** DEFAULT SCENE *****************************/
 GridMesh *gm;
 int max_drawn_edges=0; // Number of edges to draw per poly (for figuring out order). 0 disables.
-#define GRIDMESH_GEOM_TEST_4
+#define GRIDMESH_GEOM_TEST_6
 //#define RASTER_VIZ
 
 #if defined(GRIDMESH_GEOM_TEST_1)
@@ -83,6 +83,18 @@ float gm_llx=0,gm_lly=0,gm_urx=1,gm_ury=1; // GridMesh params
 int gm_nx=4, gm_ny=4;
 #endif
 
+#if defined(GRIDMESH_GEOM_TEST_6)
+std::vector<float> clip_verts = {.2,.2,  1.8,.2,  1.8,1.8,  .2,1.8};
+std::vector<float> subj0 = {0.514511,0.414239, 0.523301,0.450285, 0.528555,0.488884, 0.530239,0.528780, 0.528320,0.568703, 0.522822,0.607224, 0.513837,0.642949, 0.501466,0.674509, 0.486715,0.699252, 0.470538,0.716298, 0.453106,0.725810, 0.434947,0.727231, 0.416720,0.720083, 0.399999,0.705064, 0.385356,0.683360, 0.373093,0.656088, 0.363256,0.623353, 0.356413,0.586497, 0.352959,0.547796, 0.352904,0.508460, 0.356259,0.469699, 0.362995,0.432781, 0.373023,0.399094, 0.386249,0.370032, 0.401601 [...]
+std::vector<std::vector<float>> subj_polys = {subj0};
+float gm_llx=0.000000,gm_lly=0.000000,gm_urx=1.000000,gm_ury=1.000000; // GridMesh params
+int gm_nx=10, gm_ny=10;
+std::vector<float> inout_pts = {};
+bool clip_cyclic = true; // Required for initialization
+bool subj_cyclic = true;
+#endif
+
+
 #if defined(GRIDMESH_TIME_TEST)
 // Use this for timing runs
 bool clip_cyclic = true; // Required for initialization




More information about the Bf-blender-cvs mailing list