[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