[Bf-blender-cvs] [48402da] soc-2016-pbvh-painting: Working on speeding up wpaint somemore. Added average brush. Average brush is now a default tool option for weight and vertex paint.
Nathan Vollmer
noreply at git.blender.org
Mon Jul 18 05:40:39 CEST 2016
Commit: 48402da8f170642c92f489293d1200957bbd8145
Author: Nathan Vollmer
Date: Sun Jul 17 21:40:38 2016 -0600
Branches: soc-2016-pbvh-painting
https://developer.blender.org/rB48402da8f170642c92f489293d1200957bbd8145
Working on speeding up wpaint somemore. Added average brush. Average brush is now a default tool option for weight and vertex paint.
===================================================================
M source/blender/blenkernel/BKE_paint.h
M source/blender/blenkernel/intern/paint.c
M source/blender/blenloader/intern/versioning_defaults.c
M source/blender/editors/sculpt_paint/paint_vertex.c
M source/blender/makesrna/intern/rna_brush.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index 30d6450..5d563c5 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -209,7 +209,7 @@ typedef struct SculptSession {
unsigned int* totalGreen;
unsigned int* totalBlue;
unsigned int* totalAlpha;
- unsigned int* colorWeight;
+ double* totalWeight;
unsigned int *totloopsHit;
} SculptSession;
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index b3982dc..722b573 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -730,8 +730,8 @@ void BKE_sculptsession_free(Object *ob)
MEM_freeN(ob->sculpt->totalBlue);
if (ob->sculpt->totalAlpha)
MEM_freeN(ob->sculpt->totalAlpha);
- if (ob->sculpt->colorWeight)
- MEM_freeN(ob->sculpt->colorWeight);
+ if (ob->sculpt->totalWeight)
+ MEM_freeN(ob->sculpt->totalWeight);
MEM_freeN(ss);
diff --git a/source/blender/blenloader/intern/versioning_defaults.c b/source/blender/blenloader/intern/versioning_defaults.c
index ad7a3c5..fd26aab 100644
--- a/source/blender/blenloader/intern/versioning_defaults.c
+++ b/source/blender/blenloader/intern/versioning_defaults.c
@@ -94,6 +94,18 @@ void BLO_update_defaults_startup_blend(Main *bmain)
sculpt->detail_size = 12;
}
+ if (ts->vpaint)
+ {
+ VPaint *vp = ts->vpaint;
+ vp->radial_symm[0] = vp->radial_symm[1] = vp->radial_symm[2] = 1;
+ }
+
+ if (ts->wpaint)
+ {
+ VPaint *wp = ts->wpaint;
+ wp->radial_symm[0] = wp->radial_symm[1] = wp->radial_symm[2] = 1;
+ }
+
if (ts->gp_sculpt.brush[0].size == 0) {
GP_BrushEdit_Settings *gset = &ts->gp_sculpt;
GP_EditBrush_Data *brush;
@@ -256,6 +268,13 @@ void BLO_update_defaults_startup_blend(Main *bmain)
if (br) {
br->alpha = 1.0f;
}
+
+ br = (Brush *)BKE_libblock_find_name_ex(bmain, ID_BR, "Average");
+ if (!br) {
+ br = BKE_brush_add(bmain, "Average", OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT);
+ br->vertexpaint_tool = PAINT_BLEND_AVERAGE;
+ br->ob_mode = OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT;
+ }
}
}
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 30e9bf7..d158c85 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -966,6 +966,7 @@ static float wpaint_blend_tool(const int tool,
{
switch (tool) {
case PAINT_BLEND_MIX:
+ case PAINT_BLEND_AVERAGE:
case PAINT_BLEND_BLUR: return wval_blend(weight, paintval, alpha);
case PAINT_BLEND_ADD: return wval_add(weight, paintval, alpha);
case PAINT_BLEND_SUB: return wval_sub(weight, paintval, alpha);
@@ -1568,7 +1569,6 @@ static void do_weight_paint_vertex_single(
//Needs surrounded with 'if spray mode or not painted before'
dw->weight = wpaint_blend(wp, dw->weight, alpha, paintweight,
wpi->brush_alpha_value, wpi->do_flip);
-
/* WATCH IT: take care of the ordering of applying mirror -> normalize,
* can give wrong results [#26193], least confusing if normalize is done last */
@@ -1762,7 +1762,7 @@ static void vertex_paint_init_session_average_arrays(Object *ob){
ob->sculpt->totalGreen = MEM_callocN(totNode * sizeof(unsigned int), "totalGreen");
ob->sculpt->totalBlue = MEM_callocN(totNode * sizeof(unsigned int), "totalBlue");
ob->sculpt->totalAlpha = MEM_callocN(totNode * sizeof(unsigned int), "totalAlpha");
- ob->sculpt->colorWeight = MEM_callocN(totNode * sizeof(unsigned int), "colorWeight");
+ ob->sculpt->totalWeight = MEM_callocN(totNode * sizeof(double), "totalWeight");
ob->sculpt->totloopsHit = MEM_callocN(totNode * sizeof(unsigned int), "totloopsHit");
}
@@ -1818,7 +1818,6 @@ static int wpaint_mode_toggle_exec(bContext *C, wmOperator *op)
if (wp == NULL)
wp = scene->toolsettings->wpaint = new_vpaint(1);
- wp->radial_symm[0] = wp->radial_symm[1] = wp->radial_symm[2] = 1;
paint_cursor_start(C, weight_paint_poll);
BKE_paint_init(scene, ePaintWeight, PAINT_CURSOR_WEIGHT_PAINT);
@@ -2421,7 +2420,6 @@ static void do_wpaint_brush_draw_task_cb_ex(
Brush *brush = data->brush;
StrokeCache *cache = ss->cache;
const float bstrength = cache->bstrength;
-
float paintweight = BKE_brush_weight_get(scene, brush);
//for each vertex
@@ -2441,6 +2439,69 @@ static void do_wpaint_brush_draw_task_cb_ex(
}
}
+static void do_wpaint_brush_calc_ave_weight_cb_ex(
+ void *userdata, void *UNUSED(userdata_chunk), const int n, const int thread_id) {
+ SculptThreadedTaskData *data = userdata;
+ SculptSession *ss = data->ob->sculpt;
+ StrokeCache *cache = ss->cache;
+
+ double weight = 0.0;
+
+ data->ob->sculpt->totloopsHit[n] = 0.0;
+ data->ob->sculpt->totalWeight[n] = 0.0;
+
+ //for each vertex
+ PBVHVertexIter vd;
+
+ SculptBrushTest test;
+ sculpt_brush_test_init(ss, &test);
+ BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
+ {
+ //Test to see if the vertex coordinates are within the spherical brush region.
+ 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->totloopsHit[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;
+ }
+ data->ob->sculpt->totalWeight[n] = weight;
+}
+
+static void calculate_average_weight(SculptThreadedTaskData *data, PBVHNode **nodes, int totnode) {
+ Scene *scene = CTX_data_scene(data->C);
+ UnifiedPaintSettings *ups = &scene->toolsettings->unified_paint_settings;
+ BLI_task_parallel_range_ex(
+ 0, totnode, data, NULL, 0, do_wpaint_brush_calc_ave_weight_cb_ex,
+ ((data->sd->flags & SCULPT_USE_OPENMP) && totnode > SCULPT_THREADED_LIMIT), false);
+
+ unsigned int totalHitLoops = 0;
+ double totalWeight = 0.0;
+ for (int i = 0; i < totnode; ++i) {
+ totalHitLoops += data->ob->sculpt->totloopsHit[i];
+ totalWeight += data->ob->sculpt->totalWeight[i];
+ }
+ if (totalHitLoops != 0) {
+ totalWeight /= totalHitLoops;
+ if (ups->flag & UNIFIED_PAINT_WEIGHT)
+ ups->weight = (float)totalWeight;
+ else
+ data->brush->weight = (float)totalWeight;
+ }
+}
+
+
static void wpaint_paint_leaves(bContext *C, Object *ob, Sculpt *sd, VPaint *vp, WPaintData *wpd, WeightPaintInfo *wpi, Mesh *me, PBVHNode **nodes, int totnode)
{
Brush *brush = ob->sculpt->cache->brush;//BKE_paint_brush(&sd->paint);
@@ -2458,14 +2519,13 @@ static void wpaint_paint_leaves(bContext *C, Object *ob, Sculpt *sd, VPaint *vp,
data.C = C;
//This might change to a case switch.
- //if (brush->vertexpaint_tool == PAINT_BLEND_AVERAGE) {
- // calculate_average_color(&data, nodes, totnode);
- // BLI_task_parallel_range_ex(
- // 0, totnode, &data, NULL, 0, do_vpaint_brush_draw_task_cb_ex,
- // ((sd->flags & SCULPT_USE_OPENMP) && totnode > SCULPT_THREADED_LIMIT), false);
- //}
- //else
- if (brush->vertexpaint_tool == PAINT_BLEND_BLUR) {
+ if (brush->vertexpaint_tool == PAINT_BLEND_AVERAGE) {
+ calculate_average_weight(&data, nodes, totnode);
+ BLI_task_parallel_range_ex(
+ 0, totnode, &data, NULL, 0, do_wpaint_brush_draw_task_cb_ex,
+ ((sd->flags & SCULPT_USE_OPENMP) && totnode > SCULPT_THREADED_LIMIT), false);
+ }
+ else if (brush->vertexpaint_tool == PAINT_BLEND_BLUR) {
BLI_task_parallel_range_ex(
0, totnode, &data, NULL, 0, do_wpaint_brush_blur_task_cb_ex,
((true & SCULPT_USE_OPENMP) && totnode > SCULPT_THREADED_LIMIT), false);
@@ -2513,22 +2573,26 @@ static void wpaint_do_symmetrical_brush_actions(bContext *C, Object *ob, VPaint
SculptSession *ss = ob->sculpt;
StrokeCache *cache = ss->cache;
const char symm = wp->paint.symmetry_flags & PAINT_SYMM_AXIS_ALL;
- int i;
+ int i = 0;
+
+ /* initial stroke */
+ wpaint_do_radial_symmetry(C, ob, wp, sd, wpd, wpi, me, brush, i, 'X');
cache->symmetry = symm;
/* symm is a bit combination of XYZ - 1 is mirror X; 2 is Y; 3 is XY; 4 is Z; 5 is XZ; 6 is YZ; 7 is XYZ */
- for (i = 0; i <= symm; ++i) {
- if (i == 0 || (symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5)))) {
+ for (i = 1; i <= symm; ++i) {
+ if ((symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5)))) {
cache->mirror_symmetry_pass = i;
cache->radial_symmetry_pass = 0;
-
calc_brushdata_symm(wp, cache, i, 0, 0);
- wpaint_do_radial_symmetry(C, ob, wp, sd, wpd, wpi, me, brush, i, 'X');
- if (i != 0) {
+
+ if (i & 1 << 0)
+ wpaint_do_radial_symmetry(C, ob, wp, sd, wpd, wpi, me, brush, i, 'X');
+ if (i & 1 << 1)
wpaint_do_radial_symmetry(C, ob, wp, sd, wpd, wpi, me, brush, i, 'Y');
+ if (i & 1 << 2)
wpaint_do_radial_symmetry(C, ob, wp, sd, wpd, wpi, me, brush, i, 'Z');
- }
}
}
}
@@ -3011,7 +3075,7 @@ static int vpaint_mode_toggle_exec(bContext *C, wmOperator *op)
if (vp == NULL)
vp = scene->toolsettings->vpaint = new_vpaint(0);
- vp->radial_symm[0] = vp->radial_symm[1] = vp->radial_symm[2] = 1;
+
paint_cursor_start(C, vertex_paint_poll);
BKE_paint_init(scene, ePaintVertex, PAINT_CURSOR_VERTEX_PAINT);
@@ -3466,23 +3530,26 @@ static void vpaint_do_symmetrical_brush_actions(Sculpt *sd, VPaint *vd, VPaintDa
SculptSession *ss = ob->sculpt;
StrokeCache *cache = ss->cache;
const char symm = vd->paint.symmetry_flags & PAINT_SYMM_AXIS_ALL;
- int i;
+ int i = 0;
+
+ /* initial stroke */
+ vpain
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list