[Bf-blender-cvs] [1af5ea2f882] soc-2017-sculpting_brush: Working version of topograb: Update 1

decoda noreply at git.blender.org
Thu Jun 22 19:56:15 CEST 2017


Commit: 1af5ea2f882af4f7d9f1a20676082fb8be2c6113
Author: decoda
Date:   Thu Jun 22 23:25:44 2017 +0530
Branches: soc-2017-sculpting_brush
https://developer.blender.org/rB1af5ea2f882af4f7d9f1a20676082fb8be2c6113

Working version of topograb: Update 1

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

M	source/blender/editors/sculpt_paint/sculpt.c

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

diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 73fccec336f..95b85247f3b 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -210,6 +210,11 @@ typedef struct StrokeCache {
 	float bstrength;
 	float normal_weight;  /* from brush (with optional override) */
 
+	/* Just Topo things! */
+
+	int *d_count;
+	int *v_index;
+
 	/* The rest is temporary storage that isn't saved as a property */
 
 	bool first_time; /* Beginning of stroke may do some things special */
@@ -3263,12 +3268,14 @@ 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;
-	int *vert_array = data->t_index;
-	int *count = data->count;
 	PBVHVertexIter vd;
 	SculptBrushTest test;
 	SculptOrigVertData orig_data;
 	float(*proxy)[3];
+
+	int *count = ss->cache->d_count;
+	int *vert_array = ss->cache->v_index;
+
 	const float bstrength = ss->cache->bstrength;
 
 	sculpt_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
@@ -3340,7 +3347,7 @@ static void topo_init_task_cb(void *userdata, const int n) {
 			co = vd.co;
 			v_index[it + count[0]] = vd.vert_indices[vd.i];
 
-			float distsq = dist_squared_to_line_direction_v3v3(vd.co, test.location, test.normal);
+			float distsq = dist_squared_to_line_direction_v3v3(vd.co, test.true_location, test.normal);
 			//printf(" dist: %f , ", distsq);
 			if (distsq < t_dis[0]){
 				t_dis[0] = distsq;
@@ -3377,7 +3384,7 @@ int find_connect(SculptSession *ss, int vert, short *ch, int *vert_index, int le
 			int j;
 			for (j = 0; j < ARRAY_SIZE(adj); j += 1) {
 				if (v_map->count != 2 || ss->pmap[adj[j]].count <= 2) {
-					printf("\n v: %d", adj[j]);
+					/* printf("\n v: %d", adj[j]); */
 					find_connect(ss, adj[j], ch, vert_index, len);
 				}
 			}
@@ -3426,46 +3433,51 @@ static void topo_init(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode,
 	
 }
 
-static void do_topo_grab_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
-{
+static void connected_face_init(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode,
+	int *count, int *v_index, float *dis, int *t_index){
 	SculptSession *ss = ob->sculpt;
-	Brush *brush = BKE_paint_brush(&sd->paint);
-	float grab_delta[3];
-
-	copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry);
-
-	if (ss->cache->normal_weight > 0.0f) {
-		sculpt_project_v3_normal_align(ss, ss->cache->normal_weight, grab_delta);
-	}
-	int count[3];  /* count[0] -> totalvertex that can be modified, count[1] -> store central vertex index */
-	int v_index[VERLEN];
-
-	int t_index[VERLEN] = { 0 };
-	float dis[1];   //added new
-
 	topo_init(sd, ob, nodes, totnode, count, v_index, dis, t_index);
-	if (!ss->pmap) {printf("NO!"); return;}
 
 	int vrn = count[1];
 	short ch[VERLEN] = { 0 };
 	find_connect(ss, vrn, ch, v_index, count[0]);
 	int k = 0;
 	loop(ir, 0, count[0], 1){
-		printf(" %d %d\n, ", v_index[ir], ch[ir]);
+		/* printf(" %d %d\n, ", v_index[ir], ch[ir]); */
 		if (ch[ir]){
 			t_index[k] = v_index[ir];
 			k++;
 		}
 	}
 	count[2] = k;
+	printf("\ncount: %d %d %d , dis : %f", count[0], count[1], count[2], dis[0]);
+}
 
-	printf("\ncount: %d %d %d , dis : %f", count[0], count[1], count[2],dis[0]);
+static void do_topo_grab_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
+{
+	SculptSession *ss = ob->sculpt;
+	Brush *brush = BKE_paint_brush(&sd->paint);
+	float grab_delta[3];
+
+	copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry);
+
+	if (ss->cache->normal_weight > 0.0f) {
+		sculpt_project_v3_normal_align(ss, ss->cache->normal_weight, grab_delta);
+	}
+	/*
+	int count[3];  count[0] -> totalvertex that can be modified, count[1] -> store central vertex index 
+	int v_index[VERLEN];
+	int t_index[VERLEN] = { 0 };
+	float dis[1];   //added new
+	*/
+	//connected_face_init(sd, ob, nodes, totnode, count, v_index, dis, t_index);
+	if (!ss->pmap) {printf("NO!"); return;}
 
 	SculptThreadedTaskData data = {
 		.sd = sd, .ob = ob, .brush = brush, .nodes = nodes,
-		.grab_delta = grab_delta, .count = count, .t_index = t_index,
+		.grab_delta = grab_delta, 
 	};
-
+	// .count = count, .t_index = t_index,
 	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);
@@ -4800,6 +4812,28 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, Object *ob,
 	}
 
 	cache->special_rotation = ups->brush_rotation;
+
+	if (brush->sculpt_tool == SCULPT_TOOL_TOPO_GRAB){
+		SculptSession *ss = ob->sculpt;
+		SculptSearchSphereData data;
+		PBVHNode **nodes = NULL;
+		int totnode;
+		data.ss = ss;
+		data.sd = sd;
+		data.radius_squared = ss->cache->radius_squared;
+		data.original = sculpt_tool_needs_original(brush->sculpt_tool) ? true : ss->cache->original;
+		BKE_pbvh_search_gather(ss->pbvh, sculpt_search_sphere_cb, &data, &nodes, &totnode);
+
+		int count[3];  /* count[0] -> totalvertex that can be modified, count[1] -> store central vertex index */
+		int v_index[VERLEN];
+		int t_index[VERLEN] = { 0 };
+		float dis[1];   //added new
+
+		connected_face_init(sd, ob, nodes, totnode, count, v_index, dis, t_index);
+
+		cache->d_count = count;
+		cache->v_index = t_index;
+	}
 }
 
 /* Returns true if any of the smoothing modes are active (currently




More information about the Bf-blender-cvs mailing list