Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/sculpt_paint/sculpt_filter_mask.c
| Show First 20 Lines • Show All 206 Lines • ▼ Show 20 Lines | static int sculpt_mask_filter_exec(bContext *C, wmOperator *op) | ||||
| if (!ob->sculpt->pmap) { | if (!ob->sculpt->pmap) { | ||||
| return OPERATOR_CANCELLED; | return OPERATOR_CANCELLED; | ||||
| } | } | ||||
| int num_verts = SCULPT_vertex_count_get(ss); | int num_verts = SCULPT_vertex_count_get(ss); | ||||
| BKE_pbvh_search_gather(pbvh, NULL, NULL, &nodes, &totnode); | BKE_pbvh_search_gather(pbvh, NULL, NULL, &nodes, &totnode); | ||||
| SCULPT_undo_push_begin("Mask filter"); | SCULPT_undo_push_begin(C, "Mask filter"); | ||||
| for (int i = 0; i < totnode; i++) { | for (int i = 0; i < totnode; i++) { | ||||
| SCULPT_undo_push_node(ob, nodes[i], SCULPT_UNDO_MASK); | SCULPT_undo_push_node(ob, nodes[i], SCULPT_UNDO_MASK); | ||||
| } | } | ||||
| float *prev_mask = NULL; | float *prev_mask = NULL; | ||||
| int iterations = RNA_int_get(op->ptr, "iterations"); | int iterations = RNA_int_get(op->ptr, "iterations"); | ||||
| Show All 27 Lines | for (int i = 0; i < iterations; i++) { | ||||
| if (ELEM(filter_type, MASK_FILTER_GROW, MASK_FILTER_SHRINK)) { | if (ELEM(filter_type, MASK_FILTER_GROW, MASK_FILTER_SHRINK)) { | ||||
| MEM_freeN(prev_mask); | MEM_freeN(prev_mask); | ||||
| } | } | ||||
| } | } | ||||
| MEM_SAFE_FREE(nodes); | MEM_SAFE_FREE(nodes); | ||||
| SCULPT_undo_push_end(); | SCULPT_undo_push_end(C); | ||||
| SCULPT_tag_update_overlays(C); | SCULPT_tag_update_overlays(C); | ||||
| return OPERATOR_FINISHED; | return OPERATOR_FINISHED; | ||||
| } | } | ||||
| void SCULPT_mask_filter_smooth_apply( | void SCULPT_mask_filter_smooth_apply( | ||||
| Sculpt *sd, Object *ob, PBVHNode **nodes, const int totnode, const int smooth_iterations) | Sculpt *sd, Object *ob, PBVHNode **nodes, const int totnode, const int smooth_iterations) | ||||
| ▲ Show 20 Lines • Show All 167 Lines • ▼ Show 20 Lines | static int sculpt_dirty_mask_exec(bContext *C, wmOperator *op) | ||||
| SCULPT_vertex_random_access_ensure(ss); | SCULPT_vertex_random_access_ensure(ss); | ||||
| if (!ob->sculpt->pmap) { | if (!ob->sculpt->pmap) { | ||||
| return OPERATOR_CANCELLED; | return OPERATOR_CANCELLED; | ||||
| } | } | ||||
| BKE_pbvh_search_gather(pbvh, NULL, NULL, &nodes, &totnode); | BKE_pbvh_search_gather(pbvh, NULL, NULL, &nodes, &totnode); | ||||
| SCULPT_undo_push_begin("Dirty Mask"); | SCULPT_undo_push_begin(C, "Dirty Mask"); | ||||
| for (int i = 0; i < totnode; i++) { | for (int i = 0; i < totnode; i++) { | ||||
| SCULPT_undo_push_node(ob, nodes[i], SCULPT_UNDO_MASK); | SCULPT_undo_push_node(ob, nodes[i], SCULPT_UNDO_MASK); | ||||
| } | } | ||||
| SculptThreadedTaskData data = { | SculptThreadedTaskData data = { | ||||
| .sd = sd, | .sd = sd, | ||||
| .ob = ob, | .ob = ob, | ||||
| Show All 16 Lines | static int sculpt_dirty_mask_exec(bContext *C, wmOperator *op) | ||||
| data.dirty_mask_min = range.min; | data.dirty_mask_min = range.min; | ||||
| data.dirty_mask_max = range.max; | data.dirty_mask_max = range.max; | ||||
| BLI_task_parallel_range(0, totnode, &data, dirty_mask_apply_task_cb, &settings); | BLI_task_parallel_range(0, totnode, &data, dirty_mask_apply_task_cb, &settings); | ||||
| MEM_SAFE_FREE(nodes); | MEM_SAFE_FREE(nodes); | ||||
| BKE_pbvh_update_vertex_data(pbvh, PBVH_UpdateMask); | BKE_pbvh_update_vertex_data(pbvh, PBVH_UpdateMask); | ||||
| SCULPT_undo_push_end(); | SCULPT_undo_push_end(C); | ||||
| ED_region_tag_redraw(region); | ED_region_tag_redraw(region); | ||||
| WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); | WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); | ||||
| return OPERATOR_FINISHED; | return OPERATOR_FINISHED; | ||||
| } | } | ||||
| Show All 17 Lines | |||||