[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