[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, ¶ms);
- SCULPT_temp_customlayer_get(
- ss, ATTR_DOMAIN_POINT, CD_PROP_INT32, array_instance_cd_name, array->scl_inst, ¶ms);
-
SCULPT_temp_customlayer_ensure(
ss, ATTR_DOMAIN_POINT, CD_PROP_INT32, array_symmetry_pass_cd_name, ¶ms);
+
+ SCULPT_temp_customlayer_get(
+ ss, ATTR_DOMAIN_POINT, CD_PROP_INT32, array_instance_cd_name, array->scl_inst, ¶ms);
SCULPT_temp_customlayer_get(
ss, ATTR_DOMAIN_POINT, CD_PROP_INT32, array_symmetry_pass_cd_name, array->scl_sym, ¶ms);
}
@@ -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, ¶ms);
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,
+ ¶ms);
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, ¶ms);
+ SCULPT_temp_customlayer_get(
+ ss, ATTR_DOMAIN_POINT, CD_PROP_INT32, array_symmetry_pass_cd_name, array->scl_sym, ¶ms);
+
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