Sculpt dyntopo: change brush defaults and fix bug

* Changed brush defaults a bit.  New defaults
  are for organic modeling.
* autosmooth_fset_slide now defaults to 1, so
  face set boundaries are smoothed but stick to mesh
  surface (if 0 they would function as hard edges).
* Weight by area smooth mode is on by default for all
  brushes.
* Cleaned up versioning code and made it
  kick in at 3.00:21, with some simple checks to
  try and detect existing data from beta testers.

* Also fixed a small crash bug.
This commit is contained in:
Joseph Eagar 2021-09-02 11:02:44 -07:00
parent 2b20931707
commit 21b6d78cd2
5 changed files with 65 additions and 58 deletions

View File

@ -1715,6 +1715,10 @@ void BKE_brush_sculpt_reset(Brush *br)
bool disable_dyntopo = false;
// basic face set setup for all organic brushes
br->autosmooth_fset_slide = 1.0f;
br->flag2 |= BRUSH_SMOOTH_PRESERVE_FACE_SETS | BRUSH_SMOOTH_USE_AREA_WEIGHT;
/* Brush settings */
switch (br->sculpt_tool) {
case SCULPT_TOOL_DRAW_SHARP:
@ -2653,7 +2657,7 @@ void BKE_brush_get_dyntopo(Brush *brush, Sculpt *sd, DynTopoSettings *out)
}
else if (!out->detail_size) {
brush->dyntopo.inherit |= DYNTOPO_INHERIT_DETAIL_SIZE;
brush->dyntopo.detail_size = 12.0;
brush->dyntopo.detail_size = 8.0f;
}
int inherit = out->inherit;

View File

@ -1943,7 +1943,7 @@ void BKE_sculpt_toolsettings_data_ensure(struct Scene *scene)
Sculpt *sd = scene->toolsettings->sculpt;
if (!sd->detail_size) {
sd->detail_size = 12;
sd->detail_size = 8.0f;
}
if (!sd->detail_range || !sd->dyntopo_spacing) {

View File

@ -1437,16 +1437,6 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
if (!MAIN_VERSION_ATLEAST(bmain, 293, 0)) {
for (Brush *br = bmain->brushes.first; br; br = br->id.next) {
if (br->sculpt_tool == SCULPT_TOOL_VCOL_BOUNDARY) {
if (br->vcol_boundary_exponent == 0.0f) {
br->vcol_boundary_exponent = 1.0f;
}
}
}
}
if (!MAIN_VERSION_ATLEAST(bmain, 292, 5)) {
/* Initialize the opacity of the overlay wireframe */
if (!DNA_struct_elem_find(fd->filesdna, "View3DOverlay", "float", "wireframe_opacity")) {
@ -1963,44 +1953,7 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
if (!MAIN_VERSION_ATLEAST(bmain, 293, 17)) {
LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
if (brush->dyntopo.detail_range == 0.0f) {
Brush defbrush = *brush;
BKE_brush_sculpt_reset(&defbrush);
brush->dyntopo = defbrush.dyntopo;
}
}
}
if (!MAIN_VERSION_ATLEAST(bmain, 293, 18)) {
LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
if (brush->sculpt_tool == SCULPT_TOOL_SIMPLIFY) {
brush->dyntopo.inherit = DYNTOPO_INHERIT_BITMASK &
~(DYNTOPO_INHERIT_ALL | DYNTOPO_SUBDIVIDE | DYNTOPO_COLLAPSE);
brush->dyntopo.flag |= DYNTOPO_COLLAPSE | DYNTOPO_SUBDIVIDE | DYNTOPO_CLEANUP;
}
}
Scene *scene;
for (scene = bmain->scenes.first; scene; scene = scene->id.next) {
ToolSettings *ts = scene->toolsettings;
if (ts->sculpt) {
ts->sculpt->flags |= SCULPT_DYNTOPO_CLEANUP;
}
}
}
if (!MAIN_VERSION_ATLEAST(bmain, 293, 14)) {
LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
ToolSettings *ts = scene->toolsettings;
if (ts && ts->sculpt) {
ts->sculpt->detail_range = 0.4f;
}
}
if (!DNA_struct_elem_find(fd->filesdna, "Lamp", "float", "diff_fac")) {
LISTBASE_FOREACH (Light *, light, &bmain->lights) {
light->diff_fac = 1.0f;

View File

@ -46,6 +46,7 @@
#include "BKE_action.h"
#include "BKE_animsys.h"
#include "BKE_asset.h"
#include "BKE_brush.h"
#include "BKE_collection.h"
#include "BKE_deform.h"
#include "BKE_fcurve.h"
@ -1111,6 +1112,59 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
if (!MAIN_VERSION_ATLEAST(bmain, 300, 21)) {
LISTBASE_FOREACH (Brush *, br, &bmain->brushes) {
if (br->autosmooth_fset_slide == 0.0f) {
Brush defbrush = *br;
BKE_brush_sculpt_reset(&defbrush);
br->dyntopo = defbrush.dyntopo;
br->flag2 |= defbrush.flag2 & (BRUSH_SMOOTH_PRESERVE_FACE_SETS |
BRUSH_SMOOTH_USE_AREA_WEIGHT | BRUSH_CURVATURE_RAKE);
br->autosmooth_fset_slide = defbrush.autosmooth_fset_slide;
br->boundary_smooth_factor = defbrush.boundary_smooth_factor;
br->autosmooth_spacing = defbrush.autosmooth_spacing;
br->autosmooth_radius_factor = defbrush.autosmooth_radius_factor;
br->topology_rake_radius_factor = defbrush.topology_rake_radius_factor;
br->topology_rake_projection = defbrush.topology_rake_projection;
br->topology_rake_spacing = defbrush.topology_rake_spacing;
if (br->autosmooth_projection == 0.0f) {
br->autosmooth_projection = defbrush.autosmooth_projection;
}
}
if (br->sculpt_tool == SCULPT_TOOL_VCOL_BOUNDARY) {
if (br->vcol_boundary_exponent == 0.0f) {
br->vcol_boundary_exponent = 1.0f;
}
}
else if (br->sculpt_tool == SCULPT_TOOL_SIMPLIFY) {
br->dyntopo.inherit = DYNTOPO_INHERIT_BITMASK &
~(DYNTOPO_INHERIT_ALL | DYNTOPO_SUBDIVIDE | DYNTOPO_COLLAPSE);
br->dyntopo.flag |= DYNTOPO_COLLAPSE | DYNTOPO_SUBDIVIDE | DYNTOPO_CLEANUP;
}
}
Scene *scene;
for (scene = bmain->scenes.first; scene; scene = scene->id.next) {
ToolSettings *ts = scene->toolsettings;
if (ts->sculpt) {
ts->sculpt->flags |= SCULPT_DYNTOPO_CLEANUP;
}
}
LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
ToolSettings *ts = scene->toolsettings;
if (ts && ts->sculpt) {
ts->sculpt->detail_range = 0.4f;
}
}
}
/**
* Versioning code until next subversion bump goes here.
*

View File

@ -1231,7 +1231,7 @@ bool SCULPT_vertex_has_unique_face_set(const SculptSession *ss, SculptVertRef in
if (mv->flag & DYNVERT_NEED_BOUNDARY) {
BKE_pbvh_update_vert_boundary(
ss->cd_dyn_vert, ss->cd_faceset_offset, v, ss->cache->boundary_symmetry);
ss->cd_dyn_vert, ss->cd_faceset_offset, v, ss->boundary_symmetry);
}
return !(mv->flag & DYNVERT_FSET_BOUNDARY);
@ -1743,10 +1743,8 @@ SculptCornerType SCULPT_vertex_is_corner(const SculptSession *ss,
MDynTopoVert *mv = BKE_PBVH_DYNVERT(ss->cd_dyn_vert, v);
if (mv->flag & DYNVERT_NEED_BOUNDARY) {
BKE_pbvh_update_vert_boundary(ss->cd_dyn_vert,
ss->cd_faceset_offset,
(BMVert *)vertex.i,
ss->cache->boundary_symmetry);
BKE_pbvh_update_vert_boundary(
ss->cd_dyn_vert, ss->cd_faceset_offset, (BMVert *)vertex.i, ss->boundary_symmetry);
}
ret = 0;
@ -1817,10 +1815,8 @@ SculptBoundaryType SCULPT_vertex_is_boundary(const SculptSession *ss,
MDynTopoVert *mv = BKE_PBVH_DYNVERT(ss->cd_dyn_vert, ((BMVert *)(vertex.i)));
if (mv->flag & DYNVERT_NEED_BOUNDARY) {
BKE_pbvh_update_vert_boundary(ss->cd_dyn_vert,
ss->cd_faceset_offset,
(BMVert *)vertex.i,
ss->cache->boundary_symmetry);
BKE_pbvh_update_vert_boundary(
ss->cd_dyn_vert, ss->cd_faceset_offset, (BMVert *)vertex.i, ss->boundary_symmetry);
}
int flag = 0;