[Bf-blender-cvs] [fe95b6c] soc-2016-pbvh-painting: Brought back traditional blur, renamed new blur to average, and added an average mode.
Nathan Vollmer
noreply at git.blender.org
Sat Jun 25 02:39:13 CEST 2016
Commit: fe95b6c33d8b09ee283bcbeb4aed886247bc368e
Author: Nathan Vollmer
Date: Fri Jun 24 18:39:04 2016 -0600
Branches: soc-2016-pbvh-painting
https://developer.blender.org/rBfe95b6c33d8b09ee283bcbeb4aed886247bc368e
Brought back traditional blur, renamed new blur to average, and added an average mode.
===================================================================
M source/blender/editors/sculpt_paint/paint_vertex.c
M source/blender/editors/sculpt_paint/sculpt_intern.h
M source/blender/makesdna/DNA_brush_types.h
M source/blender/makesrna/intern/rna_brush.c
===================================================================
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 6a4999d..3f895c6 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -771,6 +771,7 @@ static unsigned int vpaint_blend_tool(const int tool, const unsigned int col,
switch (tool) {
case PAINT_BLEND_MIX:
case PAINT_BLEND_BLUR: return mcol_blend(col, paintcol, alpha_i);
+ case PAINT_BLEND_AVERAGE: return mcol_blend(col, paintcol, alpha_i);
case PAINT_BLEND_ADD: return mcol_add(col, paintcol, alpha_i);
case PAINT_BLEND_SUB: return mcol_sub(col, paintcol, alpha_i);
case PAINT_BLEND_MUL: return mcol_mul(col, paintcol, alpha_i);
@@ -3119,6 +3120,11 @@ static void do_vpaint_brush_blur_task_cb_ex(
unsigned int *lcolorig = data->vp->vpaint_prev;
+ int totalHitLoops;
+ unsigned int blend[4] = { 0 };
+ char *col;
+ unsigned int finalColor;
+
//for each vertex
PBVHVertexIter vd;
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
@@ -3130,12 +3136,40 @@ static void do_vpaint_brush_blur_task_cb_ex(
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);
+
+ //Get the average poly color
+ totalHitLoops = 0;
+ finalColor = 0;
+ blend[0] = 0;
+ blend[1] = 0;
+ blend[2] = 0;
+ blend[3] = 0;
+ for (int j = 0; j < cache->vert_to_poly[vertexIndex].count; j++) {
+ int polyIndex = cache->vert_to_poly[vertexIndex].indices[j];
+ MPoly poly = data->me->mpoly[polyIndex];
+ totalHitLoops += poly.totloop;
+ for (int k = 0; k < poly.totloop; k++) {
+ unsigned int loopIndex = poly.loopstart + k;
+ col = (char *)(&lcol[loopIndex]);
+ blend[0] += col[0];
+ blend[1] += col[1];
+ blend[2] += col[2];
+ blend[3] += col[3];
+ }
+ }
+ if (totalHitLoops != 0) {
+ col = (char*)(&finalColor);
+ col[0] = divide_round_i(blend[0], totalHitLoops);
+ col[1] = divide_round_i(blend[1], totalHitLoops);
+ col[2] = divide_round_i(blend[2], totalHitLoops);
+ col[3] = divide_round_i(blend[3], totalHitLoops);
+
+ //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], *((unsigned int*)col), 255.0 * fade * bstrength, 255.0);
+ }
}
}
BKE_pbvh_vertex_iter_end;
@@ -3179,13 +3213,17 @@ static void vpaint_paint_leaves(Sculpt *sd, VPaint *vp, VPaintData *vpd, Object
data.vp = vp;
data.vpd = vpd;
data.lcol = (unsigned int*)me->mloopcol;
+ data.me = me;
- //if (brush->vertexpaint_tool == PAINT_BLEND_BLUR) {
- //do_average_brush(&data, nodes, totnode);
- //}
- if (brush->vertexpaint_tool == PAINT_BLEND_BLUR) {
+ //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) {
+ 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);
}
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index c2d661a..34c98a79 100644
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@ -37,6 +37,7 @@
#include "DNA_vec_types.h"
#include "DNA_key_types.h"
#include "DNA_brush_types.h"
+#include "DNA_mesh_types.h"
#include "DNA_view3d_types.h"
#include "BLI_bitmap.h"
@@ -161,6 +162,7 @@ typedef struct SculptThreadedTaskData {
VPaintData *vpd;
unsigned int* lcol;
MeshElemMap **vertToLoopMaps;
+ Mesh *me;
/* Data specific to some callbacks. */
diff --git a/source/blender/makesdna/DNA_brush_types.h b/source/blender/makesdna/DNA_brush_types.h
index 3dca087..305001d 100644
--- a/source/blender/makesdna/DNA_brush_types.h
+++ b/source/blender/makesdna/DNA_brush_types.h
@@ -317,7 +317,8 @@ enum {
PAINT_BLEND_MUL = 3,
PAINT_BLEND_BLUR = 4,
PAINT_BLEND_LIGHTEN = 5,
- PAINT_BLEND_DARKEN = 6
+ PAINT_BLEND_DARKEN = 6,
+ PAINT_BLEND_AVERAGE = 7
};
typedef enum {
diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c
index ac348c1..855bc7f 100644
--- a/source/blender/makesrna/intern/rna_brush.c
+++ b/source/blender/makesrna/intern/rna_brush.c
@@ -94,6 +94,7 @@ EnumPropertyItem rna_enum_brush_vertex_tool_items[] = {
{PAINT_BLEND_BLUR, "BLUR", ICON_BRUSH_BLUR, "Blur", "Blur the color with surrounding values"},
{PAINT_BLEND_LIGHTEN, "LIGHTEN", ICON_BRUSH_LIGHTEN, "Lighten", "Use lighten blending mode while painting"},
{PAINT_BLEND_DARKEN, "DARKEN", ICON_BRUSH_DARKEN, "Darken", "Use darken blending mode while painting"},
+ {PAINT_BLEND_AVERAGE, "AVERAGE", ICON_BRUSH_BLUR, "Average", "Use average blending mode while painting" },
{0, NULL, 0, NULL, NULL}
};
More information about the Bf-blender-cvs
mailing list