Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/sculpt_paint/paint_vertex.c
| Show First 20 Lines • Show All 2,066 Lines • ▼ Show 20 Lines | |||||
| static void calculate_average_weight(SculptThreadedTaskData *data, | static void calculate_average_weight(SculptThreadedTaskData *data, | ||||
| PBVHNode **UNUSED(nodes), | PBVHNode **UNUSED(nodes), | ||||
| int totnode) | int totnode) | ||||
| { | { | ||||
| struct WPaintAverageAccum *accum = MEM_mallocN(sizeof(*accum) * totnode, __func__); | struct WPaintAverageAccum *accum = MEM_mallocN(sizeof(*accum) * totnode, __func__); | ||||
| data->custom_data = accum; | data->custom_data = accum; | ||||
| TaskParallelSettings settings; | PBVHParallelSettings settings; | ||||
| BKE_pbvh_parallel_range_settings(&settings, (data->sd->flags & SCULPT_USE_OPENMP), totnode); | BKE_pbvh_parallel_range_settings(&settings, (data->sd->flags & SCULPT_USE_OPENMP), totnode); | ||||
| BLI_task_parallel_range(0, totnode, data, do_wpaint_brush_calc_average_weight_cb_ex, &settings); | BKE_pbvh_parallel_range(0, totnode, data, do_wpaint_brush_calc_average_weight_cb_ex, &settings); | ||||
| uint accum_len = 0; | uint accum_len = 0; | ||||
| double accum_weight = 0.0; | double accum_weight = 0.0; | ||||
| for (int i = 0; i < totnode; i++) { | for (int i = 0; i < totnode; i++) { | ||||
| accum_len += accum[i].len; | accum_len += accum[i].len; | ||||
| accum_weight += accum[i].value; | accum_weight += accum[i].value; | ||||
| } | } | ||||
| if (accum_len != 0) { | if (accum_len != 0) { | ||||
| Show All 29 Lines | SculptThreadedTaskData data = { | ||||
| .wpi = wpi, | .wpi = wpi, | ||||
| .me = me, | .me = me, | ||||
| }; | }; | ||||
| /* Use this so average can modify its weight without touching the brush. */ | /* Use this so average can modify its weight without touching the brush. */ | ||||
| data.strength = BKE_brush_weight_get(scene, brush); | data.strength = BKE_brush_weight_get(scene, brush); | ||||
| /* NOTE: current mirroring code cannot be run in parallel */ | /* NOTE: current mirroring code cannot be run in parallel */ | ||||
| TaskParallelSettings settings; | PBVHParallelSettings settings; | ||||
| BKE_pbvh_parallel_range_settings(&settings, !(me->editflag & ME_EDIT_MIRROR_X), totnode); | BKE_pbvh_parallel_range_settings(&settings, !(me->editflag & ME_EDIT_MIRROR_X), totnode); | ||||
| switch ((eBrushWeightPaintTool)brush->weightpaint_tool) { | switch ((eBrushWeightPaintTool)brush->weightpaint_tool) { | ||||
| case WPAINT_TOOL_AVERAGE: | case WPAINT_TOOL_AVERAGE: | ||||
| calculate_average_weight(&data, nodes, totnode); | calculate_average_weight(&data, nodes, totnode); | ||||
| BLI_task_parallel_range(0, totnode, &data, do_wpaint_brush_draw_task_cb_ex, &settings); | BKE_pbvh_parallel_range(0, totnode, &data, do_wpaint_brush_draw_task_cb_ex, &settings); | ||||
| break; | break; | ||||
| case WPAINT_TOOL_SMEAR: | case WPAINT_TOOL_SMEAR: | ||||
| BLI_task_parallel_range(0, totnode, &data, do_wpaint_brush_smear_task_cb_ex, &settings); | BKE_pbvh_parallel_range(0, totnode, &data, do_wpaint_brush_smear_task_cb_ex, &settings); | ||||
| break; | break; | ||||
| case WPAINT_TOOL_BLUR: | case WPAINT_TOOL_BLUR: | ||||
| BLI_task_parallel_range(0, totnode, &data, do_wpaint_brush_blur_task_cb_ex, &settings); | BKE_pbvh_parallel_range(0, totnode, &data, do_wpaint_brush_blur_task_cb_ex, &settings); | ||||
| break; | break; | ||||
| case WPAINT_TOOL_DRAW: | case WPAINT_TOOL_DRAW: | ||||
| BLI_task_parallel_range(0, totnode, &data, do_wpaint_brush_draw_task_cb_ex, &settings); | BKE_pbvh_parallel_range(0, totnode, &data, do_wpaint_brush_draw_task_cb_ex, &settings); | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| static PBVHNode **vwpaint_pbvh_gather_generic( | static PBVHNode **vwpaint_pbvh_gather_generic( | ||||
| Object *ob, VPaint *wp, Sculpt *sd, Brush *brush, int *r_totnode) | Object *ob, VPaint *wp, Sculpt *sd, Brush *brush, int *r_totnode) | ||||
| { | { | ||||
| SculptSession *ss = ob->sculpt; | SculptSession *ss = ob->sculpt; | ||||
| ▲ Show 20 Lines • Show All 974 Lines • ▼ Show 20 Lines | |||||
| static void calculate_average_color(SculptThreadedTaskData *data, | static void calculate_average_color(SculptThreadedTaskData *data, | ||||
| PBVHNode **UNUSED(nodes), | PBVHNode **UNUSED(nodes), | ||||
| int totnode) | int totnode) | ||||
| { | { | ||||
| struct VPaintAverageAccum *accum = MEM_mallocN(sizeof(*accum) * totnode, __func__); | struct VPaintAverageAccum *accum = MEM_mallocN(sizeof(*accum) * totnode, __func__); | ||||
| data->custom_data = accum; | data->custom_data = accum; | ||||
| TaskParallelSettings settings; | PBVHParallelSettings settings; | ||||
| BKE_pbvh_parallel_range_settings(&settings, true, totnode); | BKE_pbvh_parallel_range_settings(&settings, true, totnode); | ||||
| BLI_task_parallel_range(0, totnode, data, do_vpaint_brush_calc_average_color_cb_ex, &settings); | BKE_pbvh_parallel_range(0, totnode, data, do_vpaint_brush_calc_average_color_cb_ex, &settings); | ||||
| uint accum_len = 0; | uint accum_len = 0; | ||||
| uint accum_value[3] = {0}; | uint accum_value[3] = {0}; | ||||
| uchar blend[4] = {0}; | uchar blend[4] = {0}; | ||||
| for (int i = 0; i < totnode; i++) { | for (int i = 0; i < totnode; i++) { | ||||
| accum_len += accum[i].len; | accum_len += accum[i].len; | ||||
| accum_value[0] += accum[i].value[0]; | accum_value[0] += accum[i].value[0]; | ||||
| accum_value[1] += accum[i].value[1]; | accum_value[1] += accum[i].value[1]; | ||||
| Show All 27 Lines | SculptThreadedTaskData data = { | ||||
| .ob = ob, | .ob = ob, | ||||
| .brush = brush, | .brush = brush, | ||||
| .nodes = nodes, | .nodes = nodes, | ||||
| .vp = vp, | .vp = vp, | ||||
| .vpd = vpd, | .vpd = vpd, | ||||
| .lcol = (uint *)me->mloopcol, | .lcol = (uint *)me->mloopcol, | ||||
| .me = me, | .me = me, | ||||
| }; | }; | ||||
| TaskParallelSettings settings; | PBVHParallelSettings settings; | ||||
| BKE_pbvh_parallel_range_settings(&settings, true, totnode); | BKE_pbvh_parallel_range_settings(&settings, true, totnode); | ||||
| switch ((eBrushVertexPaintTool)brush->vertexpaint_tool) { | switch ((eBrushVertexPaintTool)brush->vertexpaint_tool) { | ||||
| case VPAINT_TOOL_AVERAGE: | case VPAINT_TOOL_AVERAGE: | ||||
| calculate_average_color(&data, nodes, totnode); | calculate_average_color(&data, nodes, totnode); | ||||
| BLI_task_parallel_range(0, totnode, &data, do_vpaint_brush_draw_task_cb_ex, &settings); | BKE_pbvh_parallel_range(0, totnode, &data, do_vpaint_brush_draw_task_cb_ex, &settings); | ||||
| break; | break; | ||||
| case VPAINT_TOOL_BLUR: | case VPAINT_TOOL_BLUR: | ||||
| BLI_task_parallel_range(0, totnode, &data, do_vpaint_brush_blur_task_cb_ex, &settings); | BKE_pbvh_parallel_range(0, totnode, &data, do_vpaint_brush_blur_task_cb_ex, &settings); | ||||
| break; | break; | ||||
| case VPAINT_TOOL_SMEAR: | case VPAINT_TOOL_SMEAR: | ||||
| BLI_task_parallel_range(0, totnode, &data, do_vpaint_brush_smear_task_cb_ex, &settings); | BKE_pbvh_parallel_range(0, totnode, &data, do_vpaint_brush_smear_task_cb_ex, &settings); | ||||
| break; | break; | ||||
| case VPAINT_TOOL_DRAW: | case VPAINT_TOOL_DRAW: | ||||
| BLI_task_parallel_range(0, totnode, &data, do_vpaint_brush_draw_task_cb_ex, &settings); | BKE_pbvh_parallel_range(0, totnode, &data, do_vpaint_brush_draw_task_cb_ex, &settings); | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| static void vpaint_do_paint(bContext *C, | static void vpaint_do_paint(bContext *C, | ||||
| Sculpt *sd, | Sculpt *sd, | ||||
| VPaint *vp, | VPaint *vp, | ||||
| struct VPaintData *vpd, | struct VPaintData *vpd, | ||||
| ▲ Show 20 Lines • Show All 240 Lines • Show Last 20 Lines | |||||