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:
parent
2b20931707
commit
21b6d78cd2
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue