[Bf-blender-cvs] [10e90986377] temp-sculpt-normals-masking: temp-sculpt-normals-masking: Give automasking access to original normals
Joseph Eagar
noreply at git.blender.org
Sun Jul 17 00:09:48 CEST 2022
Commit: 10e909863777f506d209046b44b3efc4a3627a0b
Author: Joseph Eagar
Date: Mon Jul 11 03:31:28 2022 -0700
Branches: temp-sculpt-normals-masking
https://developer.blender.org/rB10e909863777f506d209046b44b3efc4a3627a0b
temp-sculpt-normals-masking: Give automasking access to original normals
* Automasking code now has access to original normals
* This works in a fairly clunky way that preserves the
existing automasking API. Alternative is to give up
on reusing undo data for original co/normal in
PBVH_FACES/PBVH_GRIDS and just use a temporary array
or attribute for it. That would allow vertex-level
lookups independent of the pbvh nodes.
===================================================================
M source/blender/editors/sculpt_paint/sculpt.c
M source/blender/editors/sculpt_paint/sculpt_automasking.cc
M source/blender/editors/sculpt_paint/sculpt_boundary.c
M source/blender/editors/sculpt_paint/sculpt_brush_types.c
M source/blender/editors/sculpt_paint/sculpt_cloth.c
M source/blender/editors/sculpt_paint/sculpt_face_set.c
M source/blender/editors/sculpt_paint/sculpt_filter_color.c
M source/blender/editors/sculpt_paint/sculpt_filter_mesh.c
M source/blender/editors/sculpt_paint/sculpt_intern.h
M source/blender/editors/sculpt_paint/sculpt_multiplane_scrape.c
M source/blender/editors/sculpt_paint/sculpt_paint_color.c
M source/blender/editors/sculpt_paint/sculpt_paint_image.cc
M source/blender/editors/sculpt_paint/sculpt_pose.c
M source/blender/editors/sculpt_paint/sculpt_smooth.c
===================================================================
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 3c63206dd7c..09fba87aff2 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -2366,7 +2366,8 @@ float SCULPT_brush_strength_factor(SculptSession *ss,
const float fno[3],
const float mask,
const int vertex_index,
- const int thread_id)
+ const int thread_id,
+ AutomaskingNodeData *automask_data)
{
StrokeCache *cache = ss->cache;
const Scene *scene = cache->vc->scene;
@@ -2450,7 +2451,7 @@ float SCULPT_brush_strength_factor(SculptSession *ss,
avg *= 1.0f - mask;
/* Auto-masking. */
- avg *= SCULPT_automasking_factor_get(cache->automasking, ss, vertex_index);
+ avg *= SCULPT_automasking_factor_get(cache->automasking, ss, vertex_index, automask_data);
return avg;
}
@@ -3040,7 +3041,8 @@ static void do_gravity_task_cb_ex(void *__restrict userdata,
vd.fno,
vd.mask ? *vd.mask : 0.0f,
vd.index,
- thread_id);
+ thread_id,
+ NULL);
mul_v3_v3fl(proxy[vd.i], offset, fade);
@@ -5908,4 +5910,31 @@ void SCULPT_fake_neighbors_free(Object *ob)
sculpt_pose_fake_neighbors_free(ss);
}
+void SCULPT_automasking_node_begin(Object *ob,
+ const SculptSession *ss,
+ AutomaskingCache *automasking,
+ AutomaskingNodeData *node_data,
+ PBVHNode *node)
+{
+ node_data->node = node;
+ node_data->have_orig_data = automasking->settings.flags &
+ (BRUSH_AUTOMASKING_BRUSH_NORMAL | BRUSH_AUTOMASKING_VIEW_NORMAL);
+
+ if (node_data->have_orig_data) {
+ SCULPT_orig_vert_data_init(&node_data->orig_data, ob, node, SCULPT_UNDO_COORDS);
+ }
+ else {
+ memset(&node_data->orig_data, 0, sizeof(node_data->orig_data));
+ }
+}
+
+void SCULPT_automasking_node_update(SculptSession *ss,
+ AutomaskingNodeData *automask_data,
+ PBVHVertexIter *vd)
+{
+ if (automask_data->have_orig_data) {
+ SCULPT_orig_vert_data_update(&automask_data->orig_data, vd);
+ }
+}
+
/** \} */
diff --git a/source/blender/editors/sculpt_paint/sculpt_automasking.cc b/source/blender/editors/sculpt_paint/sculpt_automasking.cc
index 89bc8a970f2..5463b2c2045 100644
--- a/source/blender/editors/sculpt_paint/sculpt_automasking.cc
+++ b/source/blender/editors/sculpt_paint/sculpt_automasking.cc
@@ -118,11 +118,17 @@ static float sculpt_automasking_normal_calc(AutomaskingCache *automasking,
int vertex,
const float normal[3],
float limit_lower,
- float limit_upper)
+ float limit_upper,
+ AutomaskingNodeData *automask_data)
{
float normal_v[3];
- SCULPT_vertex_normal_get(ss, vertex, normal_v);
+ if (automask_data->orig_data.no) {
+ copy_v3_v3(normal_v, automask_data->orig_data.no);
+ }
+ else {
+ SCULPT_vertex_normal_get(ss, vertex, normal_v);
+ }
float angle = saacos(dot_v3v3(normal, normal_v));
@@ -159,11 +165,15 @@ static bool SCULPT_automasking_needs_factors_cache(const Sculpt *sd, const Brush
return false;
}
-float SCULPT_automasking_factor_get(AutomaskingCache *automasking, SculptSession *ss, int vert)
+float SCULPT_automasking_factor_get(AutomaskingCache *automasking,
+ SculptSession *ss,
+ int vert,
+ AutomaskingNodeData *automask_data)
{
if (!automasking) {
return 1.0f;
}
+
/* If the cache is initialized with valid info, use the cache. This is used when the
* automasking information can't be computed in real time per vertex and needs to be
* initialized for the whole mesh when the stroke starts. */
@@ -200,7 +210,8 @@ float SCULPT_automasking_factor_get(AutomaskingCache *automasking, SculptSession
vert,
ss->cache->initial_normal,
automasking->settings.start_normal_limit - falloff * 0.5f,
- automasking->settings.start_normal_limit + falloff * 0.5f);
+ automasking->settings.start_normal_limit + falloff * 0.5f,
+ automask_data);
}
if (ss->cache && (automasking->settings.flags & BRUSH_AUTOMASKING_VIEW_NORMAL)) {
@@ -211,7 +222,8 @@ float SCULPT_automasking_factor_get(AutomaskingCache *automasking, SculptSession
vert,
ss->cache->view_normal,
automasking->settings.view_normal_limit,
- automasking->settings.view_normal_limit + falloff);
+ automasking->settings.view_normal_limit + falloff,
+ automask_data);
}
return mask;
@@ -445,3 +457,18 @@ AutomaskingCache *SCULPT_automasking_cache_init(Sculpt *sd, Brush *brush, Object
return automasking;
}
+
+bool SCULPT_automasking_needs_origco(const SculptSession *ss, const Sculpt *sd, const Brush *br)
+{
+ if (br &&
+ br->automasking_flags & (BRUSH_AUTOMASKING_BRUSH_NORMAL | BRUSH_AUTOMASKING_VIEW_NORMAL)) {
+ return true;
+ }
+
+ if (sd &&
+ sd->automasking_flags & (BRUSH_AUTOMASKING_BRUSH_NORMAL | BRUSH_AUTOMASKING_VIEW_NORMAL)) {
+ return true;
+ }
+
+ return false;
+}
diff --git a/source/blender/editors/sculpt_paint/sculpt_boundary.c b/source/blender/editors/sculpt_paint/sculpt_boundary.c
index 44e2dfae480..dc2c9741316 100644
--- a/source/blender/editors/sculpt_paint/sculpt_boundary.c
+++ b/source/blender/editors/sculpt_paint/sculpt_boundary.c
@@ -647,12 +647,16 @@ static void do_boundary_brush_bend_task_cb_ex(void *__restrict userdata,
angle_factor = floorf(angle_factor * 10) / 10.0f;
}
const float angle = angle_factor * M_PI;
+ AutomaskingNodeData automask_data;
+ SCULPT_automasking_node_begin(
+ data->ob, ss, ss->cache->automasking, &automask_data, data->nodes[n]);
BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) {
if (boundary->edit_info[vd.index].num_propagation_steps == -1) {
continue;
}
+ SCULPT_automasking_node_update(ss, &automask_data, &vd);
SCULPT_orig_vert_data_update(&orig_data, &vd);
if (!SCULPT_check_vertex_pivot_symmetry(
orig_data.co, boundary->initial_vertex_position, symm)) {
@@ -660,7 +664,8 @@ static void do_boundary_brush_bend_task_cb_ex(void *__restrict userdata,
}
const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f;
- const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index);
+ const float automask = SCULPT_automasking_factor_get(
+ ss->cache->automasking, ss, vd.index, &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]);
@@ -695,12 +700,16 @@ static void do_boundary_brush_slide_task_cb_ex(void *__restrict userdata,
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
const float disp = sculpt_boundary_displacement_from_grab_delta_get(ss, boundary);
+ AutomaskingNodeData automask_data;
+ SCULPT_automasking_node_begin(
+ data->ob, ss, ss->cache->automasking, &automask_data, data->nodes[n]);
BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) {
if (boundary->edit_info[vd.index].num_propagation_steps == -1) {
continue;
}
+ SCULPT_automasking_node_update(ss, &automask_data, &vd);
SCULPT_orig_vert_data_update(&orig_data, &vd);
if (!SCULPT_check_vertex_pivot_symmetry(
orig_data.co, boundary->initial_vertex_position, symm)) {
@@ -708,7 +717,8 @@ static void do_boundary_brush_slide_task_cb_ex(void *__restrict userdata,
}
const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f;
- const float automask = SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index);
+ const float automask = SCULPT_automasking_factor_get(
+ ss->cache->automasking, ss, vd.index, &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,
@@ -739,6 +749,9 @@ static void do_boundary_brush_inflate_task_cb_ex(void *__restrict userdata,
PBVHVertexIter vd;
SculptOrigVertData orig_data;
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
+ AutomaskingNodeData automask_data;
+ SCULPT_automasking_node_begin(
+ data->ob, ss, ss->cache->automasking, &automask_data, data->nodes[n]);
const float disp = sculpt_boundary_displacement_from_grab_delta_get(ss, boundary);
@@ -747,6 +760,7 @@ static void do_boundary_brush_inflate_task_cb_ex(void *__restrict userdata,
continue;
}
+ SCULPT_automasking_node_update(ss, &automask_data, &vd);
SCULPT_orig_vert_data_update(&orig_data, &vd);
if (!SCULPT_check_vertex_pivot_symmetry(
orig_data.co, boundary->initial_vertex_position, symm)) {
@@ -754,7 +768,8 @@ static void do_boundary_brush_inflate_task_cb_ex(void *__restrict userdata,
}
const float mask = vd.mask ? 1.0f - *vd.mask : 1.0f;
- const float automask = SCULPT_automasking_factor_get(ss->cache->automasking,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list