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-04-15 21:49:53 +0300
committerPablo Dobarro <pablodp606@gmail.com>2020-05-05 18:14:30 +0300
commite6fab27d6a3476a08cadb7ff4ecbd467a1c0db74 (patch)
treef1289f56af410010b69fb8b3e8fd217df5cff9ae /source/blender/editors/sculpt_paint/sculpt.c
parent9d8a5834829c3a30048dffde2346878f71cbd5fb (diff)
Fix T75743: Implement restore for brushes that modify their own data
This implements the restore function for Draw Face Sets and Layer, which don't affect coordinates or masks directly. This is needed for the anchored and dot brush strokes. Layer frees the current displacement and a new one is created on each stroke sample. Draw Face Sets copies the data back from the first undo node to the mesh datalayer. Also fixes T75727 Reviewed By: jbakker Maniphest Tasks: T75727 Differential Revision: https://developer.blender.org/D7442
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 9b00feb1cf8..69345b70d1c 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -4157,8 +4157,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");
}
@@ -5283,6 +5282,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];
@@ -5298,13 +5314,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);
BKE_pbvh_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);
}
@@ -6842,6 +6851,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. */
@@ -6851,7 +6861,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);
+ }
}
}