[Bf-blender-cvs] [175a6b2] master: Solve partial redraw issues in sculpting.

Antony Riakiotakis noreply at git.blender.org
Thu Mar 6 15:32:11 CET 2014


Commit: 175a6b2fcec4df86c4cf2502da450e4fe77c90d7
Author: Antony Riakiotakis
Date:   Thu Mar 6 16:30:16 2014 +0200
https://developer.blender.org/rB175a6b2fcec4df86c4cf2502da450e4fe77c90d7

Solve partial redraw issues in sculpting.

* Do union with previous partial redraw before overwriting with self and
store unmodified new rect to avoid rect getting bigger.
* Make rect one pixel wider instead of smaller so edges do not get left
outside. Overall this looks quite better.

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

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 5d4037a..51fd899 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -1421,7 +1421,7 @@ static float bmesh_neighbor_average_mask(BMesh *bm, BMVert *v)
 	}
 }
 
-static void do_mesh_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *node, float bstrength, int smooth_mask)
+static void do_mesh_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *node, float bstrength, int smooth_mask, float (*proxy)[3])
 {
 	Brush *brush = BKE_paint_brush(&sd->paint);
 	PBVHVertexIter vd;
@@ -1450,9 +1450,7 @@ static void do_mesh_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *node,
 				sub_v3_v3v3(val, avg, vd.co);
 				mul_v3_fl(val, fade);
 
-				add_v3_v3(val, vd.co);
-
-				sculpt_clip(sd, ss, vd.co, val);
+				sculpt_clip(sd, ss, proxy[vd.i], val);
 			}
 
 			if (vd.mvert)
@@ -1462,7 +1460,7 @@ static void do_mesh_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *node,
 	BKE_pbvh_vertex_iter_end;
 }
 
-static void do_bmesh_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *node, float bstrength, int smooth_mask)
+static void do_bmesh_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *node, float bstrength, int smooth_mask, float (*proxy)[3])
 {
 	Brush *brush = BKE_paint_brush(&sd->paint);
 	PBVHVertexIter vd;
@@ -1491,9 +1489,7 @@ static void do_bmesh_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *node,
 				sub_v3_v3v3(val, avg, vd.co);
 				mul_v3_fl(val, fade);
 
-				add_v3_v3(val, vd.co);
-
-				sculpt_clip(sd, ss, vd.co, val);
+				sculpt_clip(sd, ss, proxy[vd.i], val);
 			}
 
 			if (vd.mvert)
@@ -1504,7 +1500,7 @@ static void do_bmesh_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *node,
 }
 
 static void do_multires_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *node,
-                                     float bstrength, int smooth_mask)
+									 float bstrength, int smooth_mask, float (*proxy)[3])
 {
 	Brush *brush = BKE_paint_brush(&sd->paint);
 	SculptBrushTest test;
@@ -1517,6 +1513,7 @@ static void do_multires_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *no
 	int thread_num;
 	BLI_bitmap **grid_hidden;
 	int *grid_indices, totgrid, gridsize, i, x, y;
+	int proxyindex = 0;
 
 	sculpt_brush_test_init(ss, &test);
 
@@ -1602,6 +1599,10 @@ static void do_multires_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *no
 				float *fno;
 				float *mask;
 				int index;
+				int proxyindex_local;
+
+				/* store locally here because we may not get a chance to increase later */
+				proxyindex_local = proxyindex++;
 
 				if (gh) {
 					if (BLI_BITMAP_GET(gh, y * gridsize + x))
@@ -1651,9 +1652,7 @@ static void do_multires_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *no
 						sub_v3_v3v3(val, avg, co);
 						mul_v3_fl(val, fade);
 
-						add_v3_v3(val, co);
-
-						sculpt_clip(sd, ss, co, val);
+						sculpt_clip(sd, ss, proxy[proxyindex_local], val);
 					}
 				}
 			}
@@ -1665,44 +1664,34 @@ static void smooth(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode,
                    float bstrength, int smooth_mask)
 {
 	SculptSession *ss = ob->sculpt;
-	const int max_iterations = 4;
-	const float fract = 1.0f / max_iterations;
 	PBVHType type = BKE_pbvh_type(ss->pbvh);
-	int iteration, n, count;
-	float last;
+	int n;
 
 	CLAMP(bstrength, 0, 1);
 
-	count = (int)(bstrength * max_iterations);
-	last  = max_iterations * (bstrength - count * fract);
-
 	if (type == PBVH_FACES && !ss->pmap) {
 		BLI_assert(!"sculpt smooth: pmap missing");
 		return;
 	}
 
-	for (iteration = 0; iteration <= count; ++iteration) {
-		float strength = (iteration != count) ? 1.0f : last;
-
 #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
-		for (n = 0; n < totnode; n++) {
-			switch (type) {
-				case PBVH_GRIDS:
-					do_multires_smooth_brush(sd, ss, nodes[n], strength,
-					                         smooth_mask);
-					break;
-				case PBVH_FACES:
-					do_mesh_smooth_brush(sd, ss, nodes[n], strength,
-					                     smooth_mask);
-					break;
-				case PBVH_BMESH:
-					do_bmesh_smooth_brush(sd, ss, nodes[n], strength, smooth_mask);
-					break;
-			}
-		}
+	for (n = 0; n < totnode; n++) {
+		float (*proxy)[3];
+		proxy = BKE_pbvh_node_add_proxy(ss->pbvh, nodes[n])->co;
 
-		if (ss->multires)
-			multires_stitch_grids(ob);
+		switch (type) {
+			case PBVH_GRIDS:
+				do_multires_smooth_brush(sd, ss, nodes[n], bstrength,
+										 smooth_mask, proxy);
+				break;
+			case PBVH_FACES:
+				do_mesh_smooth_brush(sd, ss, nodes[n], bstrength,
+									 smooth_mask, proxy);
+				break;
+			case PBVH_BMESH:
+				do_bmesh_smooth_brush(sd, ss, nodes[n], bstrength, smooth_mask, proxy);
+				break;
+		}
 	}
 }
 
@@ -3279,7 +3268,7 @@ static void sculpt_combine_proxies(Sculpt *sd, Object *ob)
 	BKE_pbvh_gather_proxies(ss->pbvh, &nodes, &totnode);
 
 	/* first line is tools that don't support proxies */
-	if (!ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_LAYER) ||
+	if ((brush->sculpt_tool != SCULPT_TOOL_LAYER) ||
 	    ss->cache->supports_gravity)
 	{
 		/* these brushes start from original coordinates */
@@ -3327,6 +3316,9 @@ static void sculpt_combine_proxies(Sculpt *sd, Object *ob)
 
 			BKE_pbvh_node_free_proxies(nodes[n]);
 		}
+
+		if (ss->multires && brush->sculpt_tool == SCULPT_TOOL_SMOOTH)
+			multires_stitch_grids(ob);
 	}
 
 	if (nodes)
@@ -3358,8 +3350,8 @@ static void sculpt_flush_stroke_deform(Sculpt *sd, Object *ob)
 	SculptSession *ss = ob->sculpt;
 	Brush *brush = BKE_paint_brush(&sd->paint);
 
-	if (ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_LAYER)) {
-		/* this brushes aren't using proxies, so sculpt_combine_proxies() wouldn't
+	if (brush->sculpt_tool == SCULPT_TOOL_LAYER) {
+		/* this brushes doesn't use proxies, so sculpt_combine_proxies() wouldn't
 		 * propagate needed deformation to original base */
 
 		int n, totnode;
@@ -4413,15 +4405,16 @@ static void sculpt_flush_update(bContext *C)
 		sculpt_update_object_bounding_box(ob);
 
 		if (sculpt_get_redraw_rect(ar, CTX_wm_region_view3d(C), ob, &r)) {
-			if (ss->cache)
-				ss->cache->previous_r = r;
-
+			rcti tmp = r;
 			sculpt_extend_redraw_rect_previous(ob, &r);
 
-			r.xmin += ar->winrct.xmin + 1;
-			r.xmax += ar->winrct.xmin - 1;
-			r.ymin += ar->winrct.ymin + 1;
-			r.ymax += ar->winrct.ymin - 1;
+			if (ss->cache)
+				ss->cache->previous_r = tmp;
+
+			r.xmin += ar->winrct.xmin - 1;
+			r.xmax += ar->winrct.xmin + 1;
+			r.ymin += ar->winrct.ymin - 1;
+			r.ymax += ar->winrct.ymin + 1;
 
 			ss->partial_redraw = 1;
 			ED_region_tag_redraw_partial(ar, &r);




More information about the Bf-blender-cvs mailing list