Sculpt: array brush fixes
This commit is contained in:
parent
22bf9507f1
commit
8dda36655e
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue