[Bf-blender-cvs] [7731690dba8] temp-sculpt-normals-masking: temp-sculpt-normals-masking: Implement new masking modes for factor cache

Joseph Eagar noreply at git.blender.org
Thu Jul 28 19:13:55 CEST 2022


Commit: 7731690dba8cc7ac8a5b83d163ff27d3086f9736
Author: Joseph Eagar
Date:   Tue Jul 26 15:09:05 2022 -0700
Branches: temp-sculpt-normals-masking
https://developer.blender.org/rB7731690dba8cc7ac8a5b83d163ff27d3086f9736

temp-sculpt-normals-masking: Implement new masking modes for factor cache

===================================================================

M	source/blender/editors/sculpt_paint/sculpt_automasking.cc
M	source/blender/editors/sculpt_paint/sculpt_filter_mesh.c

===================================================================

diff --git a/source/blender/editors/sculpt_paint/sculpt_automasking.cc b/source/blender/editors/sculpt_paint/sculpt_automasking.cc
index 26955c4bb8e..6b64af8a977 100644
--- a/source/blender/editors/sculpt_paint/sculpt_automasking.cc
+++ b/source/blender/editors/sculpt_paint/sculpt_automasking.cc
@@ -159,15 +159,77 @@ static bool SCULPT_automasking_needs_factors_cache(const Sculpt *sd, const Brush
   if (automasking_flags & BRUSH_AUTOMASKING_TOPOLOGY) {
     return true;
   }
-  if (automasking_flags & BRUSH_AUTOMASKING_BOUNDARY_EDGES) {
-    return brush && brush->automasking_boundary_edges_propagation_steps != 1;
-  }
-  if (automasking_flags & BRUSH_AUTOMASKING_BOUNDARY_FACE_SETS) {
+  if (automasking_flags & (BRUSH_AUTOMASKING_BOUNDARY_EDGES,
+                           BRUSH_AUTOMASKING_BOUNDARY_FACE_SETS,
+                           BRUSH_AUTOMASKING_BRUSH_NORMAL,
+                           BRUSH_AUTOMASKING_VIEW_NORMAL,
+                           BRUSH_AUTOMASKING_VIEW_OCCLUSION)) {
     return brush && brush->automasking_boundary_edges_propagation_steps != 1;
   }
   return false;
 }
 
+static float automasking_brush_normal_factor(AutomaskingCache *automasking,
+                                             SculptSession *ss,
+                                             int vertex,
+                                             AutomaskingNodeData *automask_data)
+{
+  float falloff = automasking->settings.start_normal_falloff * M_PI;
+  float initial_normal[3];
+
+  if (ss->cache) {
+    copy_v3_v3(initial_normal, ss->cache->initial_normal);
+  }
+  else {
+    copy_v3_v3(initial_normal, ss->filter_cache->initial_normal);
+  }
+
+  return sculpt_automasking_normal_calc(automasking,
+                                        ss,
+                                        vertex,
+                                        initial_normal,
+                                        automasking->settings.start_normal_limit - falloff * 0.5f,
+                                        automasking->settings.start_normal_limit + falloff * 0.5f,
+                                        automask_data);
+}
+
+static float automasking_view_normal_factor(AutomaskingCache *automasking,
+                                            SculptSession *ss,
+                                            int vertex,
+                                            AutomaskingNodeData *automask_data)
+{
+  float falloff = automasking->settings.view_normal_falloff * M_PI;
+
+  float view_normal[3];
+
+  if (ss->cache) {
+    copy_v3_v3(view_normal, ss->cache->view_normal);
+  }
+  else {
+    copy_v3_v3(view_normal, ss->filter_cache->view_normal);
+  }
+
+  return sculpt_automasking_normal_calc(automasking,
+                                        ss,
+                                        vertex,
+                                        view_normal,
+                                        automasking->settings.view_normal_limit,
+                                        automasking->settings.view_normal_limit + falloff,
+                                        automask_data);
+}
+
+static float automasking_view_occlusion_factor(AutomaskingCache *automasking,
+                                               SculptSession *ss,
+                                               int vertex,
+                                               AutomaskingNodeData *automask_data)
+{
+  if (!automasking->occluded[vertex]) {
+    automasking->occluded[vertex] = SCULPT_vertex_is_occluded(ss, vertex, true) ? 2 : 1;
+  }
+
+  return automasking->occluded[vertex] == 2;
+}
+
 float SCULPT_automasking_factor_get(AutomaskingCache *automasking,
                                     SculptSession *ss,
                                     int vert,
@@ -183,14 +245,10 @@ float SCULPT_automasking_factor_get(AutomaskingCache *automasking,
   if (automasking->factor) {
     return automasking->factor[vert];
   }
-  if (automasking->settings.flags & BRUSH_AUTOMASKING_VIEW_OCCLUSION) {
-    if (!automasking->occluded[vert]) {
-      automasking->occluded[vert] = SCULPT_vertex_is_occluded(ss, vert, true) ? 2 : 1;
-    }
 
-    if (automasking->occluded[vert] - 1) {
-      return 0.0f;
-    }
+  if ((automasking->settings.flags & BRUSH_AUTOMASKING_VIEW_OCCLUSION) &&
+      automasking_view_occlusion_factor(automasking, ss, vert, automask_data)) {
+    return 0.0f;
   }
 
   if (automasking->settings.flags & BRUSH_AUTOMASKING_FACE_SETS) {
@@ -215,46 +273,12 @@ float SCULPT_automasking_factor_get(AutomaskingCache *automasking,
 
   if ((ss->cache || ss->filter_cache) &&
       (automasking->settings.flags & BRUSH_AUTOMASKING_BRUSH_NORMAL)) {
-    float falloff = automasking->settings.start_normal_falloff * M_PI;
-    float initial_normal[3];
-
-    if (ss->cache) {
-      copy_v3_v3(initial_normal, ss->cache->initial_normal);
-    }
-    else {
-      copy_v3_v3(initial_normal, ss->filter_cache->initial_normal);
-    }
-
-    mask *= sculpt_automasking_normal_calc(
-        automasking,
-        ss,
-        vert,
-        initial_normal,
-        automasking->settings.start_normal_limit - falloff * 0.5f,
-        automasking->settings.start_normal_limit + falloff * 0.5f,
-        automask_data);
+    mask *= automasking_brush_normal_factor(automasking, ss, vert, automask_data);
   }
 
   if ((ss->cache || ss->filter_cache) &&
       (automasking->settings.flags & BRUSH_AUTOMASKING_VIEW_NORMAL)) {
-    float falloff = automasking->settings.view_normal_falloff * M_PI;
-
-    float view_normal[3];
-
-    if (ss->cache) {
-      copy_v3_v3(view_normal, ss->cache->view_normal);
-    }
-    else {
-      copy_v3_v3(view_normal, ss->filter_cache->view_normal);
-    }
-
-    mask *= sculpt_automasking_normal_calc(automasking,
-                                           ss,
-                                           vert,
-                                           view_normal,
-                                           automasking->settings.view_normal_limit,
-                                           automasking->settings.view_normal_limit + falloff,
-                                           automask_data);
+    mask *= automasking_view_normal_factor(automasking, ss, vert, automask_data);
   }
 
   return mask;
@@ -440,6 +464,31 @@ static void SCULPT_automasking_cache_settings_update(AutomaskingCache *automaski
   automasking->settings.start_normal_falloff = sd->automasking_start_normal_falloff;
 }
 
+void sculpt_normal_occlusion_automasking_fill(AutomaskingCache *automasking,
+                                              Object *ob,
+                                              float *factor,
+                                              eAutomasking_flag mode)
+{
+  SculptSession *ss = ob->sculpt;
+  const int totvert = SCULPT_vertex_count_get(ss);
+
+  /* No need to build original data since this is only called at the beginning of strokes.*/
+  AutomaskingNodeData nodedata;
+  nodedata.have_orig_data = false;
+
+  for (int i = 0; i < totvert; i++) {
+    if ((int)mode & BRUSH_AUTOMASKING_BRUSH_NORMAL) {
+      factor[i] *= automasking_brush_normal_factor(automasking, ss, i, &nodedata);
+    }
+    if ((int)mode & BRUSH_AUTOMASKING_VIEW_NORMAL) {
+      factor[i] *= automasking_view_normal_factor(automasking, ss, i, &nodedata);
+    }
+    if ((int)mode & BRUSH_AUTOMASKING_VIEW_OCCLUSION) {
+      factor[i] *= automasking_view_occlusion_factor(automasking, ss, i, &nodedata);
+    }
+  }
+}
+
 AutomaskingCache *SCULPT_automasking_cache_init(Sculpt *sd, Brush *brush, Object *ob)
 {
   SculptSession *ss = ob->sculpt;
@@ -480,6 +529,15 @@ AutomaskingCache *SCULPT_automasking_cache_init(Sculpt *sd, Brush *brush, Object
     sculpt_face_sets_automasking_init(sd, ob, automasking->factor);
   }
 
+  int normal_bits = sculpt_automasking_mode_effective_bits(sd, brush) &
+                    (BRUSH_AUTOMASKING_BRUSH_NORMAL | BRUSH_AUTOMASKING_VIEW_NORMAL |
+                     BRUSH_AUTOMASKING_VIEW_OCCLUSION);
+
+  if (normal_bits) {
+    sculpt_normal_occlusion_automasking_fill(
+        automasking, ob, automasking->factor, (eAutomasking_flag)normal_bits);
+  }
+
   if (SCULPT_is_automasking_mode_enabled(sd, brush, BRUSH_AUTOMASKING_BOUNDARY_EDGES)) {
     SCULPT_vertex_random_access_ensure(ss);
     SCULPT_boundary_automasking_init(
diff --git a/source/blender/editors/sculpt_paint/sculpt_filter_mesh.c b/source/blender/editors/sculpt_paint/sculpt_filter_mesh.c
index f9958d323bf..07ceee3b5da 100644
--- a/source/blender/editors/sculpt_paint/sculpt_filter_mesh.c
+++ b/source/blender/editors/sculpt_paint/sculpt_filter_mesh.c
@@ -171,7 +171,7 @@ void SCULPT_filter_cache_init(bContext *C,
   float co[3];
   float mval_fl[2] = {(float)mval[0], (float)mval[1]};
 
-  if (SCULPT_stroke_get_location(C, co, mval_fl)) {
+  if (SCULPT_stroke_get_location(C, co, mval_fl, false)) {
     PBVHNode **nodes;
     int totnode;



More information about the Bf-blender-cvs mailing list