Fix T99100: Undo/redo bugs with paint and gravity
You can now push multiple sculpt undo nodes of different types. This is necassary to handle paint tools that have gravity enabled.
This commit is contained in:
Submodule release/scripts/addons updated: c51e0bb179...807a64cdfc
@@ -1288,10 +1288,10 @@ void SCULPT_orig_vert_data_unode_init(SculptOrigVertData *data, Object *ob, Scul
|
||||
}
|
||||
}
|
||||
|
||||
void SCULPT_orig_vert_data_init(SculptOrigVertData *data, Object *ob, PBVHNode *node)
|
||||
void SCULPT_orig_vert_data_init(SculptOrigVertData *data, Object *ob, PBVHNode *node, SculptUndoType type)
|
||||
{
|
||||
SculptUndoNode *unode;
|
||||
unode = SCULPT_undo_push_node(ob, node, SCULPT_UNDO_COORDS);
|
||||
unode = SCULPT_undo_push_node(ob, node, type);
|
||||
SCULPT_orig_vert_data_unode_init(data, ob, unode);
|
||||
}
|
||||
|
||||
@@ -1382,7 +1382,7 @@ static void paint_mesh_restore_co_task_cb(void *__restrict userdata,
|
||||
unode = SCULPT_undo_push_node(data->ob, data->nodes[n], type);
|
||||
}
|
||||
else {
|
||||
unode = SCULPT_undo_get_node(data->nodes[n]);
|
||||
unode = SCULPT_undo_get_node(data->nodes[n], type);
|
||||
}
|
||||
|
||||
if (!unode) {
|
||||
@@ -3202,13 +3202,14 @@ static void do_brush_action_task_cb(void *__restrict userdata,
|
||||
SculptThreadedTaskData *data = userdata;
|
||||
SculptSession *ss = data->ob->sculpt;
|
||||
|
||||
bool need_coords = ss->cache->supports_gravity;
|
||||
|
||||
/* Face Sets modifications do a single undo push */
|
||||
if (data->brush->sculpt_tool == SCULPT_TOOL_DRAW_FACE_SETS) {
|
||||
BKE_pbvh_node_mark_redraw(data->nodes[n]);
|
||||
/* Draw face sets in smooth mode moves the vertices. */
|
||||
if (ss->cache->alt_smooth) {
|
||||
SCULPT_undo_push_node(data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
BKE_pbvh_node_mark_update(data->nodes[n]);
|
||||
need_coords = true;
|
||||
}
|
||||
}
|
||||
else if (data->brush->sculpt_tool == SCULPT_TOOL_MASK) {
|
||||
@@ -3220,6 +3221,10 @@ static void do_brush_action_task_cb(void *__restrict userdata,
|
||||
BKE_pbvh_node_mark_update_color(data->nodes[n]);
|
||||
}
|
||||
else {
|
||||
need_coords = true;
|
||||
}
|
||||
|
||||
if (need_coords) {
|
||||
SCULPT_undo_push_node(data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
BKE_pbvh_node_mark_update(data->nodes[n]);
|
||||
}
|
||||
@@ -4718,7 +4723,7 @@ static void sculpt_raycast_cb(PBVHNode *node, void *data_v, float *tmin)
|
||||
}
|
||||
else {
|
||||
/* Intersect with coordinates from before we started stroke. */
|
||||
SculptUndoNode *unode = SCULPT_undo_get_node(node);
|
||||
SculptUndoNode *unode = SCULPT_undo_get_node(node, SCULPT_UNDO_COORDS);
|
||||
origco = (unode) ? unode->co : NULL;
|
||||
use_origco = origco ? true : false;
|
||||
}
|
||||
@@ -4755,7 +4760,7 @@ static void sculpt_find_nearest_to_ray_cb(PBVHNode *node, void *data_v, float *t
|
||||
}
|
||||
else {
|
||||
/* Intersect with coordinates from before we started stroke. */
|
||||
SculptUndoNode *unode = SCULPT_undo_get_node(node);
|
||||
SculptUndoNode *unode = SCULPT_undo_get_node(node, SCULPT_UNDO_COORDS);
|
||||
origco = (unode) ? unode->co : NULL;
|
||||
use_origco = origco ? true : false;
|
||||
}
|
||||
|
||||
@@ -638,7 +638,7 @@ static void do_boundary_brush_bend_task_cb_ex(void *__restrict userdata,
|
||||
|
||||
PBVHVertexIter vd;
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
|
||||
const float disp = strength * sculpt_boundary_displacement_from_grab_delta_get(ss, boundary);
|
||||
float angle_factor = disp / ss->cache->radius;
|
||||
@@ -692,7 +692,7 @@ static void do_boundary_brush_slide_task_cb_ex(void *__restrict userdata,
|
||||
|
||||
PBVHVertexIter vd;
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
|
||||
const float disp = sculpt_boundary_displacement_from_grab_delta_get(ss, boundary);
|
||||
|
||||
@@ -738,7 +738,7 @@ static void do_boundary_brush_inflate_task_cb_ex(void *__restrict userdata,
|
||||
|
||||
PBVHVertexIter vd;
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
|
||||
const float disp = sculpt_boundary_displacement_from_grab_delta_get(ss, boundary);
|
||||
|
||||
@@ -784,7 +784,7 @@ static void do_boundary_brush_grab_task_cb_ex(void *__restrict userdata,
|
||||
|
||||
PBVHVertexIter vd;
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
|
||||
BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) {
|
||||
if (boundary->edit_info[vd.index].num_propagation_steps == -1) {
|
||||
@@ -827,7 +827,7 @@ static void do_boundary_brush_twist_task_cb_ex(void *__restrict userdata,
|
||||
|
||||
PBVHVertexIter vd;
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
|
||||
const float disp = strength * sculpt_boundary_displacement_from_grab_delta_get(ss, boundary);
|
||||
float angle_factor = disp / ss->cache->radius;
|
||||
@@ -881,7 +881,7 @@ static void do_boundary_brush_smooth_task_cb_ex(void *__restrict userdata,
|
||||
|
||||
PBVHVertexIter vd;
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
|
||||
BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) {
|
||||
if (boundary->edit_info[vd.index].num_propagation_steps == -1) {
|
||||
|
||||
@@ -1330,7 +1330,7 @@ static void do_thumb_brush_task_cb_ex(void *__restrict userdata,
|
||||
float(*proxy)[3];
|
||||
const float bstrength = ss->cache->bstrength;
|
||||
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
|
||||
proxy = BKE_pbvh_node_add_proxy(ss->pbvh, data->nodes[n])->co;
|
||||
|
||||
@@ -1403,7 +1403,7 @@ static void do_rotate_brush_task_cb_ex(void *__restrict userdata,
|
||||
float(*proxy)[3];
|
||||
const float bstrength = ss->cache->bstrength;
|
||||
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
|
||||
proxy = BKE_pbvh_node_add_proxy(ss->pbvh, data->nodes[n])->co;
|
||||
|
||||
@@ -1477,7 +1477,7 @@ static void do_layer_brush_task_cb_ex(void *__restrict userdata,
|
||||
PBVHVertexIter vd;
|
||||
SculptOrigVertData orig_data;
|
||||
const float bstrength = ss->cache->bstrength;
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
|
||||
SculptBrushTest test;
|
||||
SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape(
|
||||
@@ -1964,7 +1964,7 @@ static void do_grab_brush_task_cb_ex(void *__restrict userdata,
|
||||
float(*proxy)[3];
|
||||
const float bstrength = ss->cache->bstrength;
|
||||
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
|
||||
proxy = BKE_pbvh_node_add_proxy(ss->pbvh, data->nodes[n])->co;
|
||||
|
||||
@@ -2052,7 +2052,7 @@ static void do_elastic_deform_brush_task_cb_ex(void *__restrict userdata,
|
||||
|
||||
const float bstrength = ss->cache->bstrength;
|
||||
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
|
||||
proxy = BKE_pbvh_node_add_proxy(ss->pbvh, data->nodes[n])->co;
|
||||
|
||||
@@ -2163,7 +2163,7 @@ static void do_draw_sharp_brush_task_cb_ex(void *__restrict userdata,
|
||||
SculptOrigVertData orig_data;
|
||||
float(*proxy)[3];
|
||||
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
|
||||
proxy = BKE_pbvh_node_add_proxy(ss->pbvh, data->nodes[n])->co;
|
||||
|
||||
@@ -2247,7 +2247,7 @@ static void do_topology_slide_task_cb_ex(void *__restrict userdata,
|
||||
SculptOrigVertData orig_data;
|
||||
float(*proxy)[3];
|
||||
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
|
||||
proxy = BKE_pbvh_node_add_proxy(ss->pbvh, data->nodes[n])->co;
|
||||
|
||||
@@ -2404,7 +2404,7 @@ static void do_topology_relax_task_cb_ex(void *__restrict userdata,
|
||||
PBVHVertexIter vd;
|
||||
SculptOrigVertData orig_data;
|
||||
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
|
||||
BKE_pbvh_node_add_proxy(ss->pbvh, data->nodes[n]);
|
||||
|
||||
|
||||
@@ -93,7 +93,7 @@ static void color_filter_task_cb(void *__restrict userdata,
|
||||
const int mode = data->filter_type;
|
||||
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
|
||||
PBVHVertexIter vd;
|
||||
BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) {
|
||||
|
||||
@@ -281,7 +281,7 @@ static void mesh_filter_task_cb(void *__restrict userdata,
|
||||
const eSculptMeshFilterType filter_type = data->filter_type;
|
||||
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[i]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[i], SCULPT_UNDO_COORDS);
|
||||
|
||||
/* When using the relax face sets meshes filter,
|
||||
* each 3 iterations, do a whole mesh relax to smooth the contents of the Face Set. */
|
||||
|
||||
@@ -1029,7 +1029,10 @@ void SCULPT_face_sets_visibility_all_set(SculptSession *ss, bool visible);
|
||||
* Initialize a #SculptOrigVertData for accessing original vertex data;
|
||||
* handles #BMesh, #Mesh, and multi-resolution.
|
||||
*/
|
||||
void SCULPT_orig_vert_data_init(SculptOrigVertData *data, Object *ob, PBVHNode *node);
|
||||
void SCULPT_orig_vert_data_init(SculptOrigVertData *data,
|
||||
Object *ob,
|
||||
PBVHNode *node,
|
||||
SculptUndoType type);
|
||||
/**
|
||||
* Update a #SculptOrigVertData for a particular vertex from the PBVH iterator.
|
||||
*/
|
||||
@@ -1467,7 +1470,7 @@ void SCULPT_cache_free(StrokeCache *cache);
|
||||
* \{ */
|
||||
|
||||
SculptUndoNode *SCULPT_undo_push_node(Object *ob, PBVHNode *node, SculptUndoType type);
|
||||
SculptUndoNode *SCULPT_undo_get_node(PBVHNode *node);
|
||||
SculptUndoNode *SCULPT_undo_get_node(PBVHNode *node, SculptUndoType type);
|
||||
SculptUndoNode *SCULPT_undo_get_first_node(void);
|
||||
|
||||
/**
|
||||
|
||||
@@ -111,7 +111,7 @@ static void do_paint_brush_task_cb_ex(void *__restrict userdata,
|
||||
PBVHColorBufferNode *color_buffer;
|
||||
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COLOR);
|
||||
|
||||
color_buffer = BKE_pbvh_node_color_buffer_get(data->nodes[n]);
|
||||
|
||||
|
||||
@@ -156,7 +156,7 @@ static void do_pose_brush_task_cb_ex(void *__restrict userdata,
|
||||
float final_pos[3];
|
||||
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
|
||||
BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) {
|
||||
SCULPT_orig_vert_data_update(&orig_data, &vd);
|
||||
|
||||
@@ -460,7 +460,7 @@ static void SCULPT_do_surface_smooth_brush_laplacian_task_cb_ex(
|
||||
ss, &test, data->brush->falloff_shape);
|
||||
const int thread_id = BLI_task_parallel_thread_id(tls);
|
||||
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COORDS);
|
||||
|
||||
BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) {
|
||||
SCULPT_orig_vert_data_update(&orig_data, &vd);
|
||||
|
||||
@@ -150,7 +150,7 @@ static void sculpt_transform_task_cb(void *__restrict userdata,
|
||||
PBVHNode *node = data->nodes[i];
|
||||
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[i]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[i], SCULPT_UNDO_COORDS);
|
||||
|
||||
PBVHVertexIter vd;
|
||||
|
||||
@@ -221,7 +221,7 @@ static void sculpt_elastic_transform_task_cb(void *__restrict userdata,
|
||||
float(*proxy)[3] = BKE_pbvh_node_add_proxy(ss->pbvh, data->nodes[i])->co;
|
||||
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[i]);
|
||||
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[i], SCULPT_UNDO_COORDS);
|
||||
|
||||
KelvinletParams params;
|
||||
/* TODO(pablodp606): These parameters can be exposed if needed as transform strength and volume
|
||||
|
||||
@@ -961,7 +961,7 @@ static bool sculpt_undo_cleanup(bContext *C, ListBase *lb)
|
||||
}
|
||||
#endif
|
||||
|
||||
SculptUndoNode *SCULPT_undo_get_node(PBVHNode *node)
|
||||
SculptUndoNode *SCULPT_undo_get_node(PBVHNode *node, SculptUndoType type)
|
||||
{
|
||||
UndoSculpt *usculpt = sculpt_undo_get_nodes();
|
||||
|
||||
@@ -969,7 +969,13 @@ SculptUndoNode *SCULPT_undo_get_node(PBVHNode *node)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return BLI_findptr(&usculpt->nodes, node, offsetof(SculptUndoNode, node));
|
||||
LISTBASE_FOREACH (SculptUndoNode *, unode, &usculpt->nodes) {
|
||||
if (unode->node == node && unode->type == type) {
|
||||
return unode;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
SculptUndoNode *SCULPT_undo_get_first_node()
|
||||
@@ -1381,7 +1387,7 @@ SculptUndoNode *SCULPT_undo_push_node(Object *ob, PBVHNode *node, SculptUndoType
|
||||
BLI_thread_unlock(LOCK_CUSTOM1);
|
||||
return unode;
|
||||
}
|
||||
if ((unode = SCULPT_undo_get_node(node))) {
|
||||
if ((unode = SCULPT_undo_get_node(node, type))) {
|
||||
BLI_thread_unlock(LOCK_CUSTOM1);
|
||||
return unode;
|
||||
}
|
||||
|
||||
Submodule source/tools updated: ccc8fceb6b...01b4c0e4a1
Reference in New Issue
Block a user