Sculpt UI: Make DynTopo constant detail a resolution value
This should make it easier to sculpt in high resolutions, downside is that the new way to calculate maximum edge length is a bit less intuitive. Maximum edge length used to be calculated as blender_unit * percentage_value, now it's blender_unit / value. Reused old DNA struct member, but had to bump subversion to ensure correct compatibility conversion. Also changed default value slightly (would have had to set to 3.333... otherwise). Was Requested by @monio (see https://rightclickselect.com/p/sculpting/zpbbbc/dyntopo-better-scale-input-in-constant-detail-mode) and I think it's worth testing.
This commit is contained in:
parent
e00c3ab13f
commit
627141082b
@ -1560,7 +1560,7 @@ class VIEW3D_PT_sculpt_dyntopo(Panel, View3DPaintPanel):
|
||||
sub.active = (brush and brush.sculpt_tool != 'MASK')
|
||||
if (sculpt.detail_type_method == 'CONSTANT'):
|
||||
row = sub.row(align=True)
|
||||
row.prop(sculpt, "constant_detail")
|
||||
row.prop(sculpt, "constant_detail_resolution")
|
||||
row.operator("sculpt.sample_detail_size", text="", icon='EYEDROPPER')
|
||||
elif (sculpt.detail_type_method == 'BRUSH'):
|
||||
sub.prop(sculpt, "detail_percent")
|
||||
|
@ -28,7 +28,7 @@
|
||||
* and keep comment above the defines.
|
||||
* Use STRINGIFY() rather than defining with quotes */
|
||||
#define BLENDER_VERSION 278
|
||||
#define BLENDER_SUBVERSION 2
|
||||
#define BLENDER_SUBVERSION 3
|
||||
/* Several breakages with 270, e.g. constraint deg vs rad */
|
||||
#define BLENDER_MINVERSION 270
|
||||
#define BLENDER_MINSUBVERSION 6
|
||||
|
@ -1427,7 +1427,7 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main)
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
if (!MAIN_VERSION_ATLEAST(main, 278, 3)) {
|
||||
for (Scene *scene = main->scene.first; scene != NULL; scene = scene->id.next) {
|
||||
if (scene->toolsettings != NULL) {
|
||||
ToolSettings *ts = scene->toolsettings;
|
||||
@ -1454,5 +1454,16 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* constant detail for sculpting is now a resolution value instead of
|
||||
* a percentage, we reuse old DNA struct member but convert it */
|
||||
for (Scene *scene = main->scene.first; scene != NULL; scene = scene->id.next) {
|
||||
if (scene->toolsettings != NULL) {
|
||||
ToolSettings *ts = scene->toolsettings;
|
||||
if (ts->sculpt && ts->sculpt->constant_detail != 0.0f) {
|
||||
ts->sculpt->constant_detail = 100.0f / ts->sculpt->constant_detail;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2750,17 +2750,21 @@ void init_userdef_do_versions(void)
|
||||
}
|
||||
}
|
||||
|
||||
if (!USER_VERSION_ATLEAST(278, 3)) {
|
||||
for (bTheme *btheme = U.themes.first; btheme; btheme = btheme->next) {
|
||||
/* Keyframe Indicators (were using wrong alpha) */
|
||||
btheme->tv3d.time_keyframe[3] = btheme->tv3d.time_gp_keyframe[3] = 255;
|
||||
btheme->ttime.time_keyframe[3] = btheme->ttime.time_gp_keyframe[3] = 255;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Include next version bump.
|
||||
*
|
||||
* (keep this block even if it becomes empty).
|
||||
*/
|
||||
{
|
||||
for (bTheme *btheme = U.themes.first; btheme; btheme = btheme->next) {
|
||||
/* Keyframe Indicators (were using wrong alpha) */
|
||||
btheme->tv3d.time_keyframe[3] = btheme->tv3d.time_gp_keyframe[3] = 255;
|
||||
btheme->ttime.time_keyframe[3] = btheme->ttime.time_gp_keyframe[3] = 255;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (U.pixelsize == 0.0f)
|
||||
|
@ -4688,7 +4688,7 @@ static void sculpt_stroke_update_step(bContext *C, struct PaintStroke *UNUSED(st
|
||||
sculpt_restore_mesh(sd, ob);
|
||||
|
||||
if (sd->flags & SCULPT_DYNTOPO_DETAIL_CONSTANT) {
|
||||
BKE_pbvh_bmesh_detail_size_set(ss->pbvh, sd->constant_detail / 100.0f);
|
||||
BKE_pbvh_bmesh_detail_size_set(ss->pbvh, 1.0f / sd->constant_detail);
|
||||
}
|
||||
else if (sd->flags & SCULPT_DYNTOPO_DETAIL_BRUSH) {
|
||||
BKE_pbvh_bmesh_detail_size_set(ss->pbvh, ss->cache->radius * sd->detail_percent / 100.0f);
|
||||
@ -5406,7 +5406,7 @@ static int sculpt_mode_toggle_exec(bContext *C, wmOperator *op)
|
||||
if (!ts->sculpt->detail_percent)
|
||||
ts->sculpt->detail_percent = 25;
|
||||
if (ts->sculpt->constant_detail == 0.0f)
|
||||
ts->sculpt->constant_detail = 30.0f;
|
||||
ts->sculpt->constant_detail = 3.0f;
|
||||
|
||||
/* Set sane default tiling offsets */
|
||||
if (!ts->sculpt->paint.tile_offset[0]) ts->sculpt->paint.tile_offset[0] = 1.0f;
|
||||
@ -5543,7 +5543,7 @@ static int sculpt_detail_flood_fill_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
size = max_fff(bb_max[0], bb_max[1], bb_max[2]);
|
||||
|
||||
/* update topology size */
|
||||
BKE_pbvh_bmesh_detail_size_set(ss->pbvh, sd->constant_detail / 100.0f);
|
||||
BKE_pbvh_bmesh_detail_size_set(ss->pbvh, 1.0f / sd->constant_detail);
|
||||
|
||||
sculpt_undo_push_begin("Dynamic topology flood fill");
|
||||
sculpt_undo_push_node(ob, NULL, SCULPT_UNDO_COORDS);
|
||||
@ -5608,7 +5608,8 @@ static void sample_detail(bContext *C, int ss_co[2])
|
||||
ray_start, ray_normal, false);
|
||||
|
||||
if (srd.hit) {
|
||||
sd->constant_detail = srd.detail * 100.0f;
|
||||
/* convert edge length to detail resolution */
|
||||
sd->constant_detail = 1.0f / srd.detail;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1103,7 +1103,7 @@ typedef struct Sculpt {
|
||||
float gravity_factor;
|
||||
|
||||
/* scale for constant detail size */
|
||||
float constant_detail;
|
||||
float constant_detail; /* Constant detail resolution (Blender unit / constant_detail) */
|
||||
float detail_percent;
|
||||
float pad;
|
||||
|
||||
|
@ -600,10 +600,12 @@ static void rna_def_sculpt(BlenderRNA *brna)
|
||||
RNA_def_property_ui_text(prop, "Detail Percentage", "Maximum edge length for dynamic topology sculpting (in brush percenage)");
|
||||
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
|
||||
|
||||
prop = RNA_def_property(srna, "constant_detail", PROP_FLOAT, PROP_PERCENTAGE);
|
||||
RNA_def_property_range(prop, 0.001, 10000.0);
|
||||
RNA_def_property_ui_range(prop, 0.1, 100.0, 10, 2);
|
||||
RNA_def_property_ui_text(prop, "Detail Size", "Maximum edge length for dynamic topology sculpting (as percentage of blender unit)");
|
||||
prop = RNA_def_property(srna, "constant_detail_resolution", PROP_FLOAT, PROP_NONE);
|
||||
RNA_def_property_float_sdna(prop, NULL, "constant_detail");
|
||||
RNA_def_property_range(prop, 0.0001, FLT_MAX);
|
||||
RNA_def_property_ui_range(prop, 0.001, 1000.0, 10, 2);
|
||||
RNA_def_property_ui_text(prop, "Resolution", "Maximum edge length for dynamic topology sculpting (as divisor "
|
||||
"of blender unit - higher value means smaller edge length)");
|
||||
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
|
||||
|
||||
prop = RNA_def_property(srna, "use_smooth_shading", PROP_BOOLEAN, PROP_NONE);
|
||||
|
Loading…
x
Reference in New Issue
Block a user