[Bf-blender-cvs] [1199b9e6789] sculpt-dev: Merge branch 'master' into sculpt-dev

Pablo Dobarro noreply at git.blender.org
Wed Dec 16 21:36:54 CET 2020


Commit: 1199b9e6789b2f3386add6548027e0a25b81158a
Author: Pablo Dobarro
Date:   Wed Dec 16 19:10:48 2020 +0100
Branches: sculpt-dev
https://developer.blender.org/rB1199b9e6789b2f3386add6548027e0a25b81158a

Merge branch 'master' into sculpt-dev

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



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

diff --cc source/blender/blenloader/intern/versioning_defaults.c
index 0d32e5f9494,198f65b9794..47c6acef30c
--- a/source/blender/blenloader/intern/versioning_defaults.c
+++ b/source/blender/blenloader/intern/versioning_defaults.c
@@@ -739,14 -739,14 +739,22 @@@ void BLO_update_defaults_startup_blend(
        brush->sculpt_tool = SCULPT_TOOL_DISPLACEMENT_ERASER;
      }
  
+     brush_name = "Multires Displacement Smear";
+     brush = BLI_findstring(&bmain->brushes, brush_name, offsetof(ID, name) + 2);
+     if (!brush) {
+       brush = BKE_brush_add(bmain, brush_name, OB_MODE_SCULPT);
+       id_us_min(&brush->id);
+       brush->sculpt_tool = SCULPT_TOOL_DISPLACEMENT_SMEAR;
+     }
+ 
 +    brush_name = "Fairing";
 +    brush = BLI_findstring(&bmain->brushes, brush_name, offsetof(ID, name) + 2);
 +    if (!brush) {
 +      brush = BKE_brush_add(bmain, brush_name, OB_MODE_SCULPT);
 +      id_us_min(&brush->id);
 +      brush->sculpt_tool = SCULPT_TOOL_FAIRING;
 +    }
 +
      /* Use the same tool icon color in the brush cursor */
      for (brush = bmain->brushes.first; brush; brush = brush->id.next) {
        if (brush->ob_mode & OB_MODE_SCULPT) {
diff --cc source/blender/editors/sculpt_paint/sculpt.c
index af5e107f8d8,26db2673335..e9ecfb0b00a
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@@ -1228,8 -1226,8 +1228,9 @@@ static bool sculpt_tool_is_proxy_used(c
    return ELEM(sculpt_tool,
                SCULPT_TOOL_SMOOTH,
                SCULPT_TOOL_LAYER,
 +              SCULPT_TOOL_FAIRING,
                SCULPT_TOOL_POSE,
+               SCULPT_TOOL_DISPLACEMENT_SMEAR,
                SCULPT_TOOL_BOUNDARY,
                SCULPT_TOOL_CLOTH,
                SCULPT_TOOL_PAINT,
@@@ -3108,164 -3105,147 +3110,305 @@@ static void do_displacement_eraser_brus
  
  /** \} */
  
 +/* -------------------------------------------------------------------- */
 +/** \name Sculpt Multires Displacement Eraser Brush
 + * \{ */
 +
 +static void do_fairing_brush_tag_store_task_cb_ex(void *__restrict userdata,
 +                                                  const int n,
 +                                                  const TaskParallelTLS *__restrict tls)
 +{
 +  SculptThreadedTaskData *data = userdata;
 +  SculptSession *ss = data->ob->sculpt;
 +  SculptBrushTest test;
 +  SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape(
 +      ss, &test, data->brush->falloff_shape);
 +  PBVHVertexIter vd;
 +
 +  const float bstrength = clamp_f(ss->cache->bstrength, 0.0f, 1.0f);
 +  const Brush *brush = data->brush;
 +
 +  const int thread_id = BLI_task_parallel_thread_id(tls);
 +
 +  BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
 +  {
 +    if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
 +      continue;
 +    }
 +
 +    if (SCULPT_vertex_is_boundary(ss, vd.index)) {
 +      continue;
 +    }
 +
 +    const float fade = bstrength * SCULPT_brush_strength_factor(ss,
 +                                                                brush,
 +                                                                ss->cache->prefairing_co[vd.index],
 +                                                                sqrtf(test.dist),
 +                                                                vd.no,
 +                                                                vd.fno,
 +                                                                vd.mask ? *vd.mask : 0.0f,
 +                                                                vd.index,
 +                                                                thread_id);
 +
 +    if (fade == 0.0f) {
 +      continue;
 +    }
 +
 +    ss->cache->fairing_fade[vd.index] = max_ff(fade, ss->cache->fairing_fade[vd.index]);
 +    ss->cache->fairing_mask[vd.index] = true;
 +  }
 +  BKE_pbvh_vertex_iter_end;
 +}
 +
 +static void do_fairing_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
 +{
 +  SculptSession *ss = ob->sculpt;
 +  Brush *brush = BKE_paint_brush(&sd->paint);
 +  const int totvert = SCULPT_vertex_count_get(ss);
 +
 +  if (BKE_pbvh_type(ss->pbvh) == PBVH_GRIDS) {
 +    return;
 +  }
 +
 +  if (!ss->cache->fairing_mask) {
 +    ss->cache->fairing_mask = MEM_malloc_arrayN(totvert, sizeof(bool), "fairing_mask");
 +    ss->cache->fairing_fade = MEM_malloc_arrayN(totvert, sizeof(float), "fairing_fade");
 +    ss->cache->prefairing_co = MEM_malloc_arrayN(totvert, sizeof(float) * 3, "prefairing_co");
 +  }
 +
 +  if (SCULPT_stroke_is_main_symmetry_pass(ss->cache)) {
 +    for (int i = 0; i < totvert; i++) {
 +      ss->cache->fairing_mask[i] = false;
 +      ss->cache->fairing_fade[i] = 0.0f;
 +      copy_v3_v3(ss->cache->prefairing_co[i], SCULPT_vertex_co_get(ss, i));
 +    }
 +  }
 +
 +  SCULPT_boundary_info_ensure(ob);
 +
 +  /* Threaded loop over nodes. */
 +  SculptThreadedTaskData data = {
 +      .sd = sd,
 +      .ob = ob,
 +      .brush = brush,
 +      .nodes = nodes,
 +  };
 +
 +  TaskParallelSettings settings;
 +  BKE_pbvh_parallel_range_settings(&settings, true, totnode);
 +  BLI_task_parallel_range(0, totnode, &data, do_fairing_brush_tag_store_task_cb_ex, &settings);
 +}
 +
 +static void do_fairing_brush_displace_task_cb_ex(void *__restrict userdata,
 +                                                 const int n,
 +                                                 const TaskParallelTLS *__restrict UNUSED(tls))
 +{
 +  SculptThreadedTaskData *data = userdata;
 +  SculptSession *ss = data->ob->sculpt;
 +  PBVHVertexIter vd;
 +  BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
 +  {
 +    if (!ss->cache->fairing_mask[vd.index]) {
 +      continue;
 +    }
 +    float disp[3];
 +    sub_v3_v3v3(disp, vd.co, ss->cache->prefairing_co[vd.index]);
 +    mul_v3_fl(disp, ss->cache->fairing_fade[vd.index]);
 +    copy_v3_v3(vd.co, ss->cache->prefairing_co[vd.index]);
 +    add_v3_v3(vd.co, disp);
 +    if (vd.mvert) {
 +      vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
 +    }
 +  }
 +  BKE_pbvh_vertex_iter_end;
 +}
 +
 +static void sculpt_fairing_brush_exec_fairing_for_cache(Sculpt *sd, Object *ob)
 +{
 +  SculptSession *ss = ob->sculpt;
 +  BLI_assert(BKE_pbvh_type(ss->pbvh) != PBVH_GRIDS);
 +  BLI_assert(ss->cache);
 +  Brush *brush = BKE_paint_brush(&sd->paint);
 +  Mesh *mesh = ob->data;
 +
 +  if (!ss->cache->fairing_mask) {
 +    return;
 +  }
 +
 +  switch (BKE_pbvh_type(ss->pbvh)) {
 +    case PBVH_FACES: {
 +      MVert *mvert = SCULPT_mesh_deformed_mverts_get(ss);
 +      BKE_mesh_prefair_and_fair_vertices(
 +          mesh, mvert, ss->cache->fairing_mask, MESH_FAIRING_DEPTH_TANGENCY);
 +    } break;
 +    case PBVH_BMESH: {
 +      BKE_bmesh_prefair_and_fair_vertices(
 +          ss->bm, ss->cache->fairing_mask, MESH_FAIRING_DEPTH_TANGENCY);
 +    } break;
 +    case PBVH_GRIDS:
 +      BLI_assert(false);
 +  }
 +
 +  PBVHNode **nodes;
 +  int totnode;
 +  BKE_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode);
 +
 +  SculptThreadedTaskData data = {
 +      .sd = sd,
 +      .ob = ob,
 +      .brush = brush,
 +      .nodes = nodes,
 +  };
 +
 +  TaskParallelSettings settings;
 +  BKE_pbvh_parallel_range_settings(&settings, true, totnode);
 +  BLI_task_parallel_range(0, totnode, &data, do_fairing_brush_displace_task_cb_ex, &settings);
 +  MEM_freeN(nodes);
 +}
 +
 +/** \} */
 +
+ /** \name Sculpt Multires Displacement Smear Brush
+  * \{ */
+ 
+ static void do_displacement_smear_brush_task_cb_ex(void *__restrict userdata,
+                                                    const int n,
+                                                    const TaskParallelTLS *__restrict tls)
+ {
+   SculptThreadedTaskData *data = userdata;
+   SculptSession *ss = data->ob->sculpt;
+   const Brush *brush = data->brush;
+   const float bstrength = clamp_f(ss->cache->bstrength, 0.0f, 1.0f);
+ 
+   SculptBrushTest test;
+   SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape(
+       ss, &test, data->brush->falloff_shape);
+   const int thread_id = BLI_task_parallel_thread_id(tls);
+ 
+   PBVHVertexIter vd;
+   BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
+   {
+     if (!sculpt_brush_test_sq_fn(&test, vd.co)) {
+       continue;
+     }
+     const float fade = bstrength * SCULPT_brush_strength_factor(ss,
+                                                                 brush,
+                                                                 vd.co,
+                                                                 sqrtf(test.dist),
+                                                                 vd.no,
+                                                                 vd.fno,
+                                                                 vd.mask ? *vd.mask : 0.0f,
+                                                                 vd.index,
+                                                                 thread_id);
+ 
+     float current_disp[3];
+     float current_disp_norm[3];
+     float interp_limit_surface_disp[3];
+ 
+     copy_v3_v3(interp_limit_surface_disp, ss->cache->prev_displacement[vd.index]);
+ 
+     switch (brush->smear_deform_type) {
+       case BRUSH_SMEAR_DEFORM_DRAG:
+         sub_v3_v3v3(current_disp, ss->cache->location, ss->cache->last_location);
+         break;
+       case BRUSH_SMEAR_DEFORM_PINCH:
+         sub_v3_v3v3(current_disp, ss->cache->location, vd.co);
+         break;
+       case BRUSH_SMEAR_DEFORM_EXPAND:
+         sub_v3_v3v3(current_disp, vd.co, ss->cache->location);
+         break;
+     }
+ 
+     normalize_v3_v3(current_disp_norm, current_disp);
+     mul_v3_v3fl(current_disp, current_disp_norm, ss->cache->bstrength);
+ 
+     float weights_accum = 1.0f;
+ 
+     SculptVertexNeighborIter ni;
+     SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vd.index, ni) {
+       float vertex_disp[3];
+       float vertex_disp_norm[3];
+       float neighbor_limit_co[3];
+       SCULPT_vertex_limit_surface_get(ss, ni.index, neighbor_limit_co);
+       sub_v3_v3v3(vertex_disp,
+                   ss->cache->limit_surface_co[ni.index],
+                   ss->cache->limit_surface_co[vd.i

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list