[Bf-blender-cvs] [321bdff1077] soc-2017-sculpting_brush: Topograb: Tried Fixing dyntopo crash using original coordinates. Dyntopo is working now. Still some error but it does not crashes now!

Raja Kediamiyagix noreply at git.blender.org
Fri Jul 14 17:02:02 CEST 2017


Commit: 321bdff10771e4209f3c4fa36b55b3f70f822374
Author: Raja Kedia(miyagix)
Date:   Fri Jul 14 20:25:35 2017 +0530
Branches: soc-2017-sculpting_brush
https://developer.blender.org/rB321bdff10771e4209f3c4fa36b55b3f70f822374

Topograb: Tried Fixing dyntopo crash using original coordinates. Dyntopo is working now. Still some error but it does not crashes now!

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

M	source/blender/bmesh/intern/bmesh_log.c
M	source/blender/bmesh/intern/bmesh_log.h
M	source/blender/editors/sculpt_paint/sculpt.c

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

diff --git a/source/blender/bmesh/intern/bmesh_log.c b/source/blender/bmesh/intern/bmesh_log.c
index 1d16dbc1836..7951c9a85ce 100644
--- a/source/blender/bmesh/intern/bmesh_log.c
+++ b/source/blender/bmesh/intern/bmesh_log.c
@@ -1031,6 +1031,10 @@ void BM_log_before_all_removed(BMesh *bm, BMLog *log)
 /* Get the logged coordinates of a vertex
  *
  * Does not modify the log or the vertex */
+uint BM_log_vert_id_t(BMLog *log, BMVert *v){
+	return bm_log_vert_id_get(log, v);
+}
+
 const float *BM_log_original_vert_co(BMLog *log, BMVert *v)
 {
 	BMLogEntry *entry = log->current_entry;
diff --git a/source/blender/bmesh/intern/bmesh_log.h b/source/blender/bmesh/intern/bmesh_log.h
index dd1772af068..cb3c5deef7e 100644
--- a/source/blender/bmesh/intern/bmesh_log.h
+++ b/source/blender/bmesh/intern/bmesh_log.h
@@ -90,6 +90,8 @@ void BM_log_before_all_removed(BMesh *bm, BMLog *log);
 /* Get the logged coordinates of a vertex */
 const float *BM_log_original_vert_co(BMLog *log, BMVert *v);
 
+uint BM_log_vert_id_t(BMLog *log, BMVert *v);
+
 /* Get the logged normal of a vertex */
 const short *BM_log_original_vert_no(BMLog *log, BMVert *v);
 
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 48e83589dbf..bdc6221ae5d 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -1743,7 +1743,7 @@ static void do_smooth_brush_bmesh_task_cb_ex(
 			}
 			else {
 				float avg[3], val[3];
-				//if(ss->cache->first_time) printf("%d ", BM_elem_index_get( vd.bm_vert));
+				if(ss->cache->first_time) printf("%d ", BM_elem_index_get( vd.bm_vert));
 				bmesh_neighbor_average(avg, vd.bm_vert);
 				sub_v3_v3v3(val, avg, vd.co);
 
@@ -2244,8 +2244,10 @@ static void do_grab_brush_task_cb_ex(
 	BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
 	{
 		sculpt_orig_vert_data_update(&orig_data, &vd);
-
+		float valx[3];
 		if (sculpt_brush_test(&test, orig_data.co)) {
+			
+			//if (ss->cache->first_time && BKE_pbvh_type(ss->pbvh) == PBVH_BMESH ) printf("(%d %.3f %.3f) ", BM_elem_index_get(vd.bm_vert), vd.co[0], vd.co[1]);
 			const float fade = bstrength * tex_strength(
 			                       ss, brush, orig_data.co, test.dist, orig_data.no, NULL, vd.mask ? *vd.mask : 0.0f,
 			                       thread_id);
@@ -2257,6 +2259,7 @@ static void do_grab_brush_task_cb_ex(
 		}
 	}
 	BKE_pbvh_vertex_iter_end;
+	if (ss->cache->first_time) printf("\n");
 }
 
 static void do_grab_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
@@ -2587,8 +2590,11 @@ static void do_layer_brush_task_cb_ex(
 	BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
 	{
 		sculpt_orig_vert_data_update(&orig_data, &vd);
-
+		float valx[3];
 		if (sculpt_brush_test(&test, orig_data.co)) {
+			
+
+			//if (ss->cache->first_time && BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) printf("%d \n", BM_elem_index_get(vd.bm_vert));
 			const float fade = bstrength * tex_strength(
 			                       ss, brush, vd.co, test.dist, vd.no, vd.fno, vd.mask ? *vd.mask : 0.0f, thread_id);
 			float *disp = &layer_disp[vd.i];
@@ -2615,7 +2621,8 @@ static void do_layer_brush_task_cb_ex(
 			sculpt_clip(sd, ss, vd.co, val);
 
 			if (vd.mvert)
-				vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
+				vd.mvert->flag |= ME_VERT_PBVH_UPDATE,
+				vd.mvert->flag |= SELECT;
 		}
 	}
 	BKE_pbvh_vertex_iter_end;
@@ -3251,6 +3258,14 @@ int check_present(int a, int *array, int len){
 	return -1;
 }
 
+int check_present_un(uint a, uint *array, int len){
+	loop(i, 0, len, 1){
+		if (array[i] == a)
+			return i;
+	}
+	return -1;
+}
+
 int check_topo_connected(int vert, int *vert_array, int totvert){
 	return check_present(vert, vert_array, totvert);
 }
@@ -3258,7 +3273,10 @@ int check_topo_connected(int vert, int *vert_array, int totvert){
 #define VERLEN 50000
 
 int ver[VERLEN] = { 0 };
+uint ver_b[VERLEN] = { 0 };
 int c_ver[VERLEN] = { 0 };
+float c_cor[VERLEN][3] = { 0 };
+float cor[VERLEN][3] = { 0 };
 int cn[6] = { 0 };
 float d[3] = { 0.0f };
 BMVert *vx;
@@ -3301,9 +3319,9 @@ int find_connect_mesh(SculptSession *ss, int vert, short *ch, int *vert_index, i
 	}
 	return 0;
 }
-
-int find_connect_bmesh(const BMVert *vert, short *ch,const int *vert_index, int len){
-	int p = check_present(BM_elem_index_get( vert), vert_index, len);
+//BM_log_vert_id_t(ss->bm_log, vd.bm_vert);
+int find_connect_bmesh(const BMLog *bml,const BMVert *vert, short *ch, const uint *vert_index, int len){
+	int p = check_present_un(BM_log_vert_id_t(bml, vert), vert_index, len);
 	if (p == -1 || ch[p] == 1){
 		return 0;
 	}
@@ -3337,7 +3355,7 @@ int find_connect_bmesh(const BMVert *vert, short *ch,const int *vert_index, int
 		for (i = 0; i < ARRAY_SIZE(adjv); i++) {
 			const BMVert *v_other = adjv[i];
 			if (vfcount != 2 || BM_vert_face_count_ex(v_other, 2) <= 2) {
-				find_connect_bmesh(v_other, ch, vert_index, len);
+				find_connect_bmesh(bml, v_other, ch, vert_index, len);
 			}
 		}
 	}
@@ -3352,6 +3370,7 @@ static void do_topo_grab_brush_task_cb_ex(
 	SculptSession *ss = data->ob->sculpt;
 	Brush *brush = data->brush;
 	const float *grab_delta = data->grab_delta;
+
 	PBVHVertexIter vd;
 	SculptBrushTest test;
 	SculptOrigVertData orig_data;
@@ -3373,13 +3392,20 @@ static void do_topo_grab_brush_task_cb_ex(
 	copy_v3_v3(test.normal, ray_normal);
 	//if (ss->cache->first_time){ printf("\n"); }
 	PBVHType type = BKE_pbvh_type(ss->pbvh);
+
 	BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
 	{
 		sculpt_orig_vert_data_update(&orig_data, &vd);
 		
 		if (sculpt_brush_test(&test, orig_data.co)){
-
+			float valx[3];
 			if (ss->cache->first_time){
+				/*
+				if (ss->cache->first_time) {
+					if (ss->bm) copy_v3_v3(valx, BM_log_original_vert_co(ss->bm_log, vd.bm_vert));
+					//printf("\n%.3f %.3f %.3f ", valx[0], valx[1], valx[2]);
+				}*/
+				//if (ss->cache->first_time && BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) printf("%d \n", BM_elem_index_get(vd.bm_vert));
 				if (type == PBVH_FACES){
 					//printf("%d ", vd.vert_indices[vd.i]);
 					ver[cn[1]] = vd.vert_indices[vd.i];
@@ -3393,11 +3419,20 @@ static void do_topo_grab_brush_task_cb_ex(
 				}else
 					if (type == PBVH_BMESH){ 
 						//printf("(%d %.3f %.3f) ", BM_elem_index_get(vd.bm_vert), vd.co[0], vd.co[1]);
+
+						copy_v3_v3(valx, BM_log_original_vert_co(ss->bm_log, vd.bm_vert));
+						ver_b[cn[1]] = BM_log_vert_id_t(ss->bm_log, vd.bm_vert);
+							
+						copy_v3_v3(cor[cn[1]], valx);
+
 						ver[cn[1]] = BM_elem_index_get( vd.bm_vert);
+						
+						printf("%u     %.3f %.3f %.3f %.3f \n", ver_b[cn[1]], cor[cn[1]][0], cor[cn[1]][1], vd.co[0], vd.co[1]);
+
 						float distsq = dist_squared_to_line_direction_v3v3(vd.co, test.true_location, test.normal);
 						if (distsq < d[0]){
 							d[0] = distsq;
-							cn[2] = ver[cn[1]];
+							cn[2] = ver_b[cn[1]];
 							vx = vd.bm_vert;
 						}
 						cn[0] = 1;
@@ -3413,7 +3448,7 @@ static void do_topo_grab_brush_task_cb_ex(
 						ss, brush, orig_data.co, test.dist, orig_data.no, NULL, vd.mask ? *vd.mask : 0.0f,
 						thread_id);
 
-
+					//printf("%d, ", cn[2]);
 					mul_v3_v3fl(proxy[vd.i], grab_delta, fade);
 					if (vd.mvert) {
 						vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
@@ -3426,7 +3461,8 @@ static void do_topo_grab_brush_task_cb_ex(
 	}
 	BKE_pbvh_vertex_iter_end;
 	//PBVHType type = BKE_pbvh_type(ss->pbvh);
-	
+
+	//BLI_mutex_init(&data->mutex);
 	if (ss->cache->first_time){
 		if (type == PBVH_FACES){
 			d[0] = 1000.0f;
@@ -3445,11 +3481,18 @@ static void do_topo_grab_brush_task_cb_ex(
 		}else
 			if (type == PBVH_BMESH){
 				//do nothing
-				d[0] = 1000.0f;
-				short ch1[VERLEN] = { 0 };
-				find_connect_bmesh(vx, ch1, ver, cn[1]);
+
+				loop(ir, 0, cn[1], 1){
+					//printf("%ud %d %.3f %.3f %.3f \n", ver_b[ir], ver[ir], cor[ir][0], cor[ir][1], cor[ir][2]);
+				}
+
+				//d[0] = 1000.0f;
+				short ch1[VERLEN] = {0};
+				print_array_i(ver_b, cn[1]);
+				find_connect_bmesh(ss->bm_log, vx, ch1, ver_b, cn[1]);
+				//printf("\n");
 				//loop(i, 0, cn[1], 1) ch1[i] = 1;
-				//printf(" BV: %d %d\n", BM_elem_index_get(vx), cn[2]);
+				printf(" \nBV: %f %f %d    %f\n", vx->co[0], vx->co[1], cn[2], d[0]);
 				int k = 0;
 				loop(ir, 0, cn[1], 1){
 					if (ch1[ir]){
@@ -3463,6 +3506,8 @@ static void do_topo_grab_brush_task_cb_ex(
 		
 		
 	}
+
+	//BLI_mutex_end(&data->mutex);
 }
 
 static void do_topo_grab_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
@@ -3485,9 +3530,11 @@ static void do_topo_grab_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int tot
 		.sd = sd, .ob = ob, .brush = brush, .nodes = nodes,
 		.grab_delta = grab_delta, 
 	};
+	BLI_mutex_init(&data.mutex);
 	BLI_task_parallel_range_ex(
 		0, totnode, &data, NULL, 0, do_topo_grab_brush_task_cb_ex,
 		((sd->flags & SCULPT_USE_OPENMP) && totnode > SCULPT_THREADED_LIMIT), false);
+	BLI_mutex_end(&data.mutex);
 }
 
 static void do_fill_brush_task_cb_ex(




More information about the Bf-blender-cvs mailing list