[Bf-blender-cvs] [0f00ede65c] soc-2016-pbvh-painting: Fixed vertex selection being ignored.

Nathan Vollmer noreply at git.blender.org
Tue Jan 10 06:19:06 CET 2017


Commit: 0f00ede65ccaefadfec28fb71cd1699329b5b365
Author: Nathan Vollmer
Date:   Mon Jan 9 22:18:59 2017 -0700
Branches: soc-2016-pbvh-painting
https://developer.blender.org/rB0f00ede65ccaefadfec28fb71cd1699329b5b365

Fixed vertex selection being ignored.

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

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

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

diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 96858b203a..f0e275a00d 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -2415,39 +2415,43 @@ static void do_wpaint_brush_draw_task_cb_ex(
 		sculpt_brush_test_init(ss, &test);
 		if (sculpt_brush_test(&test, vd.co)) {
 			const int vertexIndex = vd.vert_indices[vd.i];
-			const float dot = dot_vf3vs3(cache->sculpt_normal_symm, vd.no);
-			const float fade = BKE_brush_curve_strength(brush, test.dist, cache->radius);
-			const float brush_alpha_value = BKE_brush_alpha_get(scene, brush);
-			const float brush_alpha_pressure =
-			brush_alpha_value * (BKE_brush_use_alpha_pressure(scene, brush) ? ss->cache->pressure : 1.0f);
-			float actualStrength = bstrength * fade * dot * brush_alpha_pressure;
-			float currentWeight;
-
-			/* Spray logic */
-			if (!(data->vp->flag & VP_SPRAY)) {
-				MDeformVert *dv = &data->me->dvert[vertexIndex];
-				MDeformWeight *dw;
-				dw = (data->vp->flag & VP_ONLYVGROUP) ? defvert_find_index(dv, data->wpi->active.index) :
-				                                        defvert_verify_index(dv, data->wpi->active.index);
-				currentWeight = dw->weight;
-				if (ss->max_weight[vertexIndex] < 0) {
-					ss->max_weight[vertexIndex] = min_ff(bstrength + dw->weight, 1.0f);
-				}
-				CLAMP(actualStrength, 0.0, ss->max_weight[vertexIndex] - dw->weight);
-			}
-
-			/* Splash Prevention */
-			if (dot > 0.0){
-				switch (data->vp->flag) {
-					case VP_SPRAY:
-						if (currentWeight < ss->max_weight[vertexIndex])
-							do_weight_paint_vertex(data->vp, data->ob, data->wpi, vertexIndex, actualStrength, paintweight);
-						break;
-					default:
-						do_weight_paint_vertex(data->vp, data->ob, data->wpi, vertexIndex, actualStrength, paintweight);
-						break;
-				}
-			}
+      MVert v = data->me->mvert[vertexIndex];
+      /* If the vertex is selected */
+      if (v.flag & 1) {
+			  const float dot = dot_vf3vs3(cache->sculpt_normal_symm, vd.no);
+			  const float fade = BKE_brush_curve_strength(brush, test.dist, cache->radius);
+			  const float brush_alpha_value = BKE_brush_alpha_get(scene, brush);
+			  const float brush_alpha_pressure =
+			  brush_alpha_value * (BKE_brush_use_alpha_pressure(scene, brush) ? ss->cache->pressure : 1.0f);
+			  float actualStrength = bstrength * fade * dot * brush_alpha_pressure;
+			  float currentWeight;
+
+			  /* Spray logic */
+			  if (!(data->vp->flag & VP_SPRAY)) {
+				  MDeformVert *dv = &data->me->dvert[vertexIndex];
+				  MDeformWeight *dw;
+				  dw = (data->vp->flag & VP_ONLYVGROUP) ? defvert_find_index(dv, data->wpi->active.index) :
+				                                          defvert_verify_index(dv, data->wpi->active.index);
+				  currentWeight = dw->weight;
+				  if (ss->max_weight[vertexIndex] < 0) {
+					  ss->max_weight[vertexIndex] = min_ff(bstrength + dw->weight, 1.0f);
+				  }
+				  CLAMP(actualStrength, 0.0, ss->max_weight[vertexIndex] - dw->weight);
+			  }
+
+			  /* Splash Prevention */
+			  if (dot > 0.0){
+				  switch (data->vp->flag) {
+					  case VP_SPRAY:
+						  if (currentWeight < ss->max_weight[vertexIndex])
+							  do_weight_paint_vertex(data->vp, data->ob, data->wpi, vertexIndex, actualStrength, paintweight);
+						  break;
+					  default:
+						  do_weight_paint_vertex(data->vp, data->ob, data->wpi, vertexIndex, actualStrength, paintweight);
+						  break;
+				  }
+			  }
+      }
 		}
 		BKE_pbvh_vertex_iter_end;
 	}
@@ -2477,17 +2481,20 @@ static void do_wpaint_brush_calc_ave_weight_cb_ex(
 			float dot = dot_vf3vs3(cache->sculpt_normal_symm, vd.no);
 			if (dot > 0.0 && BKE_brush_curve_strength(data->brush, test.dist, cache->radius) > 0.0) {
 				int vertexIndex = vd.vert_indices[vd.i];
-
-				ss->tot_loops_hit[n] += ss->vert_to_loop[vertexIndex].count;
-				/* if a vertex is within the brush region, then add it's weight to the total weight. */
-				for (int j = 0; j < ss->vert_to_loop[vertexIndex].count; ++j) {
-					int loopIndex = ss->vert_to_loop[vertexIndex].indices[j];
-
-					MLoop loop = data->me->mloop[loopIndex];
-					MDeformVert *dv = &data->me->dvert[loop.v];
-					MDeformWeight *dw = defvert_verify_index(dv, data->wpi->active.index);
-					weight += dw->weight;
-				}
+        MVert v = data->me->mvert[vertexIndex];
+        /* If the vertex is selected. */
+        if (v.flag & 1) {
+				  ss->tot_loops_hit[n] += ss->vert_to_loop[vertexIndex].count;
+				  /* if a vertex is within the brush region, then add it's weight to the total weight. */
+				  for (int j = 0; j < ss->vert_to_loop[vertexIndex].count; ++j) {
+					  int loopIndex = ss->vert_to_loop[vertexIndex].indices[j];
+
+					  MLoop loop = data->me->mloop[loopIndex];
+					  MDeformVert *dv = &data->me->dvert[loop.v];
+					  MDeformWeight *dw = defvert_verify_index(dv, data->wpi->active.index);
+					  weight += dw->weight;
+				  }
+        }
 			}
 		}
 		BKE_pbvh_vertex_iter_end;
@@ -3072,16 +3079,19 @@ static void do_vpaint_brush_calc_ave_color_cb_ex(
 		if (sculpt_brush_test_fast(&test, vd.co)) {
 			if (BKE_brush_curve_strength(data->brush, test.dist, cache->radius) > 0.0) {
 				int vertexIndex = vd.vert_indices[vd.i];
-
-				ss->tot_loops_hit[n] += ss->vert_to_loop[vertexIndex].count;
-				/* if a vertex is within the brush region, then add it's color to the blend. */
-				for (int j = 0; j < ss->vert_to_loop[vertexIndex].count; ++j) {
-					int loopIndex = ss->vert_to_loop[vertexIndex].indices[j];
-					col = (char *)(&lcol[loopIndex]);
-					/* Color is squared to compensate the sqrt color encoding. */
-					blend[0] += (long)col[0] * (long)col[0];
-					blend[1] += (long)col[1] * (long)col[1];
-					blend[2] += (long)col[2] * (long)col[2];
+				/* If the vertex is selected for painting. */
+				MVert v = data->me->mvert[vertexIndex];
+				if (v.flag & 1) {
+					ss->tot_loops_hit[n] += ss->vert_to_loop[vertexIndex].count;
+					/* if a vertex is within the brush region, then add it's color to the blend. */
+					for (int j = 0; j < ss->vert_to_loop[vertexIndex].count; ++j) {
+						int loopIndex = ss->vert_to_loop[vertexIndex].indices[j];
+						col = (char *)(&lcol[loopIndex]);
+						/* Color is squared to compensate the sqrt color encoding. */
+						blend[0] += (long)col[0] * (long)col[0];
+						blend[1] += (long)col[1] * (long)col[1];
+						blend[2] += (long)col[2] * (long)col[2];
+					}
 				}
 			}
 		}
@@ -3130,37 +3140,39 @@ static void do_vpaint_brush_draw_task_cb_ex(
 	{
 		SculptBrushTest test;
 		sculpt_brush_test_init(ss, &test);
-
 		/* Test to see if the vertex coordinates are within the spherical brush region. */
 		if (sculpt_brush_test(&test, vd.co)) {
 			int vertexIndex = vd.vert_indices[vd.i];
-			const float dot = dot_vf3vs3(cache->sculpt_normal_symm, vd.no);
-			const float fade = BKE_brush_curve_strength(brush, test.dist, cache->radius);
-			unsigned int actualColor = data->vpd->paintcol;
-
-			float alpha = 1.0;
-			if (data->vpd->is_texbrush) {
-				handle_texture_brush(data, vd, &alpha, &actualColor, brush_size_pressure, brush_alpha_pressure);
-			}
+			/* If the vertex is selected for painting. */
+			MVert v = data->me->mvert[vertexIndex];
+			if (v.flag & 1) {
+				const float dot = dot_vf3vs3(cache->sculpt_normal_symm, vd.no);
+				const float fade = BKE_brush_curve_strength(brush, test.dist, cache->radius);
+				unsigned int actualColor = data->vpd->paintcol;
 
-			if (dot > 0.0)
-				/* if a vertex is within the brush region, then paint each loop that vertex owns. */
-				for (int j = 0; j < ss->vert_to_loop[vertexIndex].count; ++j) {
-					int loopIndex = ss->vert_to_loop[vertexIndex].indices[j];
+				float alpha = 1.0;
+				if (data->vpd->is_texbrush) {
+					handle_texture_brush(data, vd, &alpha, &actualColor, brush_size_pressure, brush_alpha_pressure);
+				}
 
-					/* Previous color logic */
-					if (ss->previous_color[loopIndex] == 0) {
-						ss->previous_color[loopIndex] = lcol[loopIndex];
+				if (dot > 0.0) {
+					/* if a vertex is within the brush region, then paint each loop that vertex owns. */
+					for (int j = 0; j < ss->vert_to_loop[vertexIndex].count; ++j) {
+						int loopIndex = ss->vert_to_loop[vertexIndex].indices[j];
+						/* Previous color logic */
+						if (ss->previous_color[loopIndex] == 0) {
+							ss->previous_color[loopIndex] = lcol[loopIndex];
+						}
+						/* Mix the new color with the original based on the brush strength and the curve. */
+						lcol[loopIndex] = vpaint_blend(data->vp, lcol[loopIndex], ss->previous_color[loopIndex], actualColor,
+								255 * fade * bstrength * dot * alpha * brush_alpha_pressure, 255.0*bstrength);
 					}
-
-					/* Mix the new color with the original based on the brush strength and the curve. */
-					lcol[loopIndex] = vpaint_blend(data->vp, lcol[loopIndex], ss->previous_color[loopIndex], actualColor,
-						255 * fade * bstrength * dot * alpha * brush_alpha_pressure, 255.0*bstrength);
 				}
 			}
-			BKE_pbvh_vertex_iter_end;
 		}
+		BKE_pbvh_vertex_iter_end;
 	}
+}
 
 static void do_vpaint_brush_blur_task_cb_ex(
 	void *userdata, void *UNUSED(userdata_chunk), const int n, const int UNUSED(thread_id))
@@ -3189,46 +3201,49 @@ static void do_vpaint_brush_blur_task_cb_ex(
 			if (dot > 0.0){
 				const float fade = BKE_brush_curve_strength(brush, test.dist, cache->radius);
 				int vertexIndex = vd.vert_indices[vd.i];
-
-				/* Get the average poly color */
-				total_hit_loops = 0;
-				finalColor = 0;
-				blend[0] = 0;
-				blend[1] = 0;
-				blend[2] = 0;
-				blend[3] = 0;
-				for (int j = 0; j < ss->vert_to_poly[vertexIndex].count; j++) {
-					int polyIndex = ss->vert_to_poly[vertexIndex].indices[j];
-					MPoly poly = data->me->mpoly[polyIndex];
-					total_hit_loops += poly.totloop;
-					for (int k = 0; k < poly.totloop; k++) {
-						unsigned int loopIndex = poly.loopstart + k;
-						col = (char *)(&lcol[loopIndex]);
-						/* Color is squared to compensate the sqrt color encoding. */
-						blend[0] += (unsigned int)col[0] * (unsigned int)col[0];
-						blend[1] += (unsigned int)col[1] * (unsigned int)col[1];
-						blend

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list