[Bf-blender-cvs] [ac28364] soc-2016-pbvh-painting: Commented out some old code which made the average brush slow. Created a vert to poly map for the blur brush.
Nathan Vollmer
noreply at git.blender.org
Fri Jun 24 21:15:00 CEST 2016
Commit: ac28364e8bdbd20b033e47430fa6ddd00f965b08
Author: Nathan Vollmer
Date: Fri Jun 24 13:14:54 2016 -0600
Branches: soc-2016-pbvh-painting
https://developer.blender.org/rBac28364e8bdbd20b033e47430fa6ddd00f965b08
Commented out some old code which made the average brush slow. Created a vert to poly map for the blur brush.
===================================================================
M source/blender/editors/sculpt_paint/paint_vertex.c
M source/blender/editors/sculpt_paint/sculpt_intern.h
===================================================================
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index d3f7f09..6a4999d 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -2776,11 +2776,10 @@ static int vpaint_mode_toggle_exec(bContext *C, wmOperator *op)
/* If the cache is not released by a cancel or a done, free it now. */
if (ob->sculpt->cache){
- if (ob->sculpt->cache->vert_to_loop) {
- printf("Freeing vert to loop\n");
- MEM_freeN(ob->sculpt->cache->vert_to_loop);
- MEM_freeN(ob->sculpt->cache->map_mem);
- }
+ MEM_freeN(ob->sculpt->cache->vert_to_loop);
+ MEM_freeN(ob->sculpt->cache->map_mem);
+ MEM_freeN(ob->sculpt->cache->vert_to_poly);
+ MEM_freeN(ob->sculpt->cache->poly_map_mem);
MEM_freeN(ob->sculpt->cache->totloopsHit);
MEM_freeN(ob->sculpt->cache->totalRed);
MEM_freeN(ob->sculpt->cache->totalGreen);
@@ -2818,17 +2817,18 @@ static int vpaint_mode_toggle_exec(bContext *C, wmOperator *op)
/* Cache needs to be initialized before mesh_build_data is called. */
ob->sculpt->cache = MEM_callocN(sizeof(StrokeCache), "stroke cache");
- printf("Creating vert to loop\n");
- if (!ob->sculpt->cache->vert_to_loop) {
- Mesh *me = ob->data;
- ob->sculpt->cache->tot_verts = me->totvert;
- ob->sculpt->cache->verts = me->mvert;
- ob->sculpt->cache->map_mem = NULL;
- ob->sculpt->cache->vert_to_loop = NULL;
- BKE_mesh_vert_loop_map_create(&ob->sculpt->cache->vert_to_loop, &ob->sculpt->cache->map_mem, me->mpoly, me->mloop, me->totvert, me->totpoly, me->totloop);
- }
-
-
+ /* Create maps */
+ Mesh *me = ob->data;
+ ob->sculpt->cache->tot_verts = me->totvert;
+ ob->sculpt->cache->verts = me->mvert;
+ ob->sculpt->cache->map_mem = NULL;
+ ob->sculpt->cache->vert_to_loop = NULL;
+ ob->sculpt->cache->poly_map_mem = NULL;
+ ob->sculpt->cache->vert_to_poly = NULL;
+ BKE_mesh_vert_loop_map_create(&ob->sculpt->cache->vert_to_loop, &ob->sculpt->cache->map_mem, me->mpoly, me->mloop, me->totvert, me->totpoly, me->totloop);
+ BKE_mesh_vert_poly_map_create(&ob->sculpt->cache->vert_to_poly, &ob->sculpt->cache->poly_map_mem, me->mpoly, me->mloop, me->totvert, me->totpoly, me->totloop);
+
+
Brush *brush = BKE_paint_brush(&vp->paint);
int totNode = 0;
//I think the totNodes might include internal nodes, and we really only need the tot leaves.
@@ -3026,78 +3026,6 @@ static void vpaint_paint_poly(VPaint *vp, VPaintData *vpd, Mesh *me,
}
}
-static void vpaint_paint_loop(VPaint *vp, VPaintData *vpd, Mesh *me,
- const unsigned int index, const float brush_size_pressure, const float brush_alpha_pressure)
-{
- ViewContext *vc = &vpd->vc;
- Brush *brush = BKE_paint_brush(&vp->paint);
- MPoly *mpoly = &me->mpoly[index];
- MLoop *ml;
- unsigned int *lcol = (unsigned int*)me->mloopcol;
- unsigned int *lcolorig = (unsigned int *)vp->vpaint_prev;
- bool *mlooptag = (vpd->mlooptag) ? vpd->mlooptag : NULL;
- float alpha;
- int brush_alpha_pressure_i = (int)(brush_alpha_pressure * 255.0f);
-
-
- //Looks like by default, older vertex paint would average all the old vertices colors together.
- //I need to calculate this average outside this function.
-
- //if (brush->vertexpaint_tool == PAINT_BLEND_BLUR) {
- // unsigned int blend[4] = { 0 };
- // unsigned int tcol;
- // char *col;
-
- // //for (j = 0; j < totloop; j++) {
- // //col = (char *)(lcol[index]);
- // //blend[0] += col[0]/10;
- // //blend[1] += col[1]/10;
- // //blend[2] += col[2]/10;
- // //blend[3] += col[3]/10;
- //// }
-
- // //blend[0] = divide_round_i(blend[0], totloop);
- // //blend[1] = divide_round_i(blend[1], totloop);
- // //blend[2] = divide_round_i(blend[2], totloop);
- // //blend[3] = divide_round_i(blend[3], totloop);
- // col = (char *)&tcol;
- // col[0] = blend[0];
- // col[1] = blend[1];
- // col[2] = blend[2];
- // col[3] = blend[3];
-
- // vpd->paintcol = *((unsigned int *)col);
- //}
-
- //ml = me->mloop + mpoly->loopstart;
-
- float rgba[4];
- unsigned int paintcol;
-
- //Still need to determine how this function works
-
- alpha = 1;// calc_vp_alpha_col_dl(vp, vc, vpd->vpimat,
- //&vpd->vertexcosnos[ml->v], mval,
- //brush_size_pressure, brush_alpha_pressure, rgba);
-
- if (vpd->is_texbrush) {
- float rgba_br[3];
- rgb_uchar_to_float(rgba_br, (const unsigned char *)&vpd->paintcol);
- mul_v3_v3(rgba_br, rgba);
- rgb_float_to_uchar((unsigned char *)&paintcol, rgba_br);
- }
- else
- paintcol = vpd->paintcol;
-
- if (alpha > 0.0f) {
- const int alpha_i = (int)(alpha * 255.0f);
- lcol[index] = vpaint_blend(vp, lcol[index], lcolorig[index], paintcol, alpha_i, brush_alpha_pressure_i);
-
- //Still need to determine what mlooptag is used for.
- //if (mlooptag) mlooptag[i] = 1;
- }
-}
-
static void do_vpaint_brush_calc_ave_color_cb_ex(
void *userdata, void *UNUSED(userdata_chunk), const int n, const int thread_id) {
SculptThreadedTaskData *data = userdata;
@@ -3112,16 +3040,14 @@ static void do_vpaint_brush_calc_ave_color_cb_ex(
//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)
{
- 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)) {
+ if (sculpt_brush_test_fast(&test, vd.co)) {
if (BKE_brush_curve_strength(data->brush, test.dist, cache->radius) > 0.0) {
- data->ob->sculpt->cache->colorWeight[n] = BKE_brush_curve_strength(data->brush, test.dist, cache->radius);
-
int vertexIndex = vd.vert_indices[vd.i];
data->ob->sculpt->cache->totloopsHit[n] += cache->vert_to_loop[vertexIndex].count;
@@ -3180,7 +3106,44 @@ static void do_vpaint_brush_draw_task_cb_ex(
}
}
-static void do_average_brush(SculptThreadedTaskData *data, PBVHNode **nodes, int totnode) {
+static void do_vpaint_brush_blur_task_cb_ex(
+ void *userdata, void *UNUSED(userdata_chunk), const int n, const int thread_id)
+{
+ SculptThreadedTaskData *data = userdata;
+ SculptSession *ss = data->ob->sculpt;
+ Brush *brush = data->brush;
+ StrokeCache *cache = ss->cache;
+ const float bstrength = cache->bstrength;
+
+ unsigned int *lcol = data->lcol;
+
+ unsigned int *lcolorig = data->vp->vpaint_prev;
+
+ //for each vertex
+ PBVHVertexIter vd;
+ BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
+ {
+ 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)) {
+ const float fade = BKE_brush_curve_strength(brush, test.dist, cache->radius);
+ int vertexIndex = vd.vert_indices[vd.i];
+
+ //if a vertex is within the brush region, then paint each loop that vertex owns.
+ for (int j = 0; j < cache->vert_to_loop[vertexIndex].count; ++j) {
+ int loopIndex = cache->vert_to_loop[vertexIndex].indices[j];
+ //Mix the new color with the original based on the brush strength and the curve.
+ lcol[loopIndex] = vpaint_blend(data->vp, lcol[loopIndex], lcolorig[loopIndex], data->vpd->paintcol, 255.0 * fade * bstrength, 255.0);
+ }
+ }
+ BKE_pbvh_vertex_iter_end;
+ }
+}
+
+
+static void calculate_average_color(SculptThreadedTaskData *data, PBVHNode **nodes, int totnode) {
BLI_task_parallel_range_ex(
0, totnode, data, NULL, 0, do_vpaint_brush_calc_ave_color_cb_ex,
((data->sd->flags & SCULPT_USE_OPENMP) && totnode > SCULPT_THREADED_LIMIT), false);
@@ -3217,13 +3180,20 @@ static void vpaint_paint_leaves(Sculpt *sd, VPaint *vp, VPaintData *vpd, Object
data.vpd = vpd;
data.lcol = (unsigned int*)me->mloopcol;
+ //if (brush->vertexpaint_tool == PAINT_BLEND_BLUR) {
+ //do_average_brush(&data, nodes, totnode);
+ //}
if (brush->vertexpaint_tool == PAINT_BLEND_BLUR) {
- do_average_brush(&data, nodes, totnode);
+ calculate_average_color(&data, nodes, totnode);
+ BLI_task_parallel_range_ex(
+ 0, totnode, &data, NULL, 0, do_vpaint_brush_blur_task_cb_ex,
+ ((sd->flags & SCULPT_USE_OPENMP) && totnode > SCULPT_THREADED_LIMIT), false);
+ }
+ else {
+ 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);
}
-
- 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);
}
@@ -3304,9 +3274,9 @@ static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
swap_m4m4(vc->rv3d->persmat, mat);
/* was disabled because it is slow, but necessary for blur */
- if (brush->vertexpaint_tool == PAINT_BLEND_BLUR) {
+ /*if (brush->vertexpaint_tool == PAINT_BLEND_BLUR) {
do_shared_vertexcol(me, vpd->mlooptag);
- }
+ }*/
/* calculate pivot for rotation around seletion if needed */
if (U.uiflag & USER_ORBIT_SELECTION) {
@@ -3390,6 +3360,22 @@ static int vpaint_exec(bContext *C, wmOperator *op)
static void vpaint_cancel(bContext *C, wmOperator *op)
{
+ Object *ob = CTX_data_active_object(C);
+ if (ob->sculpt->cache){
+ MEM_freeN(ob->sculpt->cache->vert_to_loop);
+ MEM_freeN(ob->sculpt->cache->map_mem);
+ MEM_freeN(ob->sculpt->cache->vert_to_poly);
+ MEM_freeN(ob->sculpt->cache->poly_map_mem);
+ MEM_freeN(ob->sculpt->cache->totloopsHit);
+ MEM_freeN(ob->sculpt->cache->totalRed);
+ MEM_freeN(ob->sculpt->cache->totalGreen);
+ MEM_freeN(ob->sculpt->cache->totalBlue);
+ MEM_freeN(ob->sculpt->cache->totalAlpha);
+ MEM_freeN(ob->sculpt->cache->colorWeight);
+ sculpt_cache_free(ob->sculpt->cache);
+ ob->sculpt->cache = NULL;
+ }
+
paint_stroke_cancel(C, op);
}
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index c0545a3..c2d661a 100644
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@ -135,6 +135,95 @@ struct SculptRakeData {
float follow_co[3];
};
+/** \name SculptProjectVector
+*
+* Fast-path for #project_plane_v3_v3v3
+*
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list