Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPablo Dobarro <pablodp606@gmail.com>2020-05-05 18:16:27 +0300
committerPablo Dobarro <pablodp606@gmail.com>2020-05-05 18:16:27 +0300
commit527c81c6f841c24c11c4d61fe2f36a0e6a01bbe0 (patch)
tree42872eca37b0e7bdcf157173a67b214cad42db25 /source/blender/editors/sculpt_paint/sculpt.c
parent9535dbcee0bde24f11457d17d0f4cd5424711e86 (diff)
parente6fab27d6a3476a08cadb7ff4ecbd467a1c0db74 (diff)
Merge branch 'blender-v2.83-release'
Diffstat (limited to 'source/blender/editors/sculpt_paint/sculpt.c')
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c40
1 files changed, 31 insertions, 9 deletions
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index ce5433f680e..9c026ce9be1 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -4165,8 +4165,7 @@ static void do_layer_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode
SculptSession *ss = ob->sculpt;
Brush *brush = BKE_paint_brush(&sd->paint);
- if (ss->cache->mirror_symmetry_pass == 0 && ss->cache->radial_symmetry_pass == 0 &&
- ss->cache->first_time) {
+ if (ss->cache->layer_displacement_factor == NULL) {
ss->cache->layer_displacement_factor = MEM_callocN(sizeof(float) * SCULPT_vertex_count_get(ss),
"layer displacement factor");
}
@@ -5299,6 +5298,23 @@ static void do_brush_action(Sculpt *sd, Object *ob, Brush *brush, UnifiedPaintSe
nodes = sculpt_pbvh_gather_generic(ob, sd, brush, use_original, radius_scale, &totnode);
}
+ /* Draw Face Sets in draw mode makes a single undo push, in alt-smooth mode deforms the
+ * vertices and uses regular coords undo. */
+ /* It also assings the paint_face_set here as it needs to be done regardless of the stroke type
+ * and the number of nodes under the brush influence. */
+ if (brush->sculpt_tool == SCULPT_TOOL_DRAW_FACE_SETS && ss->cache->first_time &&
+ ss->cache->mirror_symmetry_pass == 0 && !ss->cache->alt_smooth) {
+ SCULPT_undo_push_node(ob, NULL, SCULPT_UNDO_FACE_SETS);
+ if (ss->cache->invert) {
+ /* When inverting the brush, pick the paint face mask ID from the mesh. */
+ ss->cache->paint_face_set = SCULPT_active_face_set_get(ss);
+ }
+ else {
+ /* By default create a new Face Sets. */
+ ss->cache->paint_face_set = SCULPT_face_set_next_available_get(ss);
+ }
+ }
+
/* Only act if some verts are inside the brush area. */
if (totnode) {
float location[3];
@@ -5314,13 +5330,6 @@ static void do_brush_action(Sculpt *sd, Object *ob, Brush *brush, UnifiedPaintSe
BKE_pbvh_parallel_range_settings(&settings, (sd->flags & SCULPT_USE_OPENMP), totnode);
BLI_task_parallel_range(0, totnode, &task_data, do_brush_action_task_cb, &settings);
- /* Draw Face Sets in draw mode makes a single undo push, in alt-smooth mode deforms the
- * vertices and uses regular coords undo. */
- if (brush->sculpt_tool == SCULPT_TOOL_DRAW_FACE_SETS && ss->cache->first_time &&
- ss->cache->mirror_symmetry_pass == 0 && !ss->cache->alt_smooth) {
- SCULPT_undo_push_node(ob, nodes[0], SCULPT_UNDO_FACE_SETS);
- }
-
if (sculpt_brush_needs_normal(ss, brush)) {
update_sculpt_normal(sd, ob, nodes, totnode);
}
@@ -6858,6 +6867,7 @@ static void sculpt_brush_stroke_init(bContext *C, wmOperator *op)
static void sculpt_restore_mesh(Sculpt *sd, Object *ob)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush = BKE_paint_brush(&sd->paint);
/* Restore the mesh before continuing with anchored stroke. */
@@ -6867,7 +6877,19 @@ static void sculpt_restore_mesh(Sculpt *sd, Object *ob)
brush->sculpt_tool == SCULPT_TOOL_CLOTH) &&
BKE_brush_use_size_pressure(brush)) ||
(brush->flag & BRUSH_DRAG_DOT)) {
+
+ SculptUndoNode *unode = SCULPT_undo_get_first_node();
+ if (unode && unode->type == SCULPT_UNDO_FACE_SETS) {
+ for (int i = 0; i < ss->totfaces; i++) {
+ ss->face_sets[i] = unode->face_sets[i];
+ }
+ }
+
paint_mesh_restore_co(sd, ob);
+
+ if (ss->cache) {
+ MEM_SAFE_FREE(ss->cache->layer_displacement_factor);
+ }
}
}