[Bf-blender-cvs] [447425ad991] temp-sculpt-normals-masking: Merge branch 'master' into temp-sculpt-normals-masking

Joseph Eagar noreply at git.blender.org
Sat Jul 30 20:31:34 CEST 2022


Commit: 447425ad991b99b3dcc7fba501c42027b9a80cdd
Author: Joseph Eagar
Date:   Sat Jul 30 11:18:40 2022 -0700
Branches: temp-sculpt-normals-masking
https://developer.blender.org/rB447425ad991b99b3dcc7fba501c42027b9a80cdd

Merge branch 'master' into temp-sculpt-normals-masking

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



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

diff --cc source/blender/editors/sculpt_paint/sculpt.c
index c28b426051d,2366089cefb..3f978c19e47
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@@ -2361,13 -2397,12 +2397,13 @@@ static float brush_strength(const Sculp
  float SCULPT_brush_strength_factor(SculptSession *ss,
                                     const Brush *br,
                                     const float brush_point[3],
-                                    const float len,
+                                    float len,
                                     const float vno[3],
                                     const float fno[3],
-                                    const float mask,
-                                    const int vertex_index,
+                                    float mask,
+                                    const PBVHVertRef vertex,
 -                                   int thread_id)
 +                                   const int thread_id,
 +                                   AutomaskingNodeData *automask_data)
  {
    StrokeCache *cache = ss->cache;
    const Scene *scene = cache->vc->scene;
@@@ -2451,7 -2486,7 +2487,7 @@@
    avg *= 1.0f - mask;
  
    /* Auto-masking. */
-   avg *= SCULPT_automasking_factor_get(cache->automasking, ss, vertex_index, automask_data);
 -  avg *= SCULPT_automasking_factor_get(cache->automasking, ss, vertex);
++  avg *= SCULPT_automasking_factor_get(cache->automasking, ss, vertex, automask_data);
  
    return avg;
  }
@@@ -3040,9 -3075,8 +3076,9 @@@ static void do_gravity_task_cb_ex(void 
                                                      vd.no,
                                                      vd.fno,
                                                      vd.mask ? *vd.mask : 0.0f,
-                                                     vd.index,
+                                                     vd.vertex,
 -                                                    thread_id);
 +                                                    thread_id,
 +                                                    NULL);
  
      mul_v3_v3fl(proxy[vd.i], offset, fade);
  
@@@ -5913,69 -5962,4 +5964,68 @@@ void SCULPT_fake_neighbors_free(Object 
    sculpt_pose_fake_neighbors_free(ss);
  }
  
 +void SCULPT_automasking_node_begin(Object *ob,
 +                                   const SculptSession *ss,
 +                                   AutomaskingCache *automasking,
 +                                   AutomaskingNodeData *node_data,
 +                                   PBVHNode *node)
 +{
 +  if (!automasking) {
 +    memset(node_data, 0, sizeof(*node_data));
 +    return;
 +  }
 +
 +  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);
 +  }
 +}
 +
- bool SCULPT_vertex_is_occluded(SculptSession *ss, int vertex, bool original)
++bool SCULPT_vertex_is_occluded(SculptSession *ss, PBVHVertRef vertex, bool original)
 +{
 +  float ray_start[3], ray_end[3], ray_normal[3], face_normal[3];
 +  float co[3];
 +
 +  copy_v3_v3(co, SCULPT_vertex_co_get(ss, vertex));
 +  float mouse[2];
 +
 +  ED_view3d_project_float_v2_m4(ss->cache->vc->region, co, mouse, ss->cache->projection_mat);
 +
-   int depth = SCULPT_raycast_init(
-       ss->cache->vc, mouse, ray_end, ray_start, ray_normal, original);
++  int depth = SCULPT_raycast_init(ss->cache->vc, mouse, ray_end, ray_start, ray_normal, original);
 +
 +  negate_v3(ray_normal);
 +
 +  copy_v3_v3(ray_start, SCULPT_vertex_co_get(ss, vertex));
 +  madd_v3_v3fl(ray_start, ray_normal, 0.002);
 +
 +  SculptRaycastData srd = {0};
 +  srd.original = original;
 +  srd.ss = ss;
 +  srd.hit = false;
 +  srd.ray_start = ray_start;
 +  srd.ray_normal = ray_normal;
 +  srd.depth = depth;
 +  srd.face_normal = face_normal;
 +
 +  isect_ray_tri_watertight_v3_precalc(&srd.isect_precalc, ray_normal);
 +  BKE_pbvh_raycast(ss->pbvh, sculpt_raycast_cb, &srd, ray_start, ray_normal, srd.original);
 +
 +  return srd.hit;
 +}
 +
  /** \} */
diff --cc source/blender/editors/sculpt_paint/sculpt_automasking.cc
index 6b64af8a977,a9fe8cc4b2f..004fba98b68
--- a/source/blender/editors/sculpt_paint/sculpt_automasking.cc
+++ b/source/blender/editors/sculpt_paint/sculpt_automasking.cc
@@@ -107,51 -98,6 +107,51 @@@ static int sculpt_automasking_mode_effe
    return sculpt->automasking_flags;
  }
  
 +bool SCULPT_automasking_needs_normal(const SculptSession *ss,
 +                                     const Sculpt *sculpt,
 +                                     const Brush *brush)
 +{
 +  int flags = sculpt_automasking_mode_effective_bits(sculpt, brush);
 +
 +  return flags & (BRUSH_AUTOMASKING_BRUSH_NORMAL | BRUSH_AUTOMASKING_VIEW_NORMAL);
 +}
 +
 +static float sculpt_automasking_normal_calc(AutomaskingCache *automasking,
 +                                            SculptSession *ss,
-                                             int vertex,
++                                            PBVHVertRef vertex,
 +                                            const float normal[3],
 +                                            float limit_lower,
 +                                            float limit_upper,
 +                                            AutomaskingNodeData *automask_data)
 +{
 +  float normal_v[3];
 +
 +  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));
 +
 +  /* note that limit is pre-divided by M_PI */
 +
 +  if (angle > limit_lower && angle < limit_upper) {
 +    float t = 1.0f - (angle - limit_lower) / (limit_upper - limit_lower);
 +
 +    /* smoothstep */
 +    t = t * t * (3.0 - 2.0 * t);
 +
 +    return t;
 +  }
 +  else if (angle > limit_upper) {
 +    return 0.0f;
 +  }
 +
 +  return 1.0f;
 +}
 +
  static bool SCULPT_automasking_needs_factors_cache(const Sculpt *sd, const Brush *brush)
  {
  
@@@ -169,71 -114,9 +169,73 @@@
    return false;
  }
  
 +static float automasking_brush_normal_factor(AutomaskingCache *automasking,
 +                                             SculptSession *ss,
-                                              int vertex,
++                                             PBVHVertRef 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,
++                                            PBVHVertRef 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,
++                                               PBVHVertRef vertex,
 +                                               AutomaskingNodeData *automask_data)
 +{
-   if (!automasking->occluded[vertex]) {
-     automasking->occluded[vertex] = SCULPT_vertex_is_occluded(ss, vertex, true) ? 2 : 1;
++  int index = BKE_pbvh_vertex_to_index(ss->pbvh, vertex);
++
++  if (!automasking->occluded[index]) {
++    automasking->occluded[index] = SCULPT_vertex_is_occluded(ss, vertex, true) ? 2 : 1;
 +  }
 +
-   return automasking->occluded[vertex] == 2;
++  return automasking->occluded[index] == 2;
 +}
 +
  float SCULPT_automasking_factor_get(AutomaskingCache *automasking,
                                      SculptSession *ss,
-                                     int vert,
 -                                    PBVHVertRef vert)
++                                    PBVHVertRef vert,
 +                                    AutomaskingNodeData *automask_data)
  {
    if (!automasking) {
      return 1.0f;
@@@ -243,14 -128,9 +247,14 @@@
     * automasking information can't be computed in real time per vertex and needs to be
     * initialized for the whole mesh when the stroke star

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list