Cleanup: Sculpt: Store auto-masking cache in unique_ptr

This commit is contained in:
Hans Goudey
2024-01-19 13:44:42 -05:00
parent 0163a92cca
commit 02342aee0c
15 changed files with 169 additions and 144 deletions

View File

@@ -2411,7 +2411,7 @@ float SCULPT_brush_strength_factor(
avg *= 1.0f - mask;
/* Auto-masking. */
avg *= auto_mask::factor_get(cache->automasking, ss, vertex, automask_data);
avg *= auto_mask::factor_get(cache->automasking.get(), ss, vertex, automask_data);
return avg;
}
@@ -2447,7 +2447,7 @@ void SCULPT_brush_strength_color(
/* Auto-masking. */
const float automasking_factor = auto_mask::factor_get(
cache->automasking, ss, vertex, automask_data);
cache->automasking.get(), ss, vertex, automask_data);
const float masks_combined = falloff * paint_mask * automasking_factor;
@@ -3362,7 +3362,8 @@ static void do_brush_action(Sculpt *sd,
/* Initialize auto-masking cache. */
if (auto_mask::is_enabled(sd, ss, brush)) {
ss->cache->automasking = auto_mask::cache_init(sd, brush, ob);
ss->last_automasking_settings_hash = auto_mask::settings_hash(ob, ss->cache->automasking);
ss->last_automasking_settings_hash = auto_mask::settings_hash(*ob,
*ss->cache->automasking);
}
/* Initialize surface smooth cache. */
if ((brush->sculpt_tool == SCULPT_TOOL_SMOOTH) &&
@@ -5599,10 +5600,6 @@ static void sculpt_stroke_done(const bContext *C, PaintStroke * /*stroke*/)
brush = BKE_paint_brush(&sd->paint);
}
if (auto_mask::is_enabled(sd, ss, brush)) {
auto_mask::cache_free(ss->cache->automasking);
}
BKE_pbvh_node_color_buffer_free(ss->pbvh);
SCULPT_cache_free(ss->cache);
ss->cache = nullptr;

View File

@@ -55,10 +55,10 @@ namespace blender::ed::sculpt_paint::auto_mask {
Cache *active_cache_get(SculptSession *ss)
{
if (ss->cache) {
return ss->cache->automasking;
return ss->cache->automasking.get();
}
if (ss->filter_cache) {
return ss->filter_cache->automasking;
return ss->filter_cache->automasking.get();
}
return nullptr;
}
@@ -225,12 +225,12 @@ static float calc_brush_normal_factor(Cache *automasking,
automask_data);
}
static float calc_view_normal_factor(Cache *automasking,
static float calc_view_normal_factor(Cache &automasking,
SculptSession *ss,
PBVHVertRef vertex,
const NodeData &automask_data)
{
float falloff = automasking->settings.view_normal_falloff * M_PI;
float falloff = automasking.settings.view_normal_falloff * M_PI;
float3 view_normal;
@@ -244,12 +244,12 @@ static float calc_view_normal_factor(Cache *automasking,
return normal_calc(ss,
vertex,
view_normal,
automasking->settings.view_normal_limit,
automasking->settings.view_normal_limit + falloff,
automasking.settings.view_normal_limit,
automasking.settings.view_normal_limit + falloff,
automask_data);
}
static float calc_view_occlusion_factor(Cache *automasking,
static float calc_view_occlusion_factor(Cache &automasking,
SculptSession *ss,
PBVHVertRef vertex,
uchar stroke_id,
@@ -257,7 +257,7 @@ static float calc_view_occlusion_factor(Cache *automasking,
{
char f = *(char *)SCULPT_vertex_attr_get(vertex, ss->attrs.automasking_occlusion);
if (stroke_id != automasking->current_stroke_id) {
if (stroke_id != automasking.current_stroke_id) {
f = *(char *)SCULPT_vertex_attr_get(
vertex,
ss->attrs.automasking_occlusion) = SCULPT_vertex_is_occluded(ss, vertex, true) ? 2 : 1;
@@ -437,48 +437,49 @@ static void calc_blurred_cavity(SculptSession *ss,
*(float *)SCULPT_vertex_attr_get(vertex, ss->attrs.automasking_cavity) = factor_sum;
}
int settings_hash(Object *ob, Cache *automasking)
int settings_hash(const Object &ob, const Cache &automasking)
{
SculptSession *ss = ob->sculpt;
const SculptSession *ss = ob.sculpt;
int hash;
int totvert = SCULPT_vertex_count_get(ss);
hash = BLI_hash_int(automasking->settings.flags);
hash = BLI_hash_int(automasking.settings.flags);
hash = BLI_hash_int_2d(hash, totvert);
if (automasking->settings.flags & BRUSH_AUTOMASKING_CAVITY_ALL) {
hash = BLI_hash_int_2d(hash, automasking->settings.cavity_blur_steps);
hash = BLI_hash_int_2d(hash, *reinterpret_cast<uint *>(&automasking->settings.cavity_factor));
if (automasking.settings.flags & BRUSH_AUTOMASKING_CAVITY_ALL) {
hash = BLI_hash_int_2d(hash, automasking.settings.cavity_blur_steps);
hash = BLI_hash_int_2d(hash,
*reinterpret_cast<const uint *>(&automasking.settings.cavity_factor));
if (automasking->settings.cavity_curve) {
CurveMap *cm = automasking->settings.cavity_curve->cm;
if (automasking.settings.cavity_curve) {
CurveMap *cm = automasking.settings.cavity_curve->cm;
for (int i = 0; i < cm->totpoint; i++) {
hash = BLI_hash_int_2d(hash, *reinterpret_cast<uint *>(&cm->curve[i].x));
hash = BLI_hash_int_2d(hash, *reinterpret_cast<uint *>(&cm->curve[i].y));
hash = BLI_hash_int_2d(hash, *reinterpret_cast<const uint *>(&cm->curve[i].x));
hash = BLI_hash_int_2d(hash, *reinterpret_cast<const uint *>(&cm->curve[i].y));
hash = BLI_hash_int_2d(hash, uint(cm->curve[i].flag));
hash = BLI_hash_int_2d(hash, uint(cm->curve[i].shorty));
}
}
}
if (automasking->settings.flags & BRUSH_AUTOMASKING_FACE_SETS) {
hash = BLI_hash_int_2d(hash, automasking->settings.initial_face_set);
if (automasking.settings.flags & BRUSH_AUTOMASKING_FACE_SETS) {
hash = BLI_hash_int_2d(hash, automasking.settings.initial_face_set);
}
if (automasking->settings.flags & BRUSH_AUTOMASKING_VIEW_NORMAL) {
hash = BLI_hash_int_2d(hash,
*reinterpret_cast<uint *>(&automasking->settings.view_normal_falloff));
hash = BLI_hash_int_2d(hash,
*reinterpret_cast<uint *>(&automasking->settings.view_normal_limit));
if (automasking.settings.flags & BRUSH_AUTOMASKING_VIEW_NORMAL) {
hash = BLI_hash_int_2d(
hash, *reinterpret_cast<const uint *>(&automasking.settings.view_normal_falloff));
hash = BLI_hash_int_2d(
hash, *reinterpret_cast<const uint *>(&automasking.settings.view_normal_limit));
}
if (automasking->settings.flags & BRUSH_AUTOMASKING_BRUSH_NORMAL) {
hash = BLI_hash_int_2d(hash,
*reinterpret_cast<uint *>(&automasking->settings.start_normal_falloff));
hash = BLI_hash_int_2d(hash,
*reinterpret_cast<uint *>(&automasking->settings.start_normal_limit));
if (automasking.settings.flags & BRUSH_AUTOMASKING_BRUSH_NORMAL) {
hash = BLI_hash_int_2d(
hash, *reinterpret_cast<const uint *>(&automasking.settings.start_normal_falloff));
hash = BLI_hash_int_2d(
hash, *reinterpret_cast<const uint *>(&automasking.settings.start_normal_limit));
}
return hash;
@@ -545,7 +546,8 @@ float factor_get(Cache *automasking,
bool do_occlusion = (automasking->settings.flags &
(BRUSH_AUTOMASKING_VIEW_OCCLUSION | BRUSH_AUTOMASKING_VIEW_NORMAL)) ==
(BRUSH_AUTOMASKING_VIEW_OCCLUSION | BRUSH_AUTOMASKING_VIEW_NORMAL);
if (do_occlusion && calc_view_occlusion_factor(automasking, ss, vert, stroke_id, *automask_data))
if (do_occlusion &&
calc_view_occlusion_factor(*automasking, ss, vert, stroke_id, *automask_data))
{
return automasking_factor_end(ss, automasking, vert, 0.0f);
}
@@ -582,7 +584,7 @@ float factor_get(Cache *automasking,
if ((ss->cache || ss->filter_cache) &&
(automasking->settings.flags & BRUSH_AUTOMASKING_VIEW_NORMAL))
{
mask *= calc_view_normal_factor(automasking, ss, vert, *automask_data);
mask *= calc_view_normal_factor(*automasking, ss, vert, *automask_data);
}
if (automasking->settings.flags & BRUSH_AUTOMASKING_CAVITY_ALL) {
@@ -594,11 +596,7 @@ float factor_get(Cache *automasking,
void cache_free(Cache *automasking)
{
if (!automasking) {
return;
}
MEM_SAFE_FREE(automasking);
MEM_delete(automasking);
}
struct AutomaskFloodFillData {
@@ -676,7 +674,7 @@ static void init_boundary_masking(Object *ob, eBoundaryAutomaskMode mode, int pr
SculptSession *ss = ob->sculpt;
const int totvert = SCULPT_vertex_count_get(ss);
int *edge_distance = (int *)MEM_callocN(sizeof(int) * totvert, "automask_factor");
Array<int> edge_distance(totvert, 0);
for (int i : IndexRange(totvert)) {
PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i);
@@ -725,33 +723,31 @@ static void init_boundary_masking(Object *ob, eBoundaryAutomaskMode mode, int pr
*(float *)SCULPT_vertex_attr_get(
vertex, ss->attrs.automasking_factor) *= (1.0f - edge_boundary_automask);
}
MEM_SAFE_FREE(edge_distance);
}
static void cache_settings_update(Cache *automasking, SculptSession *ss, Sculpt *sd, Brush *brush)
static void cache_settings_update(Cache &automasking, SculptSession *ss, Sculpt *sd, Brush *brush)
{
automasking->settings.flags = calc_effective_bits(sd, brush);
automasking->settings.initial_face_set = face_set::active_face_set_get(ss);
automasking.settings.flags = calc_effective_bits(sd, brush);
automasking.settings.initial_face_set = face_set::active_face_set_get(ss);
automasking->settings.view_normal_limit = sd->automasking_view_normal_limit;
automasking->settings.view_normal_falloff = sd->automasking_view_normal_falloff;
automasking->settings.start_normal_limit = sd->automasking_start_normal_limit;
automasking->settings.start_normal_falloff = sd->automasking_start_normal_falloff;
automasking.settings.view_normal_limit = sd->automasking_view_normal_limit;
automasking.settings.view_normal_falloff = sd->automasking_view_normal_falloff;
automasking.settings.start_normal_limit = sd->automasking_start_normal_limit;
automasking.settings.start_normal_falloff = sd->automasking_start_normal_falloff;
if (brush && (brush->automasking_flags & BRUSH_AUTOMASKING_CAVITY_ALL)) {
automasking->settings.cavity_curve = brush->automasking_cavity_curve;
automasking->settings.cavity_factor = brush->automasking_cavity_factor;
automasking->settings.cavity_blur_steps = brush->automasking_cavity_blur_steps;
automasking.settings.cavity_curve = brush->automasking_cavity_curve;
automasking.settings.cavity_factor = brush->automasking_cavity_factor;
automasking.settings.cavity_blur_steps = brush->automasking_cavity_blur_steps;
}
else {
automasking->settings.cavity_curve = sd->automasking_cavity_curve;
automasking->settings.cavity_factor = sd->automasking_cavity_factor;
automasking->settings.cavity_blur_steps = sd->automasking_cavity_blur_steps;
automasking.settings.cavity_curve = sd->automasking_cavity_curve;
automasking.settings.cavity_factor = sd->automasking_cavity_factor;
automasking.settings.cavity_blur_steps = sd->automasking_cavity_blur_steps;
}
}
static void normal_occlusion_automasking_fill(Cache *automasking,
static void normal_occlusion_automasking_fill(Cache &automasking,
Object *ob,
eAutomasking_flag mode)
{
@@ -792,7 +788,7 @@ bool tool_can_reuse_automask(int sculpt_tool)
SCULPT_TOOL_DRAW_FACE_SETS);
}
Cache *cache_init(Sculpt *sd, Brush *brush, Object *ob)
std::unique_ptr<Cache> cache_init(Sculpt *sd, Brush *brush, Object *ob)
{
SculptSession *ss = ob->sculpt;
const int totvert = SCULPT_vertex_count_get(ss);
@@ -801,8 +797,8 @@ Cache *cache_init(Sculpt *sd, Brush *brush, Object *ob)
return nullptr;
}
Cache *automasking = (Cache *)MEM_callocN(sizeof(Cache), "automasking cache");
cache_settings_update(automasking, ss, sd, brush);
std::unique_ptr<Cache> automasking = std::make_unique<Cache>();
cache_settings_update(*automasking, ss, sd, brush);
SCULPT_boundary_info_ensure(ob);
automasking->current_stroke_id = ss->stroke_id;
@@ -858,7 +854,7 @@ Cache *cache_init(Sculpt *sd, Brush *brush, Object *ob)
(mode & BRUSH_AUTOMASKING_VIEW_NORMAL);
if (brush && auto_mask::tool_can_reuse_automask(brush->sculpt_tool) && !have_occlusion) {
int hash = settings_hash(ob, automasking);
int hash = settings_hash(*ob, *automasking);
if (hash == ss->last_automasking_settings_hash) {
automasking->current_stroke_id = ss->last_automask_stroke_id;
@@ -938,7 +934,7 @@ Cache *cache_init(Sculpt *sd, Brush *brush, Object *ob)
(BRUSH_AUTOMASKING_VIEW_NORMAL | BRUSH_AUTOMASKING_VIEW_OCCLUSION);
if (normal_bits) {
normal_occlusion_automasking_fill(automasking, ob, (eAutomasking_flag)normal_bits);
normal_occlusion_automasking_fill(*automasking, ob, (eAutomasking_flag)normal_bits);
}
return automasking;

View File

@@ -659,7 +659,8 @@ static void do_boundary_brush_bend_task(Object *ob, const Brush *brush, PBVHNode
angle_factor = floorf(angle_factor * 10) / 10.0f;
}
const float angle = angle_factor * M_PI;
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (boundary->edit_info[vd.index].propagation_steps_num == -1) {
@@ -675,7 +676,7 @@ static void do_boundary_brush_bend_task(Object *ob, const Brush *brush, PBVHNode
const float mask = 1.0f - vd.mask;
const float automask = auto_mask::factor_get(
ss->cache->automasking, ss, vd.vertex, &automask_data);
ss->cache->automasking.get(), ss, vd.vertex, &automask_data);
float t_orig_co[3];
float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd);
sub_v3_v3v3(t_orig_co, orig_data.co, boundary->bend.pivot_positions[vd.index]);
@@ -702,7 +703,8 @@ static void do_boundary_brush_slide_task(Object *ob, const Brush *brush, PBVHNod
SCULPT_orig_vert_data_init(&orig_data, ob, node, undo::Type::Position);
const float disp = sculpt_boundary_displacement_from_grab_delta_get(ss, boundary);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (boundary->edit_info[vd.index].propagation_steps_num == -1) {
@@ -718,7 +720,7 @@ static void do_boundary_brush_slide_task(Object *ob, const Brush *brush, PBVHNod
const float mask = 1.0f - vd.mask;
const float automask = auto_mask::factor_get(
ss->cache->automasking, ss, vd.vertex, &automask_data);
ss->cache->automasking.get(), ss, vd.vertex, &automask_data);
float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd);
madd_v3_v3v3fl(target_co,
orig_data.co,
@@ -741,7 +743,8 @@ static void do_boundary_brush_inflate_task(Object *ob, const Brush *brush, PBVHN
PBVHVertexIter vd;
SculptOrigVertData orig_data;
SCULPT_orig_vert_data_init(&orig_data, ob, node, undo::Type::Position);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
const float disp = sculpt_boundary_displacement_from_grab_delta_get(ss, boundary);
@@ -759,7 +762,7 @@ static void do_boundary_brush_inflate_task(Object *ob, const Brush *brush, PBVHN
const float mask = 1.0f - vd.mask;
const float automask = auto_mask::factor_get(
ss->cache->automasking, ss, vd.vertex, &automask_data);
ss->cache->automasking.get(), ss, vd.vertex, &automask_data);
float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd);
madd_v3_v3v3fl(target_co,
orig_data.co,
@@ -782,7 +785,8 @@ static void do_boundary_brush_grab_task(Object *ob, const Brush *brush, PBVHNode
PBVHVertexIter vd;
SculptOrigVertData orig_data;
SCULPT_orig_vert_data_init(&orig_data, ob, node, undo::Type::Position);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (boundary->edit_info[vd.index].propagation_steps_num == -1) {
@@ -798,7 +802,7 @@ static void do_boundary_brush_grab_task(Object *ob, const Brush *brush, PBVHNode
const float mask = 1.0f - vd.mask;
const float automask = auto_mask::factor_get(
ss->cache->automasking, ss, vd.vertex, &automask_data);
ss->cache->automasking.get(), ss, vd.vertex, &automask_data);
float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd);
madd_v3_v3v3fl(target_co,
orig_data.co,
@@ -820,7 +824,8 @@ static void do_boundary_brush_twist_task(Object *ob, const Brush *brush, PBVHNod
PBVHVertexIter vd;
SculptOrigVertData orig_data;
SCULPT_orig_vert_data_init(&orig_data, ob, node, undo::Type::Position);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
const float disp = strength * sculpt_boundary_displacement_from_grab_delta_get(ss, boundary);
float angle_factor = disp / ss->cache->radius;
@@ -844,7 +849,7 @@ static void do_boundary_brush_twist_task(Object *ob, const Brush *brush, PBVHNod
const float mask = 1.0f - vd.mask;
const float automask = auto_mask::factor_get(
ss->cache->automasking, ss, vd.vertex, &automask_data);
ss->cache->automasking.get(), ss, vd.vertex, &automask_data);
float t_orig_co[3];
float *target_co = SCULPT_brush_deform_target_vertex_co_get(ss, brush->deform_target, &vd);
sub_v3_v3v3(t_orig_co, orig_data.co, boundary->twist.pivot_position);

View File

@@ -257,7 +257,8 @@ static void do_draw_brush_task(Object *ob, const Brush *brush, const float *offs
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
@@ -350,7 +351,8 @@ static void do_fill_brush_task(
plane_from_point_normal_v3(test.plane_tool, area_co, area_no);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
@@ -437,7 +439,8 @@ static void do_scrape_brush_task(
const int thread_id = BLI_task_parallel_thread_id(nullptr);
plane_from_point_normal_v3(test.plane_tool, area_co, area_no);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
@@ -545,7 +548,8 @@ static void do_clay_thumb_brush_task(Object *ob,
/* Tilted plane (front part of the brush). */
plane_from_point_normal_v3(plane_tilt, area_co, normal_tilt);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
@@ -685,7 +689,8 @@ static void do_flatten_brush_task(
plane_from_point_normal_v3(test.plane_tool, area_co, area_no);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
@@ -820,7 +825,8 @@ static void do_clay_brush_task(
plane_from_point_normal_v3(test.plane_tool, area_co, area_no);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
@@ -925,7 +931,8 @@ static void do_clay_strips_brush_task(Object *ob,
plane_from_point_normal_v3(test.plane_tool, area_co, area_no_sp);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!SCULPT_brush_test_cube(&test, vd.co, mat, brush->tip_roundness, brush->tip_scale_x)) {
@@ -1074,7 +1081,8 @@ static void do_snake_hook_brush_task(Object *ob,
KelvinletParams params;
BKE_kelvinlet_init_params(&params, ss->cache->radius, bstrength, 1.0f, 0.4f);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!do_elastic && !sculpt_brush_test_sq_fn(&test, vd.co)) {
@@ -1142,8 +1150,9 @@ static void do_snake_hook_brush_task(Object *ob,
BKE_kelvinlet_grab_triscale(disp, &params, vd.co, ss->cache->location, proxy[vd.i]);
mul_v3_fl(disp, bstrength * 20.0f);
mul_v3_fl(disp, 1.0f - vd.mask);
mul_v3_fl(disp,
auto_mask::factor_get(ss->cache->automasking, ss, vd.vertex, &automask_data));
mul_v3_fl(
disp,
auto_mask::factor_get(ss->cache->automasking.get(), ss, vd.vertex, &automask_data));
copy_v3_v3(proxy[vd.i], disp);
}
}
@@ -1199,7 +1208,8 @@ static void do_thumb_brush_task(Object *ob, const Brush *brush, const float *con
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
SCULPT_orig_vert_data_update(&orig_data, &vd);
@@ -1262,7 +1272,8 @@ static void do_rotate_brush_task(Object *ob, const Brush *brush, const float ang
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
SCULPT_orig_vert_data_update(&orig_data, &vd);
@@ -1328,7 +1339,8 @@ static void do_layer_brush_task(Object *ob, Sculpt *sd, const Brush *brush, PBVH
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
SCULPT_orig_vert_data_update(&orig_data, &vd);
@@ -1430,7 +1442,8 @@ static void do_inflate_brush_task(Object *ob, const Brush *brush, PBVHNode *node
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
@@ -1489,7 +1502,8 @@ static void do_nudge_brush_task(Object *ob, const Brush *brush, const float *con
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
@@ -1560,7 +1574,8 @@ static void do_crease_brush_task(Object *ob,
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
@@ -1667,7 +1682,8 @@ static void do_pinch_brush_task(Object *ob,
copy_v3_v3(x_object_space, stroke_xz[0]);
copy_v3_v3(z_object_space, stroke_xz[1]);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
@@ -1774,7 +1790,8 @@ static void do_grab_brush_task(Object *ob,
const bool grab_silhouette = brush->flag2 & BRUSH_GRAB_SILHOUETTE;
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
SCULPT_orig_vert_data_update(&orig_data, &vd);
@@ -1847,7 +1864,8 @@ static void do_elastic_deform_brush_task(Object *ob,
const float bstrength = ss->cache->bstrength;
SCULPT_orig_vert_data_init(&orig_data, ob, node, undo::Type::Position);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
float dir;
if (ss->cache->mouse[0] > ss->cache->initial_mouse[0]) {
@@ -1902,7 +1920,7 @@ static void do_elastic_deform_brush_task(Object *ob,
mul_v3_fl(final_disp, 1.0f - vd.mask);
mul_v3_fl(final_disp,
auto_mask::factor_get(ss->cache->automasking, ss, vd.vertex, &automask_data));
auto_mask::factor_get(ss->cache->automasking.get(), ss, vd.vertex, &automask_data));
copy_v3_v3(proxy[vd.i], final_disp);
}
@@ -1954,7 +1972,8 @@ static void do_draw_sharp_brush_task(Object *ob,
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
SCULPT_orig_vert_data_update(&orig_data, &vd);
@@ -2028,7 +2047,8 @@ static void do_topology_slide_task(Object *ob, const Brush *brush, PBVHNode *nod
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
SCULPT_orig_vert_data_update(&orig_data, &vd);
@@ -2191,7 +2211,8 @@ static void do_topology_relax_task(Object *ob, const Brush *brush, PBVHNode *nod
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
SCULPT_orig_vert_data_update(&orig_data, &vd);
@@ -2266,7 +2287,8 @@ static void do_displacement_eraser_brush_task(Object *ob, const Brush *brush, PB
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
PBVHVertexIter vd;
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
@@ -2325,7 +2347,8 @@ static void do_displacement_smear_brush_task(Object *ob, const Brush *brush, PBV
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
PBVHVertexIter vd;
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
@@ -2480,7 +2503,8 @@ static void do_topology_rake_bmesh_task(
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
PBVHVertexIter vd;
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
@@ -2559,7 +2583,8 @@ static void do_mask_brush_draw_task(Object *ob,
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {

View File

@@ -1402,7 +1402,8 @@ static void cloth_filter_apply_forces_task(Object *ob,
auto_mask::node_update(automask_data, vd);
float fade = vd.mask;
fade *= auto_mask::factor_get(ss->filter_cache->automasking, ss, vd.vertex, &automask_data);
fade *= auto_mask::factor_get(
ss->filter_cache->automasking.get(), ss, vd.vertex, &automask_data);
fade = 1.0f - fade;
float force[3] = {0.0f, 0.0f, 0.0f};
float disp[3], temp[3], transform[3][3];

View File

@@ -203,7 +203,7 @@ static void do_draw_face_sets_brush_faces(Object *ob,
ss, &test, brush->falloff_shape);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking, *node);
*ob, ss->cache->automasking.get(), *node);
bool changed = false;
@@ -269,7 +269,7 @@ static void do_draw_face_sets_brush_grids(Object *ob,
ss, &test, brush->falloff_shape);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking, *node);
*ob, ss->cache->automasking.get(), *node);
bool changed = false;
@@ -414,7 +414,8 @@ static void do_relax_face_sets_brush_task(Object *ob,
}
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
auto_mask::node_update(automask_data, vd);

View File

@@ -85,7 +85,7 @@ static void color_filter_task(Object *ob,
SCULPT_orig_vert_data_init(&orig_data, ob, node, undo::Type::Color);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->filter_cache->automasking, *node);
*ob, ss->filter_cache->automasking.get(), *node);
PBVHVertexIter vd;
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
@@ -98,7 +98,8 @@ static void color_filter_task(Object *ob,
float fade = vd.mask;
fade = 1.0f - fade;
fade *= filter_strength;
fade *= auto_mask::factor_get(ss->filter_cache->automasking, ss, vd.vertex, &automask_data);
fade *= auto_mask::factor_get(
ss->filter_cache->automasking.get(), ss, vd.vertex, &automask_data);
if (fade == 0.0f) {
continue;
}

View File

@@ -217,9 +217,6 @@ void cache_free(SculptSession *ss)
if (ss->filter_cache->cloth_sim) {
cloth::simulation_free(ss->filter_cache->cloth_sim);
}
if (ss->filter_cache->automasking) {
auto_mask::cache_free(ss->filter_cache->automasking);
}
MEM_SAFE_FREE(ss->filter_cache->mask_update_it);
MEM_SAFE_FREE(ss->filter_cache->prev_mask);
MEM_SAFE_FREE(ss->filter_cache->normal_factor);
@@ -229,7 +226,7 @@ void cache_free(SculptSession *ss)
MEM_SAFE_FREE(ss->filter_cache->detail_directions);
MEM_SAFE_FREE(ss->filter_cache->limit_surface_co);
MEM_SAFE_FREE(ss->filter_cache->pre_smoothed_color);
MEM_delete<filter::Cache>(ss->filter_cache);
MEM_delete(ss->filter_cache);
ss->filter_cache = nullptr;
}
@@ -346,7 +343,7 @@ static void mesh_filter_task(Object *ob,
* boundaries. */
const bool relax_face_sets = !(ss->filter_cache->iteration_count % 3 == 0);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->filter_cache->automasking, *node);
*ob, ss->filter_cache->automasking.get(), *node);
PBVHVertexIter vd;
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
@@ -357,7 +354,8 @@ static void mesh_filter_task(Object *ob,
float fade = vd.mask;
fade = 1.0f - fade;
fade *= filter_strength;
fade *= auto_mask::factor_get(ss->filter_cache->automasking, ss, vd.vertex, &automask_data);
fade *= auto_mask::factor_get(
ss->filter_cache->automasking.get(), ss, vd.vertex, &automask_data);
if (fade == 0.0f && filter_type != MESH_FILTER_SURFACE_SMOOTH) {
/* Surface Smooth can't skip the loop for this vertex as it needs to calculate its
@@ -643,7 +641,7 @@ static void mesh_filter_surface_smooth_displace_task(Object *ob,
PBVHVertexIter vd;
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->filter_cache->automasking, *node);
*ob, ss->filter_cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
auto_mask::node_update(automask_data, vd);
@@ -651,7 +649,8 @@ static void mesh_filter_surface_smooth_displace_task(Object *ob,
float fade = vd.mask;
fade = 1.0f - fade;
fade *= filter_strength;
fade *= auto_mask::factor_get(ss->filter_cache->automasking, ss, vd.vertex, &automask_data);
fade *= auto_mask::factor_get(
ss->filter_cache->automasking.get(), ss, vd.vertex, &automask_data);
if (fade == 0.0f) {
continue;
}

View File

@@ -346,8 +346,7 @@ struct Cache {
SculptTransformDisplacementMode transform_displacement_mode;
/* Auto-masking. */
auto_mask::Cache *automasking;
std::unique_ptr<auto_mask::Cache> automasking;
float3 initial_normal;
float3 view_normal;
@@ -525,8 +524,7 @@ struct StrokeCache {
float3 true_gravity_direction;
float3 gravity_direction;
/* Auto-masking. */
auto_mask::Cache *automasking;
std::unique_ptr<auto_mask::Cache> automasking;
float4x4 stroke_local_mat;
float multiplane_scrape_angle;
@@ -1287,14 +1285,14 @@ float factor_get(Cache *automasking,
Cache *active_cache_get(SculptSession *ss);
/* Brush can be null. */
Cache *cache_init(Sculpt *sd, Brush *brush, Object *ob);
std::unique_ptr<Cache> cache_init(Sculpt *sd, Brush *brush, Object *ob);
void cache_free(Cache *automasking);
bool mode_enabled(const Sculpt *sd, const Brush *br, eAutomasking_flag mode);
bool is_enabled(const Sculpt *sd, const SculptSession *ss, const Brush *br);
bool needs_normal(const SculptSession *ss, const Sculpt *sculpt, const Brush *brush);
int settings_hash(Object *ob, Cache *automasking);
int settings_hash(const Object &ob, const Cache &automasking);
bool tool_can_reuse_automask(int sculpt_tool);

View File

@@ -61,7 +61,7 @@ static void calc_multiplane_scrape_surface_task(Object *ob,
test_radius *= brush->normal_radius_factor;
test.radius_squared = test_radius * test_radius;
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
@@ -120,7 +120,7 @@ static void do_multiplane_scrape_brush_task(Object *ob,
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {

View File

@@ -1009,7 +1009,7 @@ enum CavityBakeSettingsSource {
};
static void sculpt_bake_cavity_exec_task(Object *ob,
blender::ed::sculpt_paint::auto_mask::Cache *automasking,
blender::ed::sculpt_paint::auto_mask::Cache &automasking,
const CavityBakeMixMode mode,
const float factor,
const SculptMaskWriteInfo mask_write,
@@ -1021,12 +1021,12 @@ static void sculpt_bake_cavity_exec_task(Object *ob,
undo::push_node(ob, node, undo::Type::Mask);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, &automasking, *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
auto_mask::node_update(automask_data, vd);
float automask = auto_mask::factor_get(automasking, ss, vd.vertex, &automask_data);
float automask = auto_mask::factor_get(&automasking, ss, vd.vertex, &automask_data);
float mask;
switch (mode) {
@@ -1142,17 +1142,15 @@ static int sculpt_bake_cavity_exec(bContext *C, wmOperator *op)
SCULPT_stroke_id_next(ob);
auto_mask::Cache *automasking = auto_mask::cache_init(&sd2, &brush2, ob);
std::unique_ptr<auto_mask::Cache> automasking = auto_mask::cache_init(&sd2, &brush2, ob);
const SculptMaskWriteInfo mask_write = SCULPT_mask_get_for_write(ss);
threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) {
for (const int i : range) {
sculpt_bake_cavity_exec_task(ob, automasking, mode, factor, mask_write, nodes[i]);
sculpt_bake_cavity_exec_task(ob, *automasking, mode, factor, mask_write, nodes[i]);
}
});
auto_mask::cache_free(automasking);
bke::pbvh::update_mask(*ss->pbvh);
undo::push_end(ob);

View File

@@ -47,7 +47,8 @@ static void do_color_smooth_task(Object *ob, const Brush *brush, PBVHNode *node)
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
@@ -108,7 +109,8 @@ static void do_paint_brush_task(Object *ob,
IMB_colormanagement_srgb_to_scene_linear_v3(brush_color, brush_color);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
if (brush->flag & BRUSH_USE_GRADIENT) {
switch (brush->gradient_stroke_mode) {
@@ -187,7 +189,7 @@ static void do_paint_brush_task(Object *ob,
/* Final mix over the original color using brush alpha. We apply auto-making again
* at this point to avoid washing out non-binary masking modes like cavity masking. */
float automasking = auto_mask::factor_get(
ss->cache->automasking, ss, vd.vertex, &automask_data);
ss->cache->automasking.get(), ss, vd.vertex, &automask_data);
mul_v4_v4fl(buffer_color, color_buffer->color[vd.i], brush->alpha * automasking);
float col[4];
@@ -348,7 +350,8 @@ static void do_smear_brush_task(Object *ob, const Brush *brush, PBVHNode *node)
sub_v3_v3v3(brush_delta, ss->cache->location, ss->cache->last_location);
}
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {

View File

@@ -362,7 +362,7 @@ static void do_paint_pixels(TexturePaintingUserData *data, const int n)
brush_color[3] = 1.0f;
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking.get(), *node);
ImageUser image_user = *data->image_data.image_user;
bool pixels_updated = false;

View File

@@ -150,7 +150,8 @@ static void do_pose_brush_task(Object *ob, const Brush *brush, PBVHNode *node)
SculptOrigVertData orig_data;
SCULPT_orig_vert_data_init(&orig_data, ob, node, undo::Type::Position);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(
*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
SCULPT_orig_vert_data_update(&orig_data, &vd);
@@ -178,7 +179,7 @@ static void do_pose_brush_task(Object *ob, const Brush *brush, PBVHNode *node)
/* Apply the vertex mask to the displacement. */
const float mask = 1.0f - vd.mask;
const float automask = auto_mask::factor_get(
ss->cache->automasking, ss, vd.vertex, &automask_data);
ss->cache->automasking.get(), ss, vd.vertex, &automask_data);
mul_v3_fl(disp, mask * automask);
/* Accumulate the displacement. */

View File

@@ -211,7 +211,7 @@ static void do_enhance_details_brush_task(Object *ob,
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
@@ -284,7 +284,7 @@ static void smooth_mask_node(Object *ob,
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
@@ -355,7 +355,7 @@ static void smooth_position_node(
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
@@ -495,7 +495,7 @@ static void do_surface_smooth_brush_laplacian_task(Object *ob, const Brush *brus
const int thread_id = BLI_task_parallel_thread_id(nullptr);
SCULPT_orig_vert_data_init(&orig_data, ob, node, undo::Type::Position);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
SCULPT_orig_vert_data_update(&orig_data, &vd);
@@ -536,7 +536,7 @@ static void do_surface_smooth_brush_displace_task(Object *ob, const Brush *brush
SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape(
ss, &test, brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(nullptr);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking, *node);
auto_mask::NodeData automask_data = auto_mask::node_begin(*ob, ss->cache->automasking.get(), *node);
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if (!sculpt_brush_test_sq_fn(&test, vd.co)) {