Cleanup: Sculpt: Store auto-masking cache in unique_ptr
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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(¶ms, 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, ¶ms, 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)) {
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user