[Bf-blender-cvs] [6a1d01d8b27] temp-sculpt-cavity-mask: Merge branch 'master' into temp-sculpt-cavity-mask

Joseph Eagar noreply at git.blender.org
Sat Aug 6 00:29:42 CEST 2022


Commit: 6a1d01d8b27c98e5b20228c4a86b1f0d5bad7a61
Author: Joseph Eagar
Date:   Wed Aug 3 08:57:40 2022 -0700
Branches: temp-sculpt-cavity-mask
https://developer.blender.org/rB6a1d01d8b27c98e5b20228c4a86b1f0d5bad7a61

Merge branch 'master' into temp-sculpt-cavity-mask

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



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

diff --cc release/scripts/startup/bl_ui/space_view3d.py
index c9bd6cd5cd2,2f9050ba638..ee2f81bc556
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@@ -5474,8 -5474,6 +5474,7 @@@ class VIEW3D_MT_sculpt_automasking_pie(
          pie.prop(sculpt, "use_automasking_face_sets", text="Face Sets")
          pie.prop(sculpt, "use_automasking_boundary_edges", text="Mesh Boundary")
          pie.prop(sculpt, "use_automasking_boundary_face_sets", text="Face Sets Boundary")
 +        pie.prop(sculpt, "use_automasking_cavity", text="Cavity")
-         pie.prop(sculpt, "invert_automasking_cavity", text="Invert Cavity")
  
  
  class VIEW3D_MT_sculpt_face_sets_edit_pie(Menu):
diff --cc source/blender/blenkernel/BKE_paint.h
index df145a77f08,8b9deadc960..33a39adc536
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@@ -471,6 -473,6 +474,11 @@@ typedef struct SculptBoundary 
    } twist;
  } SculptBoundary;
  
++typedef struct CavityMaskData {
++  float factor;
++  int stroke_id;
++} CavityMaskData;
++
  typedef struct SculptFakeNeighbors {
    bool use_fake_neighbors;
  
@@@ -664,10 -666,6 +672,9 @@@ typedef struct SculptSession 
     */
    char *last_paint_canvas_key;
  
 +  int stroke_id;
 +
-   float *cavity_factor;
-   int *cavity_stroke_id;
++  CavityMaskData *cavity;
  } SculptSession;
  
  void BKE_sculptsession_free(struct Object *ob);
diff --cc source/blender/blenkernel/intern/paint.c
index c4f8310080e,b540357ce49..c8457b5c267
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@@ -1518,8 -1518,6 +1518,7 @@@ void BKE_sculptsession_free(Object *ob
      BKE_sculptsession_free_vwpaint_data(ob->sculpt);
  
      MEM_SAFE_FREE(ss->last_paint_canvas_key);
-     MEM_SAFE_FREE(ss->cavity_factor);
-     MEM_SAFE_FREE(ss->cavity_stroke_id);
++    MEM_SAFE_FREE(ss->cavity);
  
      MEM_freeN(ss);
  
diff --cc source/blender/editors/sculpt_paint/sculpt_automasking.cc
index f10fcc1f97b,a9fe8cc4b2f..90631ce83e1
--- a/source/blender/editors/sculpt_paint/sculpt_automasking.cc
+++ b/source/blender/editors/sculpt_paint/sculpt_automasking.cc
@@@ -132,243 -114,9 +132,251 @@@ static bool SCULPT_automasking_needs_fa
    return false;
  }
  
- float SCULPT_calc_cavity(SculptSession *ss, const int vertex)
++float SCULPT_calc_cavity(SculptSession *ss, const PBVHVertRef vertex)
 +{
 +  SculptVertexNeighborIter ni;
 +  const float *co = SCULPT_vertex_co_get(ss, vertex);
 +  float avg[3];
 +  float length_sum = 0.0f;
 +  float e_num = 0.0f;
 +
 +  zero_v3(avg);
 +
 +  SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vertex, ni) {
-     const float *co2 = SCULPT_vertex_co_get(ss, ni.index);
++    const float *co2 = SCULPT_vertex_co_get(ss, ni.vertex);
 +
 +    length_sum += len_v3v3(co, co2);
 +    e_num += 1.0f;
 +    add_v3_v3(avg, co2);
 +  }
 +  SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
 +
 +  if (e_num == 0.0f) {
 +    return 0.0f;
 +  }
 +
 +  mul_v3_fl(avg, 1.0f / (float)e_num);
 +  length_sum /= e_num;
 +
 +  float no[3];
 +
 +  SCULPT_vertex_normal_get(ss, vertex, no);
 +
 +  sub_v3_v3(avg, co);
 +
 +  /* Use distance to plane. */
 +  float factor = dot_v3v3(avg, no) / length_sum;
 +
 +  return factor;
 +}
 +
 +static float sculpt_cavity_calc_factor(SculptSession *ss,
 +                                       AutomaskingCache *automasking,
 +                                       float factor)
 +{
 +  float sign = signf(factor);
 +
 +  factor = fabsf(factor) * automasking->settings.cavity_factor * 50.0f;
 +
 +  factor = factor * sign * 0.5f + 0.5f;
 +  CLAMP(factor, 0.0f, 1.0f);
 +
 +  return (automasking->settings.flags & BRUSH_AUTOMASKING_CAVITY_INVERT) ? 1.0f - factor : factor;
 +}
 +
 +struct CavityBlurVert {
-   int vertex;
++  PBVHVertRef vertex;
 +  float dist;
 +  int depth;
 +
-   CavityBlurVert(int vertex_, float dist_, int depth_)
++  CavityBlurVert(PBVHVertRef vertex_, float dist_, int depth_)
 +      : vertex(vertex_), dist(dist_), depth(depth_)
 +  {
 +  }
 +
 +  CavityBlurVert()
 +  {
 +  }
 +
 +  CavityBlurVert(const CavityBlurVert &b)
 +  {
 +    vertex = b.vertex;
 +    dist = b.dist;
 +    depth = b.depth;
 +  }
 +};
 +
 +static void sculpt_calc_blurred_cavity(SculptSession *ss,
 +                                       AutomaskingCache *automasking,
 +                                       int steps,
-                                        int vertex)
++                                       PBVHVertRef vertex)
 +{
 +  if (steps == 0) {
-     ss->cavity_factor[vertex] = sculpt_cavity_calc_factor(
++    int index = BKE_pbvh_vertex_to_index(ss->pbvh, vertex);
++
++    ss->cavity[index].factor = sculpt_cavity_calc_factor(
 +        ss, automasking, SCULPT_calc_cavity(ss, vertex));
-     ss->cavity_stroke_id[vertex] = ss->stroke_id;
++    ss->cavity[index].stroke_id = ss->stroke_id;
 +
 +    return;
 +  }
 +
 +  float sno1[3];
 +  float sno2[3];
 +  float sco1[3];
 +  float sco2[3];
 +  float len1_sum = 0.0f, len2_sum = 0.0f;
 +  int sco1_num = 0, sco2_num = 0;
 +
 +  zero_v3(sno1);
 +  zero_v3(sno2);
 +  zero_v3(sco1);
 +  zero_v3(sco2);
 +
 +  Vector<CavityBlurVert, 64> queue;
-   Set<int, 64> visit;
++  Set<intptr_t, 64> visit;
 +
 +  int start = 0, end = 0;
 +
 +  queue.resize(64);
 +
 +  CavityBlurVert initial(vertex, 0.0f, 0);
 +
-   visit.add_new(vertex);
++  visit.add_new(vertex.i);
 +  queue[0] = initial;
 +  end = 1;
 +
 +  const float *co1 = SCULPT_vertex_co_get(ss, vertex);
 +
 +  while (start != end) {
 +    CavityBlurVert &blurvert = queue[start];
-     int v = blurvert.vertex;
++    PBVHVertRef v = blurvert.vertex;
 +    start = (start + 1) % queue.size();
 +
 +    float no[3];
 +
 +    const float *co = SCULPT_vertex_co_get(ss, v);
 +    SCULPT_vertex_normal_get(ss, v, no);
 +
 +    float centdist = len_v3v3(co, co1);
 +
 +    add_v3_v3(sco1, co);
 +    add_v3_v3(sno1, no);
 +    len1_sum += centdist;
 +    sco1_num++;
 +
 +    if (blurvert.depth < steps) {
 +      add_v3_v3(sco2, co);
 +      add_v3_v3(sno2, no);
 +      len2_sum += centdist;
 +      sco2_num++;
 +    }
 +
 +    if (blurvert.depth >= steps) {
 +      continue;
 +    }
 +
 +    SculptVertexNeighborIter ni;
 +    SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, v, ni) {
-       int v2 = ni.index;
++      PBVHVertRef v2 = ni.vertex;
 +
-       if (visit.contains(v2)) {
++      if (visit.contains(v2.i)) {
 +        continue;
 +      }
 +
 +      float dist = len_v3v3(SCULPT_vertex_co_get(ss, v2), SCULPT_vertex_co_get(ss, v));
 +
-       visit.add_new(v2);
++      visit.add_new(v2.i);
 +      CavityBlurVert blurvert2(v2, dist, blurvert.depth + 1);
 +
 +      int nextend = (end + 1) % queue.size();
 +
 +      if (nextend == start) {
 +        int oldsize = queue.size();
 +
 +        queue.resize(queue.size() << 1);
 +
 +        if (end < start) {
 +          int n = oldsize - start;
 +
 +          for (int i = 0; i < n; i++) {
 +            queue[queue.size() - n + i] = queue[i + start];
 +          }
 +
 +          start = queue.size() - n;
 +        }
 +      }
 +
 +      queue[end] = blurvert2;
 +      end = (end + 1) % queue.size();
 +    }
 +    SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
 +  }
 +
 +  if (sco1_num == sco2_num) {
 +    printf("error! %d %d\n", sco1_num, sco2_num);
 +  }
 +
 +  if (!sco1_num) {
 +    copy_v3_v3(sco1, SCULPT_vertex_co_get(ss, vertex));
 +  }
 +  else {
 +    mul_v3_fl(sco1, 1.0f / (float)sco1_num);
 +    len1_sum /= sco1_num;
 +  }
 +
 +  if (!sco2_num) {
 +    copy_v3_v3(sco2, SCULPT_vertex_co_get(ss, vertex));
 +  }
 +  else {
 +    mul_v3_fl(sco2, 1.0f / (float)sco2_num);
 +    len2_sum /= sco2_num;
 +  }
 +
 +  normalize_v3(sno1);
 +  if (dot_v3v3(sno1, sno1) == 0.0f) {
 +    SCULPT_vertex_normal_get(ss, vertex, sno1);
 +  }
 +
 +  normalize_v3(sno2);
 +  if (dot_v3v3(sno2, sno2) == 0.0f) {
 +    SCULPT_vertex_normal_get(ss, vertex, sno2);
 +  }
 +
 +  float vec[3];
 +  sub_v3_v3v3(vec, sco1, sco2);
 +  float factor_sum = dot_v3v3(vec, sno2) / len1_sum;
 +
 +  factor_sum = sculpt_cavity_calc_factor(ss, automasking, factor_sum);
 +
-   ss->cavity_factor[vertex] = factor_sum;
-   ss->cavity_stroke_id[vertex] = ss->stroke_id;
++  int index = BKE_pbvh_vertex_to_index(ss->pbvh, vertex);
++
++  ss->cavity[index].factor = factor_sum;
++  ss->cavity[index].stroke_id = ss->stroke_id;
 +}
 +
 +static float sculpt_automasking_cavity_factor(AutomaskingCache *automasking,
 +                                              SculptSession *ss,
-                                               int vertex)
++                                              PBVHVertRef vertex)
 +{
-   if (ss->cavity_stroke_id[vertex] != ss->stroke_id) {
++  int index = BKE_pbvh_vertex_to_index(ss->pbvh, vertex);
++
++  if (ss->cavity[index].stroke_id != ss->stroke_id) {
 +    sculpt_calc_blurred_cavity(ss, automasking, automasking->settings.cavity_blur_steps, vertex);
 +  }
 +
-   float factor = ss->cavity_factor[vertex];
++  float factor = ss->cavity[index].factor;
 +
 +  if (automasking->settings.flags & BRUSH_AUTOMASKING_CAVITY_USE_CURVE) {
 +    factor = BKE_curvemapping_evaluateF(automasking->settings.cavity_curve, 0, factor);
 +  }
 +
 +  return factor;
 +}
 +
- float SCULPT_automasking_factor_get(AutomaskingCache *automasking, SculptSession *ss, int vert)
+ float SCULPT_automasking_factor_get(AutomaskingCache *automasking,
+                                     SculptSession *ss,
+                                     PBVHVertRef vert)
  {
    if (!automasking) {
      return 1.0f;
@@@ -377,13 -128,7 +388,13 @@@
     * automasking information can't be computed in real time per vertex and needs to be
     * initialized for the whole mesh when the stroke starts. */
    if (automasking->factor) {
-     float factor = automasking->factor[vert];
 -    return automasking->factor[index];
++    float factor = automasking->factor[index];
 +
 +    if (automasking->settings.flags & BRUSH_AUTOMASKING_CAVITY) {
 +      factor *= sculpt_automasking_cavity_factor(automasking, ss, vert);
 +    }
 +
 +    return factor;
    }
  
    if (automasking->settings.flags & BRUSH_AUTOMASKING_FACE_SETS) {
@@@ -515,32 -263,6 +533,32 @@@ static float *sculpt_face_sets_automask
    return autom

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list