[Bf-blender-cvs] [8dda36655ec] sculpt-dev: Sculpt: array brush fixes

Joseph Eagar noreply at git.blender.org
Tue Oct 5 12:34:29 CEST 2021


Commit: 8dda36655eca2e708619993ccd4bab3cf104c2e1
Author: Joseph Eagar
Date:   Tue Oct 5 03:34:15 2021 -0700
Branches: sculpt-dev
https://developer.blender.org/rB8dda36655eca2e708619993ccd4bab3cf104c2e1

Sculpt: array brush fixes

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

M	source/blender/blenkernel/intern/brush_channel_define.h
M	source/blender/blenkernel/intern/brush_engine_presets.c
M	source/blender/editors/sculpt_paint/sculpt_array.c

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

diff --git a/source/blender/blenkernel/intern/brush_channel_define.h b/source/blender/blenkernel/intern/brush_channel_define.h
index 86ad65113f2..9df57642975 100644
--- a/source/blender/blenkernel/intern/brush_channel_define.h
+++ b/source/blender/blenkernel/intern/brush_channel_define.h
@@ -559,6 +559,15 @@ MAKE_BOOL(use_smoothed_rake, "Smooth Raking", "Smooth angles of clay strips brus
 MAKE_BOOL(use_surface_falloff,  "Use Surface Falloff",
                            "Propagate the falloff of the brush trough the surface of the mesh", false)
 
+MAKE_ENUM(array_deform_type, "Deformation", "Deformation type that is used in the brush", BRUSH_ARRAY_DEFORM_LINEAR, {
+      {BRUSH_ARRAY_DEFORM_LINEAR, "LINEAR", "NONE", "Linear", ""},
+      {BRUSH_ARRAY_DEFORM_RADIAL, "RADIAL", "NONE", "Radial", ""},
+      {BRUSH_ARRAY_DEFORM_PATH, "PATH", "NONE", "Path", ""},
+      {-1}
+})
+
+MAKE_INT_EX(array_count, "Count", "Number of copies", 2, 1, 10000, 1, 50)
+
 //MAKE_FLOAT3_EX
 /* clang-format on */
 #if defined(BRUSH_CHANNEL_DEFINE_TYPES) || defined(BRUSH_CHANNEL_DEFINE_EXTERNAL)
diff --git a/source/blender/blenkernel/intern/brush_engine_presets.c b/source/blender/blenkernel/intern/brush_engine_presets.c
index a6f27d4651a..64bc031b0d3 100644
--- a/source/blender/blenkernel/intern/brush_engine_presets.c
+++ b/source/blender/blenkernel/intern/brush_engine_presets.c
@@ -447,6 +447,8 @@ static BrushSettingsMap brush_settings_map[] = {
   DEF(blend, blend, INT, INT)
   DEF(elastic_deform_volume_preservation, elastic_deform_volume_preservation, FLOAT, FLOAT)
   DEF(smooth_deform_type, smooth_deform_type, INT, INT)
+  DEF(array_deform_type, array_deform_type, INT, INT)
+  DEF(array_count, array_count, INT, INT)
 };
 
 static const int brush_settings_map_len = ARRAY_SIZE(brush_settings_map);
@@ -1058,6 +1060,11 @@ void BKE_brush_builtin_patch(Brush *brush, int tool)
       break;
     case SCULPT_TOOL_ELASTIC_DEFORM:
       ADDCH(use_grab_active_vertex);
+      break;
+    case SCULPT_TOOL_ARRAY:
+      ADDCH(array_deform_type);
+      ADDCH(array_count);
+
       break;
     case SCULPT_TOOL_CLAY_STRIPS:
       if (set_mappings) {
@@ -1401,6 +1408,13 @@ void BKE_brush_channelset_ui_init(Brush *brush, int tool)
     case SCULPT_TOOL_ELASTIC_DEFORM:
       SHOWWRK(elastic_deform_type);
       SHOWCTX(elastic_deform_type);
+      break;
+    case SCULPT_TOOL_ARRAY:
+      SHOWWRK(array_deform_type);
+      SHOWCTX(array_deform_type);
+
+      SHOWALL(array_count);
+
       break;
   }
 
diff --git a/source/blender/editors/sculpt_paint/sculpt_array.c b/source/blender/editors/sculpt_paint/sculpt_array.c
index 4f35d0de1f6..b837f9a0dfd 100644
--- a/source/blender/editors/sculpt_paint/sculpt_array.c
+++ b/source/blender/editors/sculpt_paint/sculpt_array.c
@@ -96,11 +96,11 @@ static void sculpt_array_datalayers_init(SculptArray *array, SculptSession *ss)
 
   SCULPT_temp_customlayer_ensure(
       ss, ATTR_DOMAIN_POINT, CD_PROP_INT32, array_instance_cd_name, &params);
-  SCULPT_temp_customlayer_get(
-      ss, ATTR_DOMAIN_POINT, CD_PROP_INT32, array_instance_cd_name, array->scl_inst, &params);
-
   SCULPT_temp_customlayer_ensure(
       ss, ATTR_DOMAIN_POINT, CD_PROP_INT32, array_symmetry_pass_cd_name, &params);
+
+  SCULPT_temp_customlayer_get(
+      ss, ATTR_DOMAIN_POINT, CD_PROP_INT32, array_instance_cd_name, array->scl_inst, &params);
   SCULPT_temp_customlayer_get(
       ss, ATTR_DOMAIN_POINT, CD_PROP_INT32, array_symmetry_pass_cd_name, array->scl_sym, &params);
 }
@@ -117,6 +117,7 @@ static void sculpt_array_datalayers_add(SculptArray *array, SculptSession *ss, M
     SculptVertRef vertex = BKE_pbvh_table_index_to_vertex(ss->pbvh, i);
 
     *(int *)SCULPT_temp_cdata_get(vertex, scl) = ARRAY_INSTANCE_ORIGINAL;
+    *(int *)SCULPT_temp_cdata_get(vertex, array->scl_sym) = 0;
   }
 }
 
@@ -124,18 +125,59 @@ ATTR_NO_OPT void SCULPT_array_datalayers_free(SculptArray *array, Object *ob)
 {
   SculptSession *ss = ob->sculpt;
 
+#if 0
+  Mesh *mesh = BKE_object_get_original_mesh(ob);
+
+  // update cdata pointers for SCULPT_temp_customlayer_release
+  if (BKE_pbvh_type(ss->pbvh) != PBVH_BMESH) {
+    ss->vdata = &mesh->vdata;
+    ss->edata = &mesh->edata;
+    ss->ldata = &mesh->ldata;
+    ss->pdata = &mesh->pdata;
+
+    ss->mvert = (MVert *)CustomData_get_layer(ss->vdata, CD_MVERT);
+    ss->medge = (MEdge *)CustomData_get_layer(ss->edata, CD_MEDGE);
+    ss->mloop = (MLoop *)CustomData_get_layer(ss->ldata, CD_MLOOP);
+    ss->mpoly = (MPoly *)CustomData_get_layer(ss->pdata, CD_MPOLY);
+
+    ss->face_sets = (int *)CustomData_get_layer(ss->pdata, CD_SCULPT_FACE_SETS);
+
+    ss->totfaces = ss->totpoly = mesh->totpoly;
+    ss->totedges = mesh->totedge;
+
+    if (BKE_pbvh_type(ss->pbvh) == PBVH_FACES) {
+      ss->totvert = mesh->totvert;
+    }
+
+    BKE_sculptsession_check_mdyntopo(ss, ss->pbvh, SCULPT_vertex_count_get(ss));
+  }
+#endif
+
+  SculptLayerParams params = {.permanent = true, .simple_array = false};
+
   if (array->scl_inst) {
+    SCULPT_temp_customlayer_get(
+        ss, ATTR_DOMAIN_POINT, CD_PROP_INT32, array_instance_cd_name, array->scl_inst, &params);
     SCULPT_temp_customlayer_release(ss, array->scl_inst);
   }
 
   if (array->scl_sym) {
+    SCULPT_temp_customlayer_get(ss,
+                                ATTR_DOMAIN_POINT,
+                                CD_PROP_INT32,
+                                array_symmetry_pass_cd_name,
+                                array->scl_sym,
+                                &params);
     SCULPT_temp_customlayer_release(ss, array->scl_sym);
   }
 
+  SCULPT_update_customdata_refs(ss);
+
   array->scl_inst = NULL;
   array->scl_sym = NULL;
-  return;
-  Mesh *mesh = BKE_object_get_original_mesh(ob);
+
+#if 0
+  // Mesh *mesh = BKE_object_get_original_mesh(ob);
   int v_layer_index = CustomData_get_named_layer_index(
       &mesh->vdata, CD_PROP_INT32, array_instance_cd_name);
   if (v_layer_index != -1) {
@@ -147,6 +189,7 @@ ATTR_NO_OPT void SCULPT_array_datalayers_free(SculptArray *array, Object *ob)
   if (v_layer_index != -1) {
     CustomData_free_layer(&mesh->vdata, CD_PROP_INT32, mesh->totvert, v_layer_index);
   }
+#endif
 }
 
 const float source_geometry_threshold = 0.5f;
@@ -296,6 +339,15 @@ ATTR_NO_OPT static void sculpt_array_ensure_geometry_indices(Object *ob, SculptA
   SculptSession *ss = ob->sculpt;
   int totvert = SCULPT_vertex_count_get(ss);
 
+  SCULPT_update_customdata_refs(ss);
+
+  SculptLayerParams params = {.permanent = true, .simple_array = false};
+
+  SCULPT_temp_customlayer_get(
+      ss, ATTR_DOMAIN_POINT, CD_PROP_INT32, array_instance_cd_name, array->scl_inst, &params);
+  SCULPT_temp_customlayer_get(
+      ss, ATTR_DOMAIN_POINT, CD_PROP_INT32, array_symmetry_pass_cd_name, array->scl_sym, &params);
+
   array->copy_index = MEM_malloc_arrayN(totvert, sizeof(int), "array copy index");
   array->symmetry_pass = MEM_malloc_arrayN(totvert, sizeof(int), "array symmetry pass index");
 
@@ -520,7 +572,10 @@ static void sculpt_array_update_copy(StrokeCache *cache,
   float scale = 1.0f;
   float direction[3];
 
-  eBrushArrayDeformType array_type = brush->array_deform_type;
+  BrushChannelSet *chset = cache->channels_final ? cache->channels_final : brush->channels;
+  eBrushArrayDeformType array_type = BRUSHSET_GET_INT(
+      chset, array_deform_type, &cache->input_mapping);
+
   float delta[3];
   copy_v3_v3(delta, sculpt_array_delta_from_path(array));
 
@@ -1002,7 +1057,7 @@ ATTR_NO_OPT void SCULPT_do_array_brush(Sculpt *sd, Object *ob, PBVHNode **nodes,
     return;
   }
 
-  if (brush->array_count == 0) {
+  if (SCULPT_get_int(ss, array_count, sd, brush) == 0) {
     return;
   }
 
@@ -1016,7 +1071,9 @@ ATTR_NO_OPT void SCULPT_do_array_brush(Sculpt *sd, Object *ob, PBVHNode **nodes,
       sculpt_array_cache_free(ss->array);
     }
 
-    ss->array = sculpt_array_cache_create(ob, brush->array_deform_type, brush->array_count);
+    ss->array = sculpt_array_cache_create(ob,
+                                          SCULPT_get_int(ss, array_deform_type, sd, brush),
+                                          SCULPT_get_int(ss, array_count, sd, brush));
     sculpt_array_init(ob, brush, ss->array);
     sculpt_array_stroke_sample_add(ob, ss->array);
     sculpt_array_mesh_build(sd, ob, ss->array);



More information about the Bf-blender-cvs mailing list