Cleanup: Use enum class for some sculpt enums
Benefits are stronger type safety and prettier code.
This commit is contained in:
parent
251069ae5b
commit
9f5878b628
|
@ -112,7 +112,7 @@ void mesh_show_all(Object &object, const Span<PBVHNode *> nodes)
|
|||
for (PBVHNode *node : nodes.slice(range)) {
|
||||
const Span<int> verts = BKE_pbvh_node_get_vert_indices(node);
|
||||
if (std::any_of(verts.begin(), verts.end(), [&](const int i) { return hide_vert[i]; })) {
|
||||
SCULPT_undo_push_node(&object, node, SCULPT_UNDO_HIDDEN);
|
||||
SCULPT_undo_push_node(&object, node, SculptUndoType::HideVert);
|
||||
BKE_pbvh_node_mark_rebuild_draw(node);
|
||||
}
|
||||
}
|
||||
|
@ -159,7 +159,7 @@ static void vert_hide_update(Object &object,
|
|||
}
|
||||
|
||||
any_changed = true;
|
||||
SCULPT_undo_push_node(&object, node, SCULPT_UNDO_HIDDEN);
|
||||
SCULPT_undo_push_node(&object, node, SculptUndoType::HideVert);
|
||||
array_utils::scatter(new_hide.as_span(), verts, hide_vert.span);
|
||||
|
||||
BKE_pbvh_node_mark_update_visibility(node);
|
||||
|
@ -248,7 +248,7 @@ void grids_show_all(Depsgraph &depsgraph, Object &object, const Span<PBVHNode *>
|
|||
}))
|
||||
{
|
||||
any_changed = true;
|
||||
SCULPT_undo_push_node(&object, node, SCULPT_UNDO_HIDDEN);
|
||||
SCULPT_undo_push_node(&object, node, SculptUndoType::HideVert);
|
||||
BKE_pbvh_node_mark_rebuild_draw(node);
|
||||
}
|
||||
}
|
||||
|
@ -296,7 +296,7 @@ static void grid_hide_update(Depsgraph &depsgraph,
|
|||
}
|
||||
|
||||
any_changed = true;
|
||||
SCULPT_undo_push_node(&object, node, SCULPT_UNDO_HIDDEN);
|
||||
SCULPT_undo_push_node(&object, node, SculptUndoType::HideVert);
|
||||
|
||||
for (const int i : grids.index_range()) {
|
||||
grid_hidden[grids[i]].copy_from(new_hide[i].as_span());
|
||||
|
@ -441,7 +441,7 @@ static void partialvis_update_bmesh(Object *ob,
|
|||
bool any_changed = false;
|
||||
bool any_visible = false;
|
||||
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_HIDDEN);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::HideVert);
|
||||
|
||||
partialvis_update_bmesh_verts(bm,
|
||||
BKE_pbvh_bmesh_node_unique_verts(node),
|
||||
|
@ -633,7 +633,7 @@ static void invert_visibility_mesh(Object &object, const Span<PBVHNode *> nodes)
|
|||
|
||||
threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) {
|
||||
for (PBVHNode *node : nodes.slice(range)) {
|
||||
SCULPT_undo_push_node(&object, node, SCULPT_UNDO_HIDDEN);
|
||||
SCULPT_undo_push_node(&object, node, SculptUndoType::HideVert);
|
||||
for (const int vert : BKE_pbvh_node_get_unique_vert_indices(node)) {
|
||||
hide_vert.span[vert] = !hide_vert.span[vert];
|
||||
}
|
||||
|
@ -657,7 +657,7 @@ static void invert_visibility_grids(Depsgraph &depsgraph,
|
|||
|
||||
threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) {
|
||||
for (PBVHNode *node : nodes.slice(range)) {
|
||||
SCULPT_undo_push_node(&object, node, SCULPT_UNDO_HIDDEN);
|
||||
SCULPT_undo_push_node(&object, node, SculptUndoType::HideVert);
|
||||
for (const int i : BKE_pbvh_node_get_grid_indices(*node)) {
|
||||
bits::invert(grid_hidden[i]);
|
||||
}
|
||||
|
@ -674,7 +674,7 @@ static void invert_visibility_bmesh(Object &object, const Span<PBVHNode *> nodes
|
|||
{
|
||||
threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) {
|
||||
for (PBVHNode *node : nodes.slice(range)) {
|
||||
SCULPT_undo_push_node(&object, node, SCULPT_UNDO_HIDDEN);
|
||||
SCULPT_undo_push_node(&object, node, SculptUndoType::HideVert);
|
||||
bool fully_hidden = true;
|
||||
for (BMVert *vert : BKE_pbvh_bmesh_node_unique_verts(node)) {
|
||||
BM_elem_flag_toggle(vert, BM_ELEM_HIDDEN);
|
||||
|
|
|
@ -188,7 +188,7 @@ static bool try_remove_mask_mesh(Object &object, const Span<PBVHNode *> nodes)
|
|||
if (std::all_of(verts.begin(), verts.end(), [&](const int i) { return mask[i] == 0.0f; })) {
|
||||
continue;
|
||||
}
|
||||
SCULPT_undo_push_node(&object, node, SCULPT_UNDO_MASK);
|
||||
SCULPT_undo_push_node(&object, node, SculptUndoType::Mask);
|
||||
BKE_pbvh_node_mark_redraw(node);
|
||||
}
|
||||
});
|
||||
|
@ -219,7 +219,7 @@ static void fill_mask_mesh(Object &object, const float value, const Span<PBVHNod
|
|||
if (std::all_of(verts.begin(), verts.end(), [&](int i) { return mask.span[i] == value; })) {
|
||||
continue;
|
||||
}
|
||||
SCULPT_undo_push_node(&object, node, SCULPT_UNDO_MASK);
|
||||
SCULPT_undo_push_node(&object, node, SculptUndoType::Mask);
|
||||
mask.span.fill_indices(verts, value);
|
||||
BKE_pbvh_node_mark_redraw(node);
|
||||
}
|
||||
|
@ -265,7 +265,7 @@ static void fill_mask_grids(Main &bmain,
|
|||
{
|
||||
continue;
|
||||
}
|
||||
SCULPT_undo_push_node(&object, node, SCULPT_UNDO_MASK);
|
||||
SCULPT_undo_push_node(&object, node, SculptUndoType::Mask);
|
||||
|
||||
if (grid_hidden.is_empty()) {
|
||||
for (const int grid : grid_indices) {
|
||||
|
@ -306,7 +306,7 @@ static void fill_mask_bmesh(Object &object, const float value, const Span<PBVHNo
|
|||
return;
|
||||
}
|
||||
|
||||
SCULPT_undo_push_node(&object, nodes.first(), SCULPT_UNDO_MASK);
|
||||
SCULPT_undo_push_node(&object, nodes.first(), SculptUndoType::Mask);
|
||||
threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) {
|
||||
for (PBVHNode *node : nodes.slice(range)) {
|
||||
bool redraw = false;
|
||||
|
@ -361,7 +361,7 @@ static void invert_mask_mesh(Object &object, const Span<PBVHNode *> nodes)
|
|||
".sculpt_mask", ATTR_DOMAIN_POINT);
|
||||
threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) {
|
||||
for (PBVHNode *node : nodes.slice(range)) {
|
||||
SCULPT_undo_push_node(&object, node, SCULPT_UNDO_MASK);
|
||||
SCULPT_undo_push_node(&object, node, SculptUndoType::Mask);
|
||||
for (const int vert : BKE_pbvh_node_get_unique_vert_indices(node)) {
|
||||
if (!hide_vert.is_empty() && hide_vert[vert]) {
|
||||
continue;
|
||||
|
@ -392,7 +392,7 @@ static void invert_mask_grids(Main &bmain,
|
|||
const Span<CCGElem *> grids = subdiv_ccg.grids;
|
||||
threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) {
|
||||
for (PBVHNode *node : nodes.slice(range)) {
|
||||
SCULPT_undo_push_node(&object, node, SCULPT_UNDO_MASK);
|
||||
SCULPT_undo_push_node(&object, node, SculptUndoType::Mask);
|
||||
|
||||
const Span<int> grid_indices = BKE_pbvh_node_get_grid_indices(*node);
|
||||
if (grid_hidden.is_empty()) {
|
||||
|
@ -428,7 +428,7 @@ static void invert_mask_bmesh(Object &object, const Span<PBVHNode *> nodes)
|
|||
return;
|
||||
}
|
||||
|
||||
SCULPT_undo_push_node(&object, nodes.first(), SCULPT_UNDO_MASK);
|
||||
SCULPT_undo_push_node(&object, nodes.first(), SculptUndoType::Mask);
|
||||
threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) {
|
||||
for (PBVHNode *node : nodes.slice(range)) {
|
||||
for (BMVert *vert : BKE_pbvh_bmesh_node_unique_verts(node)) {
|
||||
|
@ -1042,7 +1042,7 @@ static void face_set_gesture_apply_task(SculptGestureContext *sgcontext, PBVHNod
|
|||
SculptSession &ss = *sgcontext->ss;
|
||||
const PBVH &pbvh = *sgcontext->ss->pbvh;
|
||||
|
||||
SCULPT_undo_push_node(sgcontext->vc.obact, node, SCULPT_UNDO_FACE_SETS);
|
||||
SCULPT_undo_push_node(sgcontext->vc.obact, node, SculptUndoType::FaceSet);
|
||||
|
||||
const int new_face_set = face_set_operation->new_face_set_id;
|
||||
|
||||
|
@ -1171,7 +1171,7 @@ static void mask_gesture_apply_task(SculptGestureContext *sgcontext,
|
|||
if (!any_masked) {
|
||||
any_masked = true;
|
||||
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_MASK);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::Mask);
|
||||
|
||||
if (is_multires) {
|
||||
BKE_pbvh_node_mark_normals_update(node);
|
||||
|
@ -1755,7 +1755,7 @@ static void sculpt_gesture_trim_begin(bContext *C, SculptGestureContext *sgconte
|
|||
sculpt_gesture_trim_geometry_generate(sgcontext);
|
||||
SCULPT_topology_islands_invalidate(ss);
|
||||
BKE_sculpt_update_object_for_edit(depsgraph, sgcontext->vc.obact, false);
|
||||
SCULPT_undo_push_node(sgcontext->vc.obact, nullptr, SCULPT_UNDO_GEOMETRY);
|
||||
SCULPT_undo_push_node(sgcontext->vc.obact, nullptr, SculptUndoType::Geometry);
|
||||
}
|
||||
|
||||
static void sculpt_gesture_trim_apply_for_symmetry_pass(bContext * /*C*/,
|
||||
|
@ -1788,7 +1788,7 @@ static void sculpt_gesture_trim_end(bContext * /*C*/, SculptGestureContext *sgco
|
|||
|
||||
sculpt_gesture_trim_geometry_free(sgcontext);
|
||||
|
||||
SCULPT_undo_push_node(sgcontext->vc.obact, nullptr, SCULPT_UNDO_GEOMETRY);
|
||||
SCULPT_undo_push_node(sgcontext->vc.obact, nullptr, SculptUndoType::Geometry);
|
||||
BKE_mesh_batch_cache_dirty_tag(mesh, BKE_MESH_BATCH_DIRTY_ALL);
|
||||
DEG_id_tag_update(&sgcontext->vc.obact->id, ID_RECALC_GEOMETRY);
|
||||
}
|
||||
|
@ -1863,7 +1863,7 @@ static void project_line_gesture_apply_task(SculptGestureContext *sgcontext, PBV
|
|||
PBVHVertexIter vd;
|
||||
bool any_updated = false;
|
||||
|
||||
SCULPT_undo_push_node(sgcontext->vc.obact, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_undo_push_node(sgcontext->vc.obact, node, SculptUndoType::Position);
|
||||
|
||||
BKE_pbvh_vertex_iter_begin (sgcontext->ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
|
||||
float vertex_normal[3];
|
||||
|
|
|
@ -1808,7 +1808,7 @@ static void vpaint_paint_leaves(bContext *C,
|
|||
Span<PBVHNode *> nodes)
|
||||
{
|
||||
for (PBVHNode *node : nodes) {
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_COLOR);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::Color);
|
||||
}
|
||||
|
||||
const Brush *brush = ob->sculpt->cache->brush;
|
||||
|
@ -2255,7 +2255,7 @@ static int vertex_color_set_exec(bContext *C, wmOperator *op)
|
|||
SCULPT_undo_push_begin(obact, op);
|
||||
Vector<PBVHNode *> nodes = blender::bke::pbvh::search_gather(obact->sculpt->pbvh, {});
|
||||
for (PBVHNode *node : nodes) {
|
||||
SCULPT_undo_push_node(obact, node, SCULPT_UNDO_COLOR);
|
||||
SCULPT_undo_push_node(obact, node, SculptUndoType::Color);
|
||||
}
|
||||
|
||||
paint_object_attributes_active_color_fill_ex(obact, paintcol, true, affect_alpha);
|
||||
|
|
|
@ -310,7 +310,7 @@ static void transform_active_color(bContext *C,
|
|||
|
||||
Vector<PBVHNode *> nodes = blender::bke::pbvh::search_gather(obact->sculpt->pbvh, {});
|
||||
for (PBVHNode *node : nodes) {
|
||||
SCULPT_undo_push_node(obact, node, SCULPT_UNDO_COLOR);
|
||||
SCULPT_undo_push_node(obact, node, SculptUndoType::Color);
|
||||
}
|
||||
|
||||
transform_active_color_data(*BKE_mesh_from_object(obact), transform_fn);
|
||||
|
|
|
@ -1351,7 +1351,7 @@ void SCULPT_orig_vert_data_init(SculptOrigVertData *data,
|
|||
|
||||
void SCULPT_orig_vert_data_update(SculptOrigVertData *orig_data, PBVHVertexIter *iter)
|
||||
{
|
||||
if (orig_data->unode->type == SCULPT_UNDO_COORDS) {
|
||||
if (orig_data->unode->type == SculptUndoType::Position) {
|
||||
if (orig_data->bm_log) {
|
||||
BM_log_original_vert_data(orig_data->bm_log, iter->bm_vert, &orig_data->co, &orig_data->no);
|
||||
}
|
||||
|
@ -1360,10 +1360,10 @@ void SCULPT_orig_vert_data_update(SculptOrigVertData *orig_data, PBVHVertexIter
|
|||
orig_data->no = orig_data->normals[iter->i];
|
||||
}
|
||||
}
|
||||
else if (orig_data->unode->type == SCULPT_UNDO_COLOR) {
|
||||
else if (orig_data->unode->type == SculptUndoType::Color) {
|
||||
orig_data->col = orig_data->colors[iter->i];
|
||||
}
|
||||
else if (orig_data->unode->type == SCULPT_UNDO_MASK) {
|
||||
else if (orig_data->unode->type == SculptUndoType::Mask) {
|
||||
if (orig_data->bm_log) {
|
||||
orig_data->mask = BM_log_original_mask(orig_data->bm_log, iter->bm_vert);
|
||||
}
|
||||
|
@ -1426,7 +1426,7 @@ static void paint_mesh_restore_node(Object *ob,
|
|||
}
|
||||
|
||||
switch (type) {
|
||||
case SCULPT_UNDO_MASK: {
|
||||
case SculptUndoType::Mask: {
|
||||
switch (BKE_pbvh_type(ss->pbvh)) {
|
||||
case PBVH_FACES: {
|
||||
blender::array_utils::scatter(unode->mask.as_span(),
|
||||
|
@ -1456,7 +1456,7 @@ static void paint_mesh_restore_node(Object *ob,
|
|||
BKE_pbvh_node_mark_update_mask(node);
|
||||
break;
|
||||
}
|
||||
case SCULPT_UNDO_COLOR: {
|
||||
case SculptUndoType::Color: {
|
||||
SculptOrigVertData orig_vert_data;
|
||||
SCULPT_orig_vert_data_unode_init(&orig_vert_data, ob, unode);
|
||||
PBVHVertexIter vd;
|
||||
|
@ -1468,7 +1468,7 @@ static void paint_mesh_restore_node(Object *ob,
|
|||
BKE_pbvh_node_mark_update_color(node);
|
||||
break;
|
||||
}
|
||||
case SCULPT_UNDO_FACE_SETS: {
|
||||
case SculptUndoType::FaceSet: {
|
||||
const Span<int> face_sets = unode->face_sets;
|
||||
ss->face_sets = BKE_sculpt_face_sets_ensure(ob);
|
||||
switch (BKE_pbvh_type(ss->pbvh)) {
|
||||
|
@ -1493,7 +1493,7 @@ static void paint_mesh_restore_node(Object *ob,
|
|||
BKE_pbvh_node_mark_update_face_sets(node);
|
||||
break;
|
||||
}
|
||||
case SCULPT_UNDO_COORDS: {
|
||||
case SculptUndoType::Position: {
|
||||
SculptOrigVertData orig_vert_data;
|
||||
SCULPT_orig_vert_data_unode_init(&orig_vert_data, ob, unode);
|
||||
PBVHVertexIter vd;
|
||||
|
@ -1524,22 +1524,22 @@ static void paint_mesh_restore_co(Sculpt *sd, Object *ob)
|
|||
SculptUndoType type;
|
||||
switch (brush->sculpt_tool) {
|
||||
case SCULPT_TOOL_MASK:
|
||||
type = SCULPT_UNDO_MASK;
|
||||
type = SculptUndoType::Mask;
|
||||
break;
|
||||
case SCULPT_TOOL_PAINT:
|
||||
case SCULPT_TOOL_SMEAR:
|
||||
type = SCULPT_UNDO_COLOR;
|
||||
type = SculptUndoType::Color;
|
||||
break;
|
||||
case SCULPT_TOOL_DRAW_FACE_SETS:
|
||||
type = ss->cache->alt_smooth ? SCULPT_UNDO_COORDS : SCULPT_UNDO_FACE_SETS;
|
||||
type = ss->cache->alt_smooth ? SculptUndoType::Position : SculptUndoType::FaceSet;
|
||||
break;
|
||||
default:
|
||||
type = SCULPT_UNDO_COORDS;
|
||||
type = SculptUndoType::Position;
|
||||
break;
|
||||
}
|
||||
|
||||
SculptMaskWriteInfo mask_write;
|
||||
if (type == SCULPT_UNDO_MASK) {
|
||||
if (type == SculptUndoType::Mask) {
|
||||
mask_write = SCULPT_mask_get_for_write(ss);
|
||||
}
|
||||
|
||||
|
@ -1929,7 +1929,7 @@ static void calc_area_normal_and_center_task(Object *ob,
|
|||
bool normal_test_r, area_test_r;
|
||||
|
||||
if (ss->cache && !ss->cache->accum) {
|
||||
unode = SCULPT_undo_push_node(ob, node, SCULPT_UNDO_COORDS);
|
||||
unode = SCULPT_undo_push_node(ob, node, SculptUndoType::Position);
|
||||
use_original = (!unode->co.is_empty() || unode->bm_entry);
|
||||
}
|
||||
|
||||
|
@ -3315,8 +3315,10 @@ static void sculpt_topology_update(Sculpt *sd,
|
|||
}
|
||||
|
||||
for (PBVHNode *node : nodes) {
|
||||
SCULPT_undo_push_node(
|
||||
ob, node, brush->sculpt_tool == SCULPT_TOOL_MASK ? SCULPT_UNDO_MASK : SCULPT_UNDO_COORDS);
|
||||
SCULPT_undo_push_node(ob,
|
||||
node,
|
||||
brush->sculpt_tool == SCULPT_TOOL_MASK ? SculptUndoType::Mask :
|
||||
SculptUndoType::Position);
|
||||
BKE_pbvh_node_mark_update(node);
|
||||
|
||||
if (BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) {
|
||||
|
@ -3354,15 +3356,15 @@ static void do_brush_action_task(Object *ob, const Brush *brush, PBVHNode *node)
|
|||
need_coords = true;
|
||||
}
|
||||
else {
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_FACE_SETS);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::FaceSet);
|
||||
}
|
||||
}
|
||||
else if (brush->sculpt_tool == SCULPT_TOOL_MASK) {
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_MASK);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::Mask);
|
||||
BKE_pbvh_node_mark_update_mask(node);
|
||||
}
|
||||
else if (SCULPT_tool_is_paint(brush->sculpt_tool)) {
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_COLOR);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::Color);
|
||||
BKE_pbvh_node_mark_update_color(node);
|
||||
}
|
||||
else {
|
||||
|
@ -3370,7 +3372,7 @@ static void do_brush_action_task(Object *ob, const Brush *brush, PBVHNode *node)
|
|||
}
|
||||
|
||||
if (need_coords) {
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::Position);
|
||||
BKE_pbvh_node_mark_update(node);
|
||||
}
|
||||
}
|
||||
|
@ -3705,7 +3707,7 @@ static void sculpt_combine_proxies_node(Object &object,
|
|||
float(*orco)[3] = nullptr;
|
||||
if (use_orco && !ss->bm) {
|
||||
orco = reinterpret_cast<float(*)[3]>(
|
||||
(SCULPT_undo_push_node(&object, &node, SCULPT_UNDO_COORDS)->co.data()));
|
||||
(SCULPT_undo_push_node(&object, &node, SculptUndoType::Position)->co.data()));
|
||||
}
|
||||
|
||||
MutableSpan<PBVHProxyNode> proxies = BKE_pbvh_node_get_proxies(&node);
|
||||
|
@ -4847,7 +4849,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, SCULPT_UNDO_COORDS);
|
||||
SculptUndoNode *unode = SCULPT_undo_get_node(node, SculptUndoType::Position);
|
||||
origco = (unode) ? reinterpret_cast<float(*)[3]>(unode->co.data()) : nullptr;
|
||||
use_origco = origco ? true : false;
|
||||
}
|
||||
|
@ -4887,7 +4889,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, SCULPT_UNDO_COORDS);
|
||||
SculptUndoNode *unode = SCULPT_undo_get_node(node, SculptUndoType::Position);
|
||||
origco = (unode) ? reinterpret_cast<float(*)[3]>(unode->co.data()) : nullptr;
|
||||
use_origco = origco ? true : false;
|
||||
}
|
||||
|
@ -6061,7 +6063,7 @@ void SCULPT_automasking_node_begin(Object *ob,
|
|||
(BRUSH_AUTOMASKING_BRUSH_NORMAL | BRUSH_AUTOMASKING_VIEW_NORMAL);
|
||||
|
||||
if (automask_data->have_orig_data) {
|
||||
SCULPT_orig_vert_data_init(&automask_data->orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&automask_data->orig_data, ob, node, SculptUndoType::Position);
|
||||
}
|
||||
else {
|
||||
memset(&automask_data->orig_data, 0, sizeof(automask_data->orig_data));
|
||||
|
|
|
@ -660,7 +660,7 @@ static void do_boundary_brush_bend_task(Object *ob, const Brush *brush, PBVHNode
|
|||
|
||||
PBVHVertexIter vd;
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
|
||||
const float disp = strength * sculpt_boundary_displacement_from_grab_delta_get(ss, boundary);
|
||||
float angle_factor = disp / ss->cache->radius;
|
||||
|
@ -714,7 +714,7 @@ static void do_boundary_brush_slide_task(Object *ob, const Brush *brush, PBVHNod
|
|||
|
||||
PBVHVertexIter vd;
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
|
||||
const float disp = sculpt_boundary_displacement_from_grab_delta_get(ss, boundary);
|
||||
AutomaskingNodeData automask_data;
|
||||
|
@ -760,7 +760,7 @@ static void do_boundary_brush_inflate_task(Object *ob, const Brush *brush, PBVHN
|
|||
|
||||
PBVHVertexIter vd;
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
AutomaskingNodeData automask_data;
|
||||
SCULPT_automasking_node_begin(ob, ss->cache->automasking, &automask_data, node);
|
||||
|
||||
|
@ -806,7 +806,7 @@ static void do_boundary_brush_grab_task(Object *ob, const Brush *brush, PBVHNode
|
|||
|
||||
PBVHVertexIter vd;
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
AutomaskingNodeData automask_data;
|
||||
SCULPT_automasking_node_begin(ob, ss->cache->automasking, &automask_data, node);
|
||||
|
||||
|
@ -849,7 +849,7 @@ static void do_boundary_brush_twist_task(Object *ob, const Brush *brush, PBVHNod
|
|||
|
||||
PBVHVertexIter vd;
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
AutomaskingNodeData automask_data;
|
||||
SCULPT_automasking_node_begin(ob, ss->cache->automasking, &automask_data, node);
|
||||
|
||||
|
@ -903,7 +903,7 @@ static void do_boundary_brush_smooth_task(Object *ob, const Brush *brush, PBVHNo
|
|||
|
||||
PBVHVertexIter vd;
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
|
||||
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
|
||||
if (boundary->edit_info[vd.index].propagation_steps_num == -1) {
|
||||
|
|
|
@ -1235,7 +1235,7 @@ static void do_thumb_brush_task(Object *ob, const Brush *brush, const float *con
|
|||
const MutableSpan<float3> proxy = BKE_pbvh_node_add_proxy(*ss->pbvh, *node).co;
|
||||
const float bstrength = ss->cache->bstrength;
|
||||
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
|
||||
SculptBrushTest test;
|
||||
SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape(
|
||||
|
@ -1302,7 +1302,7 @@ static void do_rotate_brush_task(Object *ob, const Brush *brush, const float ang
|
|||
const MutableSpan<float3> proxy = BKE_pbvh_node_add_proxy(*ss->pbvh, *node).co;
|
||||
const float bstrength = ss->cache->bstrength;
|
||||
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
|
||||
SculptBrushTest test;
|
||||
SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape(
|
||||
|
@ -1372,7 +1372,7 @@ static void do_layer_brush_task(Object *ob, Sculpt *sd, const Brush *brush, PBVH
|
|||
PBVHVertexIter vd;
|
||||
SculptOrigVertData orig_data;
|
||||
const float bstrength = ss->cache->bstrength;
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
|
||||
SculptBrushTest test;
|
||||
SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape(
|
||||
|
@ -1836,7 +1836,7 @@ static void do_grab_brush_task(Object *ob,
|
|||
const MutableSpan<float3> proxy = BKE_pbvh_node_add_proxy(*ss->pbvh, *node).co;
|
||||
const float bstrength = ss->cache->bstrength;
|
||||
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
|
||||
SculptBrushTest test;
|
||||
SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape(
|
||||
|
@ -1921,7 +1921,7 @@ static void do_elastic_deform_brush_task(Object *ob,
|
|||
|
||||
const float bstrength = ss->cache->bstrength;
|
||||
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
AutomaskingNodeData automask_data;
|
||||
SCULPT_automasking_node_begin(ob, ss->cache->automasking, &automask_data, node);
|
||||
|
||||
|
@ -2027,7 +2027,7 @@ static void do_draw_sharp_brush_task(Object *ob,
|
|||
SculptOrigVertData orig_data;
|
||||
const MutableSpan<float3> proxy = BKE_pbvh_node_add_proxy(*ss->pbvh, *node).co;
|
||||
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
|
||||
SculptBrushTest test;
|
||||
SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape(
|
||||
|
@ -2105,7 +2105,7 @@ static void do_topology_slide_task(Object *ob, const Brush *brush, PBVHNode *nod
|
|||
SculptOrigVertData orig_data;
|
||||
const MutableSpan<float3> proxy = BKE_pbvh_node_add_proxy(*ss->pbvh, *node).co;
|
||||
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
|
||||
SculptBrushTest test;
|
||||
SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape(
|
||||
|
@ -2263,7 +2263,7 @@ static void do_topology_relax_task(Object *ob, const Brush *brush, PBVHNode *nod
|
|||
PBVHVertexIter vd;
|
||||
SculptOrigVertData orig_data;
|
||||
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
|
||||
/* TODO(@sergey): This looks very suspicious: proxy is added but is never written.
|
||||
* Either this needs to be documented better why it is needed, or removed. The removal is likely
|
||||
|
|
|
@ -1530,7 +1530,7 @@ static int sculpt_cloth_filter_invoke(bContext *C, wmOperator *op, const wmEvent
|
|||
SCULPT_filter_cache_init(C,
|
||||
ob,
|
||||
sd,
|
||||
SCULPT_UNDO_COORDS,
|
||||
SculptUndoType::Position,
|
||||
mval_fl,
|
||||
RNA_float_get(op->ptr, "area_normal_radius"),
|
||||
RNA_float_get(op->ptr, "strength"));
|
||||
|
|
|
@ -112,7 +112,7 @@ static int sculpt_detail_flood_fill_exec(bContext *C, wmOperator *op)
|
|||
BKE_pbvh_bmesh_detail_size_set(ss->pbvh, object_space_constant_detail);
|
||||
|
||||
SCULPT_undo_push_begin(ob, op);
|
||||
SCULPT_undo_push_node(ob, nullptr, SCULPT_UNDO_COORDS);
|
||||
SCULPT_undo_push_node(ob, nullptr, SculptUndoType::Position);
|
||||
|
||||
const double start_time = PIL_check_seconds_timer();
|
||||
|
||||
|
|
|
@ -213,7 +213,7 @@ void sculpt_dynamic_topology_disable_with_undo(Main *bmain,
|
|||
const bool use_undo = G.background ? (ED_undo_stack_get() != nullptr) : true;
|
||||
if (use_undo) {
|
||||
SCULPT_undo_push_begin_ex(ob, "Dynamic topology disable");
|
||||
SCULPT_undo_push_node(ob, nullptr, SCULPT_UNDO_DYNTOPO_END);
|
||||
SCULPT_undo_push_node(ob, nullptr, SculptUndoType::DyntopoEnd);
|
||||
}
|
||||
SCULPT_dynamic_topology_disable_ex(bmain, depsgraph, scene, ob, nullptr);
|
||||
if (use_undo) {
|
||||
|
@ -233,7 +233,7 @@ static void sculpt_dynamic_topology_enable_with_undo(Main *bmain, Depsgraph *dep
|
|||
}
|
||||
SCULPT_dynamic_topology_enable_ex(bmain, depsgraph, ob);
|
||||
if (use_undo) {
|
||||
SCULPT_undo_push_node(ob, nullptr, SCULPT_UNDO_DYNTOPO_BEGIN);
|
||||
SCULPT_undo_push_node(ob, nullptr, SculptUndoType::DyntopoBegin);
|
||||
SCULPT_undo_push_end(ob);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2121,17 +2121,17 @@ static void sculpt_expand_undo_push(Object *ob, ExpandCache *expand_cache)
|
|||
switch (expand_cache->target) {
|
||||
case SCULPT_EXPAND_TARGET_MASK:
|
||||
for (PBVHNode *node : nodes) {
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_MASK);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::Mask);
|
||||
}
|
||||
break;
|
||||
case SCULPT_EXPAND_TARGET_FACE_SETS:
|
||||
for (PBVHNode *node : nodes) {
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_FACE_SETS);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::FaceSet);
|
||||
}
|
||||
break;
|
||||
case SCULPT_EXPAND_TARGET_COLORS:
|
||||
for (PBVHNode *node : nodes) {
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_COLOR);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::Color);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -173,7 +173,7 @@ static void do_draw_face_sets_brush_faces(Object *ob, const Brush *brush, PBVHNo
|
|||
BKE_pbvh_vertex_iter_end;
|
||||
|
||||
if (changed) {
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_FACE_SETS);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::FaceSet);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -221,7 +221,7 @@ static void do_draw_face_sets_brush_grids(Object *ob, const Brush *brush, PBVHNo
|
|||
BKE_pbvh_vertex_iter_end;
|
||||
|
||||
if (changed) {
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_FACE_SETS);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::FaceSet);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -306,7 +306,7 @@ static void do_draw_face_sets_brush_bmesh(Object *ob, const Brush *brush, PBVHNo
|
|||
}
|
||||
|
||||
if (changed) {
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_FACE_SETS);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::FaceSet);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -412,11 +412,11 @@ void do_draw_face_sets_brush(Sculpt *sd, Object *ob, Span<PBVHNode *> nodes)
|
|||
|
||||
/* Face Sets Operators */
|
||||
|
||||
enum eSculptFaceGroupsCreateModes {
|
||||
SCULPT_FACE_SET_MASKED = 0,
|
||||
SCULPT_FACE_SET_VISIBLE = 1,
|
||||
SCULPT_FACE_SET_ALL = 2,
|
||||
SCULPT_FACE_SET_SELECTION = 3,
|
||||
enum class CreateMode {
|
||||
Masked = 0,
|
||||
Visible = 1,
|
||||
All = 2,
|
||||
Selection = 3,
|
||||
};
|
||||
|
||||
static int sculpt_face_set_create_exec(bContext *C, wmOperator *op)
|
||||
|
@ -425,7 +425,7 @@ static int sculpt_face_set_create_exec(bContext *C, wmOperator *op)
|
|||
SculptSession *ss = ob->sculpt;
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C);
|
||||
|
||||
const int mode = RNA_enum_get(op->ptr, "mode");
|
||||
const CreateMode mode = CreateMode(RNA_enum_get(op->ptr, "mode"));
|
||||
|
||||
/* Dyntopo not supported. */
|
||||
if (BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) {
|
||||
|
@ -449,69 +449,74 @@ static int sculpt_face_set_create_exec(bContext *C, wmOperator *op)
|
|||
|
||||
SCULPT_undo_push_begin(ob, op);
|
||||
for (PBVHNode *node : nodes) {
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_FACE_SETS);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::FaceSet);
|
||||
}
|
||||
|
||||
const int next_face_set = SCULPT_face_set_next_available_get(ss);
|
||||
|
||||
if (mode == SCULPT_FACE_SET_MASKED) {
|
||||
for (int i = 0; i < tot_vert; i++) {
|
||||
PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i);
|
||||
switch (mode) {
|
||||
case CreateMode::Masked: {
|
||||
for (int i = 0; i < tot_vert; i++) {
|
||||
PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i);
|
||||
|
||||
if (SCULPT_vertex_mask_get(ss, vertex) >= threshold && SCULPT_vertex_visible_get(ss, vertex))
|
||||
{
|
||||
SCULPT_vertex_face_set_set(ss, vertex, next_face_set);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mode == SCULPT_FACE_SET_VISIBLE) {
|
||||
|
||||
/* If all vertices in the sculpt are visible, create the new face set and update the default
|
||||
* color. This way the new face set will be white, which is a quick way of disabling all face
|
||||
* sets and the performance hit of rendering the overlay. */
|
||||
bool all_visible = true;
|
||||
for (int i = 0; i < tot_vert; i++) {
|
||||
PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i);
|
||||
|
||||
if (!SCULPT_vertex_visible_get(ss, vertex)) {
|
||||
all_visible = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (all_visible) {
|
||||
mesh->face_sets_color_default = next_face_set;
|
||||
}
|
||||
|
||||
for (int i = 0; i < tot_vert; i++) {
|
||||
PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i);
|
||||
|
||||
if (SCULPT_vertex_visible_get(ss, vertex)) {
|
||||
SCULPT_vertex_face_set_set(ss, vertex, next_face_set);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mode == SCULPT_FACE_SET_ALL) {
|
||||
for (int i = 0; i < tot_vert; i++) {
|
||||
PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i);
|
||||
|
||||
SCULPT_vertex_face_set_set(ss, vertex, next_face_set);
|
||||
}
|
||||
}
|
||||
|
||||
if (mode == SCULPT_FACE_SET_SELECTION) {
|
||||
const bke::AttributeAccessor attributes = mesh->attributes();
|
||||
const VArraySpan<bool> select_poly = *attributes.lookup_or_default<bool>(
|
||||
".select_poly", ATTR_DOMAIN_FACE, false);
|
||||
threading::parallel_for(select_poly.index_range(), 4096, [&](const IndexRange range) {
|
||||
for (const int i : range) {
|
||||
if (select_poly[i]) {
|
||||
ss->face_sets[i] = next_face_set;
|
||||
if (SCULPT_vertex_mask_get(ss, vertex) >= threshold &&
|
||||
SCULPT_vertex_visible_get(ss, vertex)) {
|
||||
SCULPT_vertex_face_set_set(ss, vertex, next_face_set);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case CreateMode::Visible: {
|
||||
/* If all vertices in the sculpt are visible, create the new face set and update the default
|
||||
* color. This way the new face set will be white, which is a quick way of disabling all face
|
||||
* sets and the performance hit of rendering the overlay. */
|
||||
bool all_visible = true;
|
||||
for (int i = 0; i < tot_vert; i++) {
|
||||
PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i);
|
||||
|
||||
if (!SCULPT_vertex_visible_get(ss, vertex)) {
|
||||
all_visible = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (all_visible) {
|
||||
mesh->face_sets_color_default = next_face_set;
|
||||
}
|
||||
|
||||
for (int i = 0; i < tot_vert; i++) {
|
||||
PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i);
|
||||
|
||||
if (SCULPT_vertex_visible_get(ss, vertex)) {
|
||||
SCULPT_vertex_face_set_set(ss, vertex, next_face_set);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case CreateMode::All: {
|
||||
for (int i = 0; i < tot_vert; i++) {
|
||||
PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i);
|
||||
|
||||
SCULPT_vertex_face_set_set(ss, vertex, next_face_set);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case CreateMode::Selection: {
|
||||
const bke::AttributeAccessor attributes = mesh->attributes();
|
||||
const VArraySpan<bool> select_poly = *attributes.lookup_or_default<bool>(
|
||||
".select_poly", ATTR_DOMAIN_FACE, false);
|
||||
threading::parallel_for(select_poly.index_range(), 4096, [&](const IndexRange range) {
|
||||
for (const int i : range) {
|
||||
if (select_poly[i]) {
|
||||
ss->face_sets[i] = next_face_set;
|
||||
}
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (PBVHNode *node : nodes) {
|
||||
|
@ -537,40 +542,40 @@ void SCULPT_OT_face_sets_create(wmOperatorType *ot)
|
|||
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
||||
|
||||
static EnumPropertyItem modes[] = {
|
||||
{SCULPT_FACE_SET_MASKED,
|
||||
{int(CreateMode::Masked),
|
||||
"MASKED",
|
||||
0,
|
||||
"Face Set from Masked",
|
||||
"Create a new Face Set from the masked faces"},
|
||||
{SCULPT_FACE_SET_VISIBLE,
|
||||
{int(CreateMode::Visible),
|
||||
"VISIBLE",
|
||||
0,
|
||||
"Face Set from Visible",
|
||||
"Create a new Face Set from the visible vertices"},
|
||||
{SCULPT_FACE_SET_ALL,
|
||||
{int(CreateMode::All),
|
||||
"ALL",
|
||||
0,
|
||||
"Face Set Full Mesh",
|
||||
"Create an unique Face Set with all faces in the sculpt"},
|
||||
{SCULPT_FACE_SET_SELECTION,
|
||||
{int(CreateMode::Selection),
|
||||
"SELECTION",
|
||||
0,
|
||||
"Face Set from Edit Mode Selection",
|
||||
"Create an Face Set corresponding to the Edit Mode face selection"},
|
||||
{0, nullptr, 0, nullptr, nullptr},
|
||||
};
|
||||
RNA_def_enum(ot->srna, "mode", modes, SCULPT_FACE_SET_MASKED, "Mode", "");
|
||||
RNA_def_enum(ot->srna, "mode", modes, int(CreateMode::Masked), "Mode", "");
|
||||
}
|
||||
|
||||
enum eSculptFaceSetsInitMode {
|
||||
SCULPT_FACE_SETS_FROM_LOOSE_PARTS = 0,
|
||||
SCULPT_FACE_SETS_FROM_MATERIALS = 1,
|
||||
SCULPT_FACE_SETS_FROM_NORMALS = 2,
|
||||
SCULPT_FACE_SETS_FROM_UV_SEAMS = 3,
|
||||
SCULPT_FACE_SETS_FROM_CREASES = 4,
|
||||
SCULPT_FACE_SETS_FROM_SHARP_EDGES = 5,
|
||||
SCULPT_FACE_SETS_FROM_BEVEL_WEIGHT = 6,
|
||||
SCULPT_FACE_SETS_FROM_FACE_SET_BOUNDARIES = 8,
|
||||
enum class InitMode {
|
||||
LooseParts = 0,
|
||||
Materials = 1,
|
||||
Normals = 2,
|
||||
UVSeams = 3,
|
||||
Creases = 4,
|
||||
SharpEdges = 5,
|
||||
BevelWeight = 6,
|
||||
FaceSetBoundaries = 8,
|
||||
};
|
||||
|
||||
using FaceSetsFloodFillFn = FunctionRef<bool(int from_face, int edge, int to_face)>;
|
||||
|
@ -632,12 +637,12 @@ static void sculpt_face_sets_init_flood_fill(Object *ob, const FaceSetsFloodFill
|
|||
}
|
||||
}
|
||||
|
||||
static void sculpt_face_sets_init_loop(Object *ob, const int mode)
|
||||
static void sculpt_face_sets_init_loop(Object *ob, const InitMode mode)
|
||||
{
|
||||
Mesh *mesh = static_cast<Mesh *>(ob->data);
|
||||
SculptSession *ss = ob->sculpt;
|
||||
|
||||
if (mode == SCULPT_FACE_SETS_FROM_MATERIALS) {
|
||||
if (mode == InitMode::Materials) {
|
||||
const bke::AttributeAccessor attributes = mesh->attributes();
|
||||
const VArraySpan<int> material_indices = *attributes.lookup_or_default<int>(
|
||||
"material_index", ATTR_DOMAIN_FACE, 0);
|
||||
|
@ -653,7 +658,7 @@ static int sculpt_face_set_init_exec(bContext *C, wmOperator *op)
|
|||
SculptSession *ss = ob->sculpt;
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C);
|
||||
|
||||
const int mode = RNA_enum_get(op->ptr, "mode");
|
||||
const InitMode mode = InitMode(RNA_enum_get(op->ptr, "mode"));
|
||||
|
||||
BKE_sculpt_update_object_for_edit(depsgraph, ob, false);
|
||||
|
||||
|
@ -671,7 +676,7 @@ static int sculpt_face_set_init_exec(bContext *C, wmOperator *op)
|
|||
|
||||
SCULPT_undo_push_begin(ob, op);
|
||||
for (PBVHNode *node : nodes) {
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_FACE_SETS);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::FaceSet);
|
||||
}
|
||||
|
||||
const float threshold = RNA_float_get(op->ptr, "threshold");
|
||||
|
@ -681,7 +686,7 @@ static int sculpt_face_set_init_exec(bContext *C, wmOperator *op)
|
|||
const bke::AttributeAccessor attributes = mesh->attributes();
|
||||
|
||||
switch (mode) {
|
||||
case SCULPT_FACE_SETS_FROM_LOOSE_PARTS: {
|
||||
case InitMode::LooseParts: {
|
||||
const VArray<bool> hide_poly = *attributes.lookup_or_default<bool>(
|
||||
".hide_poly", ATTR_DOMAIN_FACE, false);
|
||||
sculpt_face_sets_init_flood_fill(
|
||||
|
@ -690,11 +695,11 @@ static int sculpt_face_set_init_exec(bContext *C, wmOperator *op)
|
|||
});
|
||||
break;
|
||||
}
|
||||
case SCULPT_FACE_SETS_FROM_MATERIALS: {
|
||||
sculpt_face_sets_init_loop(ob, SCULPT_FACE_SETS_FROM_MATERIALS);
|
||||
case InitMode::Materials: {
|
||||
sculpt_face_sets_init_loop(ob, InitMode::Materials);
|
||||
break;
|
||||
}
|
||||
case SCULPT_FACE_SETS_FROM_NORMALS: {
|
||||
case InitMode::Normals: {
|
||||
const Span<float3> face_normals = mesh->face_normals();
|
||||
sculpt_face_sets_init_flood_fill(
|
||||
ob, [&](const int from_face, const int /*edge*/, const int to_face) -> bool {
|
||||
|
@ -702,7 +707,7 @@ static int sculpt_face_set_init_exec(bContext *C, wmOperator *op)
|
|||
});
|
||||
break;
|
||||
}
|
||||
case SCULPT_FACE_SETS_FROM_UV_SEAMS: {
|
||||
case InitMode::UVSeams: {
|
||||
const VArraySpan<bool> uv_seams = *mesh->attributes().lookup_or_default<bool>(
|
||||
".uv_seam", ATTR_DOMAIN_EDGE, false);
|
||||
sculpt_face_sets_init_flood_fill(
|
||||
|
@ -711,7 +716,7 @@ static int sculpt_face_set_init_exec(bContext *C, wmOperator *op)
|
|||
});
|
||||
break;
|
||||
}
|
||||
case SCULPT_FACE_SETS_FROM_CREASES: {
|
||||
case InitMode::Creases: {
|
||||
const float *creases = static_cast<const float *>(
|
||||
CustomData_get_layer_named(&mesh->edge_data, CD_PROP_FLOAT, "crease_edge"));
|
||||
sculpt_face_sets_init_flood_fill(
|
||||
|
@ -720,7 +725,7 @@ static int sculpt_face_set_init_exec(bContext *C, wmOperator *op)
|
|||
});
|
||||
break;
|
||||
}
|
||||
case SCULPT_FACE_SETS_FROM_SHARP_EDGES: {
|
||||
case InitMode::SharpEdges: {
|
||||
const VArraySpan<bool> sharp_edges = *mesh->attributes().lookup_or_default<bool>(
|
||||
"sharp_edge", ATTR_DOMAIN_EDGE, false);
|
||||
sculpt_face_sets_init_flood_fill(
|
||||
|
@ -729,7 +734,7 @@ static int sculpt_face_set_init_exec(bContext *C, wmOperator *op)
|
|||
});
|
||||
break;
|
||||
}
|
||||
case SCULPT_FACE_SETS_FROM_BEVEL_WEIGHT: {
|
||||
case InitMode::BevelWeight: {
|
||||
const float *bevel_weights = static_cast<const float *>(
|
||||
CustomData_get_layer_named(&mesh->edge_data, CD_PROP_FLOAT, "bevel_weight_edge"));
|
||||
sculpt_face_sets_init_flood_fill(
|
||||
|
@ -738,7 +743,7 @@ static int sculpt_face_set_init_exec(bContext *C, wmOperator *op)
|
|||
});
|
||||
break;
|
||||
}
|
||||
case SCULPT_FACE_SETS_FROM_FACE_SET_BOUNDARIES: {
|
||||
case InitMode::FaceSetBoundaries: {
|
||||
Array<int> face_sets_copy(Span<int>(ss->face_sets, mesh->faces_num));
|
||||
sculpt_face_sets_init_flood_fill(
|
||||
ob, [&](const int from_face, const int /*edge*/, const int to_face) -> bool {
|
||||
|
@ -767,49 +772,49 @@ void SCULPT_OT_face_sets_init(wmOperatorType *ot)
|
|||
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
||||
|
||||
static EnumPropertyItem modes[] = {
|
||||
{SCULPT_FACE_SETS_FROM_LOOSE_PARTS,
|
||||
{int(InitMode::LooseParts),
|
||||
"LOOSE_PARTS",
|
||||
0,
|
||||
"Face Sets from Loose Parts",
|
||||
"Create a Face Set per loose part in the mesh"},
|
||||
{SCULPT_FACE_SETS_FROM_MATERIALS,
|
||||
{int(InitMode::Materials),
|
||||
"MATERIALS",
|
||||
0,
|
||||
"Face Sets from Material Slots",
|
||||
"Create a Face Set per Material Slot"},
|
||||
{SCULPT_FACE_SETS_FROM_NORMALS,
|
||||
{int(InitMode::Normals),
|
||||
"NORMALS",
|
||||
0,
|
||||
"Face Sets from Mesh Normals",
|
||||
"Create Face Sets for Faces that have similar normal"},
|
||||
{SCULPT_FACE_SETS_FROM_UV_SEAMS,
|
||||
{int(InitMode::UVSeams),
|
||||
"UV_SEAMS",
|
||||
0,
|
||||
"Face Sets from UV Seams",
|
||||
"Create Face Sets using UV Seams as boundaries"},
|
||||
{SCULPT_FACE_SETS_FROM_CREASES,
|
||||
{int(InitMode::Creases),
|
||||
"CREASES",
|
||||
0,
|
||||
"Face Sets from Edge Creases",
|
||||
"Create Face Sets using Edge Creases as boundaries"},
|
||||
{SCULPT_FACE_SETS_FROM_BEVEL_WEIGHT,
|
||||
{int(InitMode::BevelWeight),
|
||||
"BEVEL_WEIGHT",
|
||||
0,
|
||||
"Face Sets from Bevel Weight",
|
||||
"Create Face Sets using Bevel Weights as boundaries"},
|
||||
{SCULPT_FACE_SETS_FROM_SHARP_EDGES,
|
||||
{int(InitMode::SharpEdges),
|
||||
"SHARP_EDGES",
|
||||
0,
|
||||
"Face Sets from Sharp Edges",
|
||||
"Create Face Sets using Sharp Edges as boundaries"},
|
||||
{SCULPT_FACE_SETS_FROM_FACE_SET_BOUNDARIES,
|
||||
{int(InitMode::FaceSetBoundaries),
|
||||
"FACE_SET_BOUNDARIES",
|
||||
0,
|
||||
"Face Sets from Face Set Boundaries",
|
||||
"Create a Face Set per isolated Face Set"},
|
||||
{0, nullptr, 0, nullptr, nullptr},
|
||||
};
|
||||
RNA_def_enum(ot->srna, "mode", modes, SCULPT_FACE_SET_MASKED, "Mode", "");
|
||||
RNA_def_enum(ot->srna, "mode", modes, int(InitMode::LooseParts), "Mode", "");
|
||||
RNA_def_float(
|
||||
ot->srna,
|
||||
"threshold",
|
||||
|
@ -822,10 +827,10 @@ void SCULPT_OT_face_sets_init(wmOperatorType *ot)
|
|||
1.0f);
|
||||
}
|
||||
|
||||
enum eSculptFaceGroupVisibilityModes {
|
||||
SCULPT_FACE_SET_VISIBILITY_TOGGLE = 0,
|
||||
SCULPT_FACE_SET_VISIBILITY_SHOW_ACTIVE = 1,
|
||||
SCULPT_FACE_SET_VISIBILITY_HIDE_ACTIVE = 2,
|
||||
enum class VisibilityMode {
|
||||
Toggle = 0,
|
||||
ShowActive = 1,
|
||||
HideActive = 2,
|
||||
};
|
||||
|
||||
static void face_hide_update(Object &object,
|
||||
|
@ -861,7 +866,7 @@ static void face_hide_update(Object &object,
|
|||
}
|
||||
|
||||
any_changed = true;
|
||||
SCULPT_undo_push_node(&object, node, SCULPT_UNDO_FACE_HIDDEN);
|
||||
SCULPT_undo_push_node(&object, node, SculptUndoType::HideFace);
|
||||
array_utils::scatter(new_hide.as_span(), faces, hide_poly.span);
|
||||
BKE_pbvh_node_mark_update_visibility(node);
|
||||
}
|
||||
|
@ -902,7 +907,7 @@ static int sculpt_face_set_change_visibility_exec(bContext *C, wmOperator *op)
|
|||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
const int mode = RNA_enum_get(op->ptr, "mode");
|
||||
const VisibilityMode mode = VisibilityMode(RNA_enum_get(op->ptr, "mode"));
|
||||
const int active_face_set = SCULPT_active_face_set_get(ss);
|
||||
|
||||
SCULPT_undo_push_begin(&object, op);
|
||||
|
@ -915,7 +920,7 @@ static int sculpt_face_set_change_visibility_exec(bContext *C, wmOperator *op)
|
|||
const VArraySpan<int> face_sets = *attributes.lookup<int>(".sculpt_face_set", ATTR_DOMAIN_FACE);
|
||||
|
||||
switch (mode) {
|
||||
case SCULPT_FACE_SET_VISIBILITY_TOGGLE: {
|
||||
case VisibilityMode::Toggle: {
|
||||
if (hide_poly.contains(true) || face_sets.is_empty()) {
|
||||
show_all(depsgraph, object, nodes);
|
||||
}
|
||||
|
@ -928,7 +933,7 @@ static int sculpt_face_set_change_visibility_exec(bContext *C, wmOperator *op)
|
|||
}
|
||||
break;
|
||||
}
|
||||
case SCULPT_FACE_SET_VISIBILITY_SHOW_ACTIVE:
|
||||
case VisibilityMode::ShowActive:
|
||||
if (face_sets.is_empty()) {
|
||||
show_all(depsgraph, object, nodes);
|
||||
}
|
||||
|
@ -942,7 +947,7 @@ static int sculpt_face_set_change_visibility_exec(bContext *C, wmOperator *op)
|
|||
});
|
||||
}
|
||||
break;
|
||||
case SCULPT_FACE_SET_VISIBILITY_HIDE_ACTIVE:
|
||||
case VisibilityMode::HideActive:
|
||||
if (face_sets.is_empty()) {
|
||||
face_hide_update(object, nodes, [&](const Span<int> /*faces*/, MutableSpan<bool> hide) {
|
||||
hide.fill(true);
|
||||
|
@ -962,7 +967,7 @@ static int sculpt_face_set_change_visibility_exec(bContext *C, wmOperator *op)
|
|||
|
||||
/* For modes that use the cursor active vertex, update the rotation origin for viewport
|
||||
* navigation. */
|
||||
if (ELEM(mode, SCULPT_FACE_SET_VISIBILITY_TOGGLE, SCULPT_FACE_SET_VISIBILITY_SHOW_ACTIVE)) {
|
||||
if (ELEM(mode, VisibilityMode::Toggle, VisibilityMode::ShowActive)) {
|
||||
UnifiedPaintSettings *ups = &CTX_data_tool_settings(C)->unified_paint_settings;
|
||||
float location[3];
|
||||
copy_v3_v3(location, SCULPT_active_vertex_co_get(ss));
|
||||
|
@ -1013,24 +1018,24 @@ void SCULPT_OT_face_set_change_visibility(wmOperatorType *ot)
|
|||
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_DEPENDS_ON_CURSOR;
|
||||
|
||||
static EnumPropertyItem modes[] = {
|
||||
{SCULPT_FACE_SET_VISIBILITY_TOGGLE,
|
||||
{int(VisibilityMode::Toggle),
|
||||
"TOGGLE",
|
||||
0,
|
||||
"Toggle Visibility",
|
||||
"Hide all Face Sets except for the active one"},
|
||||
{SCULPT_FACE_SET_VISIBILITY_SHOW_ACTIVE,
|
||||
{int(VisibilityMode::ShowActive),
|
||||
"SHOW_ACTIVE",
|
||||
0,
|
||||
"Show Active Face Set",
|
||||
"Show Active Face Set"},
|
||||
{SCULPT_FACE_SET_VISIBILITY_HIDE_ACTIVE,
|
||||
{int(VisibilityMode::HideActive),
|
||||
"HIDE_ACTIVE",
|
||||
0,
|
||||
"Hide Active Face Sets",
|
||||
"Hide Active Face Sets"},
|
||||
{0, nullptr, 0, nullptr, nullptr},
|
||||
};
|
||||
RNA_def_enum(ot->srna, "mode", modes, SCULPT_FACE_SET_VISIBILITY_TOGGLE, "Mode", "");
|
||||
RNA_def_enum(ot->srna, "mode", modes, int(VisibilityMode::Toggle), "Mode", "");
|
||||
}
|
||||
|
||||
static int sculpt_face_sets_randomize_colors_exec(bContext *C, wmOperator * /*op*/)
|
||||
|
@ -1081,12 +1086,12 @@ void SCULPT_OT_face_sets_randomize_colors(wmOperatorType *ot)
|
|||
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
||||
}
|
||||
|
||||
enum eSculptFaceSetEditMode {
|
||||
SCULPT_FACE_SET_EDIT_GROW = 0,
|
||||
SCULPT_FACE_SET_EDIT_SHRINK = 1,
|
||||
SCULPT_FACE_SET_EDIT_DELETE_GEOMETRY = 2,
|
||||
SCULPT_FACE_SET_EDIT_FAIR_POSITIONS = 3,
|
||||
SCULPT_FACE_SET_EDIT_FAIR_TANGENCY = 4,
|
||||
enum class EditMode {
|
||||
Grow = 0,
|
||||
Shrink = 1,
|
||||
DeleteGeometry = 2,
|
||||
FairPositions = 3,
|
||||
FairTangency = 4,
|
||||
};
|
||||
|
||||
static void sculpt_face_set_grow(Object *ob,
|
||||
|
@ -1257,33 +1262,33 @@ static void sculpt_face_set_edit_fair_face_set(Object *ob,
|
|||
|
||||
static void sculpt_face_set_apply_edit(Object *ob,
|
||||
const int active_face_set_id,
|
||||
const int mode,
|
||||
const EditMode mode,
|
||||
const bool modify_hidden,
|
||||
const float strength = 0.0f)
|
||||
{
|
||||
SculptSession *ss = ob->sculpt;
|
||||
|
||||
switch (mode) {
|
||||
case SCULPT_FACE_SET_EDIT_GROW: {
|
||||
case EditMode::Grow: {
|
||||
int *prev_face_sets = static_cast<int *>(MEM_dupallocN(ss->face_sets));
|
||||
sculpt_face_set_grow(ob, ss, prev_face_sets, active_face_set_id, modify_hidden);
|
||||
MEM_SAFE_FREE(prev_face_sets);
|
||||
break;
|
||||
}
|
||||
case SCULPT_FACE_SET_EDIT_SHRINK: {
|
||||
case EditMode::Shrink: {
|
||||
int *prev_face_sets = static_cast<int *>(MEM_dupallocN(ss->face_sets));
|
||||
sculpt_face_set_shrink(ob, ss, prev_face_sets, active_face_set_id, modify_hidden);
|
||||
MEM_SAFE_FREE(prev_face_sets);
|
||||
break;
|
||||
}
|
||||
case SCULPT_FACE_SET_EDIT_DELETE_GEOMETRY:
|
||||
case EditMode::DeleteGeometry:
|
||||
sculpt_face_set_delete_geometry(ob, ss, active_face_set_id, modify_hidden);
|
||||
break;
|
||||
case SCULPT_FACE_SET_EDIT_FAIR_POSITIONS:
|
||||
case EditMode::FairPositions:
|
||||
sculpt_face_set_edit_fair_face_set(
|
||||
ob, active_face_set_id, MESH_FAIRING_DEPTH_POSITION, strength);
|
||||
break;
|
||||
case SCULPT_FACE_SET_EDIT_FAIR_TANGENCY:
|
||||
case EditMode::FairTangency:
|
||||
sculpt_face_set_edit_fair_face_set(
|
||||
ob, active_face_set_id, MESH_FAIRING_DEPTH_TANGENCY, strength);
|
||||
break;
|
||||
|
@ -1291,7 +1296,7 @@ static void sculpt_face_set_apply_edit(Object *ob,
|
|||
}
|
||||
|
||||
static bool sculpt_face_set_edit_is_operation_valid(SculptSession *ss,
|
||||
const eSculptFaceSetEditMode mode,
|
||||
const EditMode mode,
|
||||
const bool modify_hidden)
|
||||
{
|
||||
if (BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) {
|
||||
|
@ -1299,7 +1304,7 @@ static bool sculpt_face_set_edit_is_operation_valid(SculptSession *ss,
|
|||
return false;
|
||||
}
|
||||
|
||||
if (mode == SCULPT_FACE_SET_EDIT_DELETE_GEOMETRY) {
|
||||
if (mode == EditMode::DeleteGeometry) {
|
||||
if (BKE_pbvh_type(ss->pbvh) == PBVH_GRIDS) {
|
||||
/* Modification of base mesh geometry requires special remapping of multi-resolution
|
||||
* displacement, which does not happen here.
|
||||
|
@ -1314,7 +1319,7 @@ static bool sculpt_face_set_edit_is_operation_valid(SculptSession *ss,
|
|||
}
|
||||
}
|
||||
|
||||
if (ELEM(mode, SCULPT_FACE_SET_EDIT_FAIR_POSITIONS, SCULPT_FACE_SET_EDIT_FAIR_TANGENCY)) {
|
||||
if (ELEM(mode, EditMode::FairPositions, EditMode::FairTangency)) {
|
||||
if (BKE_pbvh_type(ss->pbvh) == PBVH_GRIDS) {
|
||||
/* TODO: Multi-resolution topology representation using grids and duplicates can't be used
|
||||
* directly by the fair algorithm. Multi-resolution topology needs to be exposed in a
|
||||
|
@ -1329,7 +1334,7 @@ static bool sculpt_face_set_edit_is_operation_valid(SculptSession *ss,
|
|||
static void sculpt_face_set_edit_modify_geometry(bContext *C,
|
||||
Object *ob,
|
||||
const int active_face_set,
|
||||
const eSculptFaceSetEditMode mode,
|
||||
const EditMode mode,
|
||||
const bool modify_hidden,
|
||||
wmOperator *op)
|
||||
{
|
||||
|
@ -1358,7 +1363,7 @@ static void face_set_edit_do_post_visibility_updates(Object *ob, Span<PBVHNode *
|
|||
|
||||
static void sculpt_face_set_edit_modify_face_sets(Object *ob,
|
||||
const int active_face_set,
|
||||
const eSculptFaceSetEditMode mode,
|
||||
const EditMode mode,
|
||||
const bool modify_hidden,
|
||||
wmOperator *op)
|
||||
{
|
||||
|
@ -1370,18 +1375,15 @@ static void sculpt_face_set_edit_modify_face_sets(Object *ob,
|
|||
}
|
||||
SCULPT_undo_push_begin(ob, op);
|
||||
for (PBVHNode *node : nodes) {
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_FACE_SETS);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::FaceSet);
|
||||
}
|
||||
sculpt_face_set_apply_edit(ob, active_face_set, mode, modify_hidden);
|
||||
SCULPT_undo_push_end(ob);
|
||||
face_set_edit_do_post_visibility_updates(ob, nodes);
|
||||
}
|
||||
|
||||
static void sculpt_face_set_edit_modify_coordinates(bContext *C,
|
||||
Object *ob,
|
||||
const int active_face_set,
|
||||
const eSculptFaceSetEditMode mode,
|
||||
wmOperator *op)
|
||||
static void sculpt_face_set_edit_modify_coordinates(
|
||||
bContext *C, Object *ob, const int active_face_set, const EditMode mode, wmOperator *op)
|
||||
{
|
||||
Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
|
||||
SculptSession *ss = ob->sculpt;
|
||||
|
@ -1394,7 +1396,7 @@ static void sculpt_face_set_edit_modify_coordinates(bContext *C,
|
|||
SCULPT_undo_push_begin(ob, op);
|
||||
for (PBVHNode *node : nodes) {
|
||||
BKE_pbvh_node_mark_update(node);
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::Position);
|
||||
}
|
||||
sculpt_face_set_apply_edit(ob, active_face_set, mode, false, strength);
|
||||
|
||||
|
@ -1411,7 +1413,7 @@ static bool sculpt_face_set_edit_init(bContext *C, wmOperator *op)
|
|||
Object *ob = CTX_data_active_object(C);
|
||||
SculptSession *ss = ob->sculpt;
|
||||
Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
|
||||
const eSculptFaceSetEditMode mode = eSculptFaceSetEditMode(RNA_enum_get(op->ptr, "mode"));
|
||||
const EditMode mode = EditMode(RNA_enum_get(op->ptr, "mode"));
|
||||
const bool modify_hidden = RNA_boolean_get(op->ptr, "modify_hidden");
|
||||
|
||||
if (!sculpt_face_set_edit_is_operation_valid(ss, mode, modify_hidden)) {
|
||||
|
@ -1433,19 +1435,19 @@ static int sculpt_face_set_edit_exec(bContext *C, wmOperator *op)
|
|||
Object *ob = CTX_data_active_object(C);
|
||||
|
||||
const int active_face_set = RNA_int_get(op->ptr, "active_face_set");
|
||||
const eSculptFaceSetEditMode mode = eSculptFaceSetEditMode(RNA_enum_get(op->ptr, "mode"));
|
||||
const EditMode mode = EditMode(RNA_enum_get(op->ptr, "mode"));
|
||||
const bool modify_hidden = RNA_boolean_get(op->ptr, "modify_hidden");
|
||||
|
||||
switch (mode) {
|
||||
case SCULPT_FACE_SET_EDIT_DELETE_GEOMETRY:
|
||||
case EditMode::DeleteGeometry:
|
||||
sculpt_face_set_edit_modify_geometry(C, ob, active_face_set, mode, modify_hidden, op);
|
||||
break;
|
||||
case SCULPT_FACE_SET_EDIT_GROW:
|
||||
case SCULPT_FACE_SET_EDIT_SHRINK:
|
||||
case EditMode::Grow:
|
||||
case EditMode::Shrink:
|
||||
sculpt_face_set_edit_modify_face_sets(ob, active_face_set, mode, modify_hidden, op);
|
||||
break;
|
||||
case SCULPT_FACE_SET_EDIT_FAIR_POSITIONS:
|
||||
case SCULPT_FACE_SET_EDIT_FAIR_TANGENCY:
|
||||
case EditMode::FairPositions:
|
||||
case EditMode::FairTangency:
|
||||
sculpt_face_set_edit_modify_coordinates(C, ob, active_face_set, mode, op);
|
||||
break;
|
||||
}
|
||||
|
@ -1493,28 +1495,28 @@ void SCULPT_OT_face_sets_edit(wmOperatorType *ot)
|
|||
RNA_def_property_flag(prop, PROP_HIDDEN);
|
||||
|
||||
static EnumPropertyItem modes[] = {
|
||||
{SCULPT_FACE_SET_EDIT_GROW,
|
||||
{int(EditMode::Grow),
|
||||
"GROW",
|
||||
0,
|
||||
"Grow Face Set",
|
||||
"Grows the Face Sets boundary by one face based on mesh topology"},
|
||||
{SCULPT_FACE_SET_EDIT_SHRINK,
|
||||
{int(EditMode::Shrink),
|
||||
"SHRINK",
|
||||
0,
|
||||
"Shrink Face Set",
|
||||
"Shrinks the Face Sets boundary by one face based on mesh topology"},
|
||||
{SCULPT_FACE_SET_EDIT_DELETE_GEOMETRY,
|
||||
{int(EditMode::DeleteGeometry),
|
||||
"DELETE_GEOMETRY",
|
||||
0,
|
||||
"Delete Geometry",
|
||||
"Deletes the faces that are assigned to the Face Set"},
|
||||
{SCULPT_FACE_SET_EDIT_FAIR_POSITIONS,
|
||||
{int(EditMode::FairPositions),
|
||||
"FAIR_POSITIONS",
|
||||
0,
|
||||
"Fair Positions",
|
||||
"Creates a smooth as possible geometry patch from the Face Set minimizing changes in "
|
||||
"vertex positions"},
|
||||
{SCULPT_FACE_SET_EDIT_FAIR_TANGENCY,
|
||||
{int(EditMode::FairTangency),
|
||||
"FAIR_TANGENCY",
|
||||
0,
|
||||
"Fair Tangency",
|
||||
|
@ -1522,7 +1524,7 @@ void SCULPT_OT_face_sets_edit(wmOperatorType *ot)
|
|||
"vertex tangents"},
|
||||
{0, nullptr, 0, nullptr, nullptr},
|
||||
};
|
||||
RNA_def_enum(ot->srna, "mode", modes, SCULPT_FACE_SET_EDIT_GROW, "Mode", "");
|
||||
RNA_def_enum(ot->srna, "mode", modes, int(EditMode::Grow), "Mode", "");
|
||||
RNA_def_float(ot->srna, "strength", 1.0f, 0.0f, 1.0f, "Strength", "", 0.0f, 1.0f);
|
||||
|
||||
ot->prop = RNA_def_boolean(ot->srna,
|
||||
|
|
|
@ -81,7 +81,7 @@ static void color_filter_task(Object *ob,
|
|||
SculptSession *ss = ob->sculpt;
|
||||
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COLOR);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Color);
|
||||
|
||||
AutomaskingNodeData automask_data;
|
||||
SCULPT_automasking_node_begin(ob, ss->filter_cache->automasking, &automask_data, node);
|
||||
|
@ -362,7 +362,7 @@ static int sculpt_color_filter_init(bContext *C, wmOperator *op)
|
|||
SCULPT_filter_cache_init(C,
|
||||
ob,
|
||||
sd,
|
||||
SCULPT_UNDO_COLOR,
|
||||
SculptUndoType::Color,
|
||||
mval_fl,
|
||||
RNA_float_get(op->ptr, "area_normal_radius"),
|
||||
RNA_float_get(op->ptr, "strength"));
|
||||
|
|
|
@ -180,7 +180,7 @@ static int sculpt_mask_filter_exec(bContext *C, wmOperator *op)
|
|||
SCULPT_undo_push_begin(ob, op);
|
||||
|
||||
for (PBVHNode *node : nodes) {
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_MASK);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::Mask);
|
||||
}
|
||||
|
||||
float *prev_mask = nullptr;
|
||||
|
|
|
@ -102,7 +102,7 @@ void SCULPT_filter_zero_disabled_axis_components(float r_v[3], FilterCache *filt
|
|||
void SCULPT_filter_cache_init(bContext *C,
|
||||
Object *ob,
|
||||
Sculpt *sd,
|
||||
const int undo_type,
|
||||
const SculptUndoType undo_type,
|
||||
const float mval_fl[2],
|
||||
float area_normal_radius,
|
||||
float start_strength)
|
||||
|
@ -115,7 +115,7 @@ void SCULPT_filter_cache_init(bContext *C,
|
|||
ss->filter_cache->start_filter_strength = start_strength;
|
||||
ss->filter_cache->random_seed = rand();
|
||||
|
||||
if (undo_type == SCULPT_UNDO_COLOR) {
|
||||
if (undo_type == SculptUndoType::Color) {
|
||||
BKE_pbvh_ensure_node_loops(ss->pbvh);
|
||||
}
|
||||
|
||||
|
@ -140,7 +140,7 @@ void SCULPT_filter_cache_init(bContext *C,
|
|||
}
|
||||
|
||||
for (const int i : ss->filter_cache->nodes.index_range()) {
|
||||
SCULPT_undo_push_node(ob, ss->filter_cache->nodes[i], SculptUndoType(undo_type));
|
||||
SCULPT_undo_push_node(ob, ss->filter_cache->nodes[i], undo_type);
|
||||
}
|
||||
|
||||
/* Setup orientation matrices. */
|
||||
|
@ -355,7 +355,7 @@ static void mesh_filter_task(Object *ob,
|
|||
SculptSession *ss = ob->sculpt;
|
||||
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
|
||||
/* When using the relax face sets meshes filter,
|
||||
* each 3 iterations, do a whole mesh relax to smooth the contents of the Face Set. */
|
||||
|
@ -857,7 +857,7 @@ static void sculpt_mesh_filter_cancel(bContext *C, wmOperator * /*op*/)
|
|||
PBVHVertexIter vd;
|
||||
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
|
||||
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
|
||||
SCULPT_orig_vert_data_update(&orig_data, &vd);
|
||||
|
@ -1022,7 +1022,7 @@ static int sculpt_mesh_filter_start(bContext *C, wmOperator *op)
|
|||
SCULPT_filter_cache_init(C,
|
||||
ob,
|
||||
sd,
|
||||
SCULPT_UNDO_COORDS,
|
||||
SculptUndoType::Position,
|
||||
mval_fl,
|
||||
RNA_float_get(op->ptr, "area_normal_radius"),
|
||||
RNA_float_get(op->ptr, "strength"));
|
||||
|
|
|
@ -138,17 +138,17 @@ enum eBoundaryAutomaskMode {
|
|||
|
||||
/* Undo */
|
||||
|
||||
enum SculptUndoType {
|
||||
SCULPT_UNDO_COORDS,
|
||||
SCULPT_UNDO_HIDDEN,
|
||||
SCULPT_UNDO_FACE_HIDDEN,
|
||||
SCULPT_UNDO_MASK,
|
||||
SCULPT_UNDO_DYNTOPO_BEGIN,
|
||||
SCULPT_UNDO_DYNTOPO_END,
|
||||
SCULPT_UNDO_DYNTOPO_SYMMETRIZE,
|
||||
SCULPT_UNDO_GEOMETRY,
|
||||
SCULPT_UNDO_FACE_SETS,
|
||||
SCULPT_UNDO_COLOR,
|
||||
enum class SculptUndoType : int8_t {
|
||||
Position,
|
||||
HideVert,
|
||||
HideFace,
|
||||
Mask,
|
||||
DyntopoBegin,
|
||||
DyntopoEnd,
|
||||
DyntopoSymmetrize,
|
||||
Geometry,
|
||||
FaceSet,
|
||||
Color,
|
||||
};
|
||||
|
||||
/* Storage of geometry for the undo node.
|
||||
|
@ -1333,7 +1333,7 @@ float *SCULPT_geodesic_from_vertex_and_symm(Sculpt *sd,
|
|||
void SCULPT_filter_cache_init(bContext *C,
|
||||
Object *ob,
|
||||
Sculpt *sd,
|
||||
int undo_type,
|
||||
SculptUndoType undo_type,
|
||||
const float mval_fl[2],
|
||||
float area_normal_radius,
|
||||
float start_strength);
|
||||
|
|
|
@ -56,7 +56,7 @@ static void mask_init_task(Object *ob,
|
|||
{
|
||||
SculptSession *ss = ob->sculpt;
|
||||
PBVHVertexIter vd;
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_MASK);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::Mask);
|
||||
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
|
||||
float mask;
|
||||
switch (mode) {
|
||||
|
|
|
@ -190,7 +190,7 @@ static int sculpt_symmetrize_exec(bContext *C, wmOperator *op)
|
|||
* are logged as added (as opposed to attempting to store just the
|
||||
* parts that symmetrize modifies). */
|
||||
SCULPT_undo_push_begin(ob, op);
|
||||
SCULPT_undo_push_node(ob, nullptr, SCULPT_UNDO_DYNTOPO_SYMMETRIZE);
|
||||
SCULPT_undo_push_node(ob, nullptr, SculptUndoType::DyntopoSymmetrize);
|
||||
BM_log_before_all_removed(ss->bm, ss->bm_log);
|
||||
|
||||
BM_mesh_toolflags_set(ss->bm, true);
|
||||
|
@ -408,7 +408,7 @@ void ED_object_sculptmode_enter_ex(Main *bmain,
|
|||
}
|
||||
SCULPT_dynamic_topology_enable_ex(bmain, depsgraph, ob);
|
||||
if (has_undo) {
|
||||
SCULPT_undo_push_node(ob, nullptr, SCULPT_UNDO_DYNTOPO_BEGIN);
|
||||
SCULPT_undo_push_node(ob, nullptr, SculptUndoType::DyntopoBegin);
|
||||
SCULPT_undo_push_end(ob);
|
||||
}
|
||||
}
|
||||
|
@ -740,7 +740,7 @@ static void do_mask_by_color_contiguous_update_node(Object *ob,
|
|||
{
|
||||
SculptSession *ss = ob->sculpt;
|
||||
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_MASK);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::Mask);
|
||||
bool update_node = false;
|
||||
|
||||
PBVHVertexIter vd;
|
||||
|
@ -846,7 +846,7 @@ static void do_mask_by_color_task(Object *ob,
|
|||
{
|
||||
SculptSession *ss = ob->sculpt;
|
||||
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_MASK);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::Mask);
|
||||
bool update_node = false;
|
||||
|
||||
float active_color[4];
|
||||
|
@ -1012,7 +1012,7 @@ static void sculpt_bake_cavity_exec_task(Object *ob,
|
|||
SculptSession *ss = ob->sculpt;
|
||||
PBVHVertexIter vd;
|
||||
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_MASK);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::Mask);
|
||||
|
||||
AutomaskingNodeData automask_data;
|
||||
SCULPT_automasking_node_begin(ob, automasking, &automask_data, node);
|
||||
|
|
|
@ -92,7 +92,7 @@ static void do_paint_brush_task(Object *ob,
|
|||
PBVHColorBufferNode *color_buffer;
|
||||
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COLOR);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Color);
|
||||
|
||||
color_buffer = BKE_pbvh_node_color_buffer_get(node);
|
||||
|
||||
|
|
|
@ -148,7 +148,7 @@ static void do_pose_brush_task(Object *ob, const Brush *brush, PBVHNode *node)
|
|||
float final_pos[3];
|
||||
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
AutomaskingNodeData automask_data;
|
||||
SCULPT_automasking_node_begin(ob, ss->cache->automasking, &automask_data, node);
|
||||
|
||||
|
|
|
@ -439,7 +439,7 @@ static void do_surface_smooth_brush_laplacian_task(Object *ob, const Brush *brus
|
|||
ss, &test, brush->falloff_shape);
|
||||
const int thread_id = BLI_task_parallel_thread_id(nullptr);
|
||||
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
AutomaskingNodeData automask_data;
|
||||
SCULPT_automasking_node_begin(ob, ss->cache->automasking, &automask_data, node);
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ void ED_sculpt_init_transform(bContext *C,
|
|||
|
||||
SCULPT_vertex_random_access_ensure(ss);
|
||||
|
||||
SCULPT_filter_cache_init(C, ob, sd, SCULPT_UNDO_COORDS, mval_fl, 5.0, 1.0f);
|
||||
SCULPT_filter_cache_init(C, ob, sd, SculptUndoType::Position, mval_fl, 5.0, 1.0f);
|
||||
|
||||
if (sd->transform_mode == SCULPT_TRANSFORM_MODE_RADIUS_ELASTIC) {
|
||||
ss->filter_cache->transform_displacement_mode = SCULPT_TRANSFORM_DISPLACEMENT_INCREMENTAL;
|
||||
|
@ -147,11 +147,11 @@ static void sculpt_transform_task(Object *ob, const float transform_mats[8][4][4
|
|||
SculptSession *ss = ob->sculpt;
|
||||
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
|
||||
PBVHVertexIter vd;
|
||||
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::Position);
|
||||
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
|
||||
SCULPT_orig_vert_data_update(&orig_data, &vd);
|
||||
float *start_co;
|
||||
|
@ -215,7 +215,7 @@ static void sculpt_elastic_transform_task(Object *ob,
|
|||
const MutableSpan<float3> proxy = BKE_pbvh_node_add_proxy(*ss->pbvh, *node).co;
|
||||
|
||||
SculptOrigVertData orig_data;
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_orig_vert_data_init(&orig_data, ob, node, SculptUndoType::Position);
|
||||
|
||||
KelvinletParams params;
|
||||
/* TODO(pablodp606): These parameters can be exposed if needed as transform strength and volume
|
||||
|
@ -226,7 +226,7 @@ static void sculpt_elastic_transform_task(Object *ob,
|
|||
const float poisson_ratio = 0.4f;
|
||||
BKE_kelvinlet_init_params(¶ms, transform_radius, force, shear_modulus, poisson_ratio);
|
||||
|
||||
SCULPT_undo_push_node(ob, node, SCULPT_UNDO_COORDS);
|
||||
SCULPT_undo_push_node(ob, node, SculptUndoType::Position);
|
||||
|
||||
PBVHVertexIter vd;
|
||||
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
|
||||
|
|
|
@ -174,16 +174,16 @@ static UndoSculpt *sculpt_undosys_step_get_nodes(UndoStep *us_p);
|
|||
static char *undo_type_to_str(int type)
|
||||
{
|
||||
switch (type) {
|
||||
_(SCULPT_UNDO_DYNTOPO_BEGIN)
|
||||
_(SCULPT_UNDO_DYNTOPO_END)
|
||||
_(SCULPT_UNDO_COORDS)
|
||||
_(SCULPT_UNDO_GEOMETRY)
|
||||
_(SCULPT_UNDO_DYNTOPO_SYMMETRIZE)
|
||||
_(SCULPT_UNDO_FACE_SETS)
|
||||
_(SCULPT_UNDO_HIDDEN)
|
||||
_(SCULPT_UNDO_FACE_HIDDEN)
|
||||
_(SCULPT_UNDO_MASK)
|
||||
_(SCULPT_UNDO_COLOR)
|
||||
_(SculptUndoType::DyntopoBegin)
|
||||
_(SculptUndoType::DyntopoEnd)
|
||||
_(SculptUndoType::Position)
|
||||
_(SculptUndoType::Geometry)
|
||||
_(SculptUndoType::DyntopoSymmetrize)
|
||||
_(SculptUndoType::FaceSet)
|
||||
_(SculptUndoType::HideVert)
|
||||
_(SculptUndoType::HideFace)
|
||||
_(SculptUndoType::Mask)
|
||||
_(SculptUndoType::Color)
|
||||
default:
|
||||
return "unknown node type";
|
||||
}
|
||||
|
@ -707,7 +707,7 @@ static void sculpt_undo_bmesh_restore_generic(SculptUndoNode *unode, Object *ob,
|
|||
unode->applied = true;
|
||||
}
|
||||
|
||||
if (unode->type == SCULPT_UNDO_MASK) {
|
||||
if (unode->type == SculptUndoType::Mask) {
|
||||
Vector<PBVHNode *> nodes = blender::bke::pbvh::search_gather(ss->pbvh, {});
|
||||
for (PBVHNode *node : nodes) {
|
||||
BKE_pbvh_node_mark_redraw(node);
|
||||
|
@ -868,11 +868,11 @@ static int sculpt_undo_bmesh_restore(bContext *C,
|
|||
SculptSession *ss)
|
||||
{
|
||||
switch (unode->type) {
|
||||
case SCULPT_UNDO_DYNTOPO_BEGIN:
|
||||
case SculptUndoType::DyntopoBegin:
|
||||
sculpt_undo_bmesh_restore_begin(C, unode, ob, ss);
|
||||
return true;
|
||||
|
||||
case SCULPT_UNDO_DYNTOPO_END:
|
||||
case SculptUndoType::DyntopoEnd:
|
||||
sculpt_undo_bmesh_restore_end(C, unode, ob, ss);
|
||||
return true;
|
||||
default:
|
||||
|
@ -924,7 +924,7 @@ static void sculpt_undo_restore_list(bContext *C, Depsgraph *depsgraph, ListBase
|
|||
|
||||
bool clear_automask_cache = false;
|
||||
LISTBASE_FOREACH (SculptUndoNode *, unode, lb) {
|
||||
if (!ELEM(unode->type, SCULPT_UNDO_COLOR, SCULPT_UNDO_MASK)) {
|
||||
if (!ELEM(unode->type, SculptUndoType::Color, SculptUndoType::Mask)) {
|
||||
clear_automask_cache = true;
|
||||
}
|
||||
|
||||
|
@ -942,7 +942,7 @@ static void sculpt_undo_restore_list(bContext *C, Depsgraph *depsgraph, ListBase
|
|||
* Undo steps like geometry does not need object to be updated before they run and will
|
||||
* ensure object is updated after the node is handled. */
|
||||
const SculptUndoNode *first_unode = (const SculptUndoNode *)lb->first;
|
||||
if (first_unode->type != SCULPT_UNDO_GEOMETRY) {
|
||||
if (first_unode->type != SculptUndoType::Geometry) {
|
||||
BKE_sculpt_update_object_for_edit(depsgraph, ob, false);
|
||||
}
|
||||
|
||||
|
@ -991,50 +991,50 @@ static void sculpt_undo_restore_list(bContext *C, Depsgraph *depsgraph, ListBase
|
|||
}
|
||||
|
||||
switch (unode->type) {
|
||||
case SCULPT_UNDO_COORDS:
|
||||
case SculptUndoType::Position:
|
||||
if (sculpt_undo_restore_coords(C, ob, depsgraph, unode)) {
|
||||
changed_position = true;
|
||||
}
|
||||
break;
|
||||
case SCULPT_UNDO_HIDDEN:
|
||||
case SculptUndoType::HideVert:
|
||||
modified_verts_hide.resize(ss->totvert, false);
|
||||
if (sculpt_undo_restore_hidden(ob, unode, modified_verts_hide)) {
|
||||
changed_hide_vert = true;
|
||||
}
|
||||
break;
|
||||
case SCULPT_UNDO_FACE_HIDDEN:
|
||||
case SculptUndoType::HideFace:
|
||||
modified_faces_hide.resize(ss->totfaces, false);
|
||||
if (sculpt_undo_restore_hidden_face(*ob, *unode, modified_faces_hide)) {
|
||||
changed_hide_face = true;
|
||||
}
|
||||
break;
|
||||
case SCULPT_UNDO_MASK:
|
||||
case SculptUndoType::Mask:
|
||||
modified_verts_mask.resize(ss->totvert, false);
|
||||
if (sculpt_undo_restore_mask(ob, unode, modified_verts_mask)) {
|
||||
changed_mask = true;
|
||||
}
|
||||
break;
|
||||
case SCULPT_UNDO_FACE_SETS:
|
||||
case SculptUndoType::FaceSet:
|
||||
modified_faces_face_set.resize(ss->totfaces, false);
|
||||
if (sculpt_undo_restore_face_sets(ob, unode, modified_faces_face_set)) {
|
||||
changed_face_sets = true;
|
||||
}
|
||||
break;
|
||||
case SCULPT_UNDO_COLOR:
|
||||
case SculptUndoType::Color:
|
||||
modified_verts_color.resize(ss->totvert, false);
|
||||
if (sculpt_undo_restore_color(ob, unode, modified_verts_color)) {
|
||||
changed_color = true;
|
||||
}
|
||||
break;
|
||||
case SCULPT_UNDO_GEOMETRY:
|
||||
case SculptUndoType::Geometry:
|
||||
sculpt_undo_geometry_restore(unode, ob);
|
||||
changed_all_geometry = true;
|
||||
BKE_sculpt_update_object_for_edit(depsgraph, ob, false);
|
||||
break;
|
||||
|
||||
case SCULPT_UNDO_DYNTOPO_BEGIN:
|
||||
case SCULPT_UNDO_DYNTOPO_END:
|
||||
case SCULPT_UNDO_DYNTOPO_SYMMETRIZE:
|
||||
case SculptUndoType::DyntopoBegin:
|
||||
case SculptUndoType::DyntopoEnd:
|
||||
case SculptUndoType::DyntopoSymmetrize:
|
||||
BLI_assert_msg(0, "Dynamic topology should've already been handled");
|
||||
break;
|
||||
}
|
||||
|
@ -1232,8 +1232,8 @@ static SculptUndoNode *sculpt_undo_alloc_node(Object *ob, PBVHNode *node, Sculpt
|
|||
|
||||
unode->totvert = totvert;
|
||||
|
||||
bool need_loops = type == SCULPT_UNDO_COLOR;
|
||||
const bool need_faces = ELEM(type, SCULPT_UNDO_FACE_SETS, SCULPT_UNDO_FACE_HIDDEN);
|
||||
bool need_loops = type == SculptUndoType::Color;
|
||||
const bool need_faces = ELEM(type, SculptUndoType::FaceSet, SculptUndoType::HideFace);
|
||||
|
||||
if (need_loops) {
|
||||
int totloop;
|
||||
|
@ -1253,7 +1253,7 @@ static SculptUndoNode *sculpt_undo_alloc_node(Object *ob, PBVHNode *node, Sculpt
|
|||
}
|
||||
|
||||
switch (type) {
|
||||
case SCULPT_UNDO_COORDS: {
|
||||
case SculptUndoType::Position: {
|
||||
unode->co.reinitialize(allvert);
|
||||
usculpt->undo_size += unode->co.as_span().size_in_bytes();
|
||||
|
||||
|
@ -1262,7 +1262,7 @@ static SculptUndoNode *sculpt_undo_alloc_node(Object *ob, PBVHNode *node, Sculpt
|
|||
usculpt->undo_size += unode->no.as_span().size_in_bytes();
|
||||
break;
|
||||
}
|
||||
case SCULPT_UNDO_HIDDEN: {
|
||||
case SculptUndoType::HideVert: {
|
||||
if (grids.is_empty()) {
|
||||
unode->vert_hidden.resize(allvert);
|
||||
usculpt->undo_size += BLI_BITMAP_SIZE(allvert);
|
||||
|
@ -1273,17 +1273,17 @@ static SculptUndoNode *sculpt_undo_alloc_node(Object *ob, PBVHNode *node, Sculpt
|
|||
|
||||
break;
|
||||
}
|
||||
case SCULPT_UNDO_FACE_HIDDEN: {
|
||||
case SculptUndoType::HideFace: {
|
||||
unode->face_hidden.resize(unode->face_indices.size());
|
||||
usculpt->undo_size += BLI_BITMAP_SIZE(unode->face_indices.size());
|
||||
break;
|
||||
}
|
||||
case SCULPT_UNDO_MASK: {
|
||||
case SculptUndoType::Mask: {
|
||||
unode->mask.reinitialize(allvert);
|
||||
usculpt->undo_size += unode->mask.as_span().size_in_bytes();
|
||||
break;
|
||||
}
|
||||
case SCULPT_UNDO_COLOR: {
|
||||
case SculptUndoType::Color: {
|
||||
/* Allocate vertex colors, even for loop colors we still
|
||||
* need this for original data lookup. */
|
||||
unode->col.reinitialize(allvert);
|
||||
|
@ -1296,14 +1296,14 @@ static SculptUndoNode *sculpt_undo_alloc_node(Object *ob, PBVHNode *node, Sculpt
|
|||
}
|
||||
break;
|
||||
}
|
||||
case SCULPT_UNDO_DYNTOPO_BEGIN:
|
||||
case SCULPT_UNDO_DYNTOPO_END:
|
||||
case SCULPT_UNDO_DYNTOPO_SYMMETRIZE:
|
||||
case SculptUndoType::DyntopoBegin:
|
||||
case SculptUndoType::DyntopoEnd:
|
||||
case SculptUndoType::DyntopoSymmetrize:
|
||||
BLI_assert_msg(0, "Dynamic topology should've already been handled");
|
||||
break;
|
||||
case SCULPT_UNDO_GEOMETRY:
|
||||
case SculptUndoType::Geometry:
|
||||
break;
|
||||
case SCULPT_UNDO_FACE_SETS: {
|
||||
case SculptUndoType::FaceSet: {
|
||||
unode->face_sets.reinitialize(unode->face_indices.size());
|
||||
usculpt->undo_size += unode->face_sets.as_span().size_in_bytes();
|
||||
break;
|
||||
|
@ -1461,11 +1461,11 @@ static SculptUndoNode *sculpt_undo_bmesh_push(Object *ob, PBVHNode *node, Sculpt
|
|||
unode->type = type;
|
||||
unode->applied = true;
|
||||
|
||||
if (type == SCULPT_UNDO_DYNTOPO_END) {
|
||||
if (type == SculptUndoType::DyntopoEnd) {
|
||||
unode->bm_entry = BM_log_entry_add(ss->bm_log);
|
||||
BM_log_before_all_removed(ss->bm, ss->bm_log);
|
||||
}
|
||||
else if (type == SCULPT_UNDO_DYNTOPO_BEGIN) {
|
||||
else if (type == SculptUndoType::DyntopoBegin) {
|
||||
/* Store a copy of the mesh's current vertices, loops, and
|
||||
* faces. A full copy like this is needed because entering
|
||||
* dynamic-topology immediately does topological edits
|
||||
|
@ -1486,8 +1486,8 @@ static SculptUndoNode *sculpt_undo_bmesh_push(Object *ob, PBVHNode *node, Sculpt
|
|||
|
||||
if (node) {
|
||||
switch (type) {
|
||||
case SCULPT_UNDO_COORDS:
|
||||
case SCULPT_UNDO_MASK:
|
||||
case SculptUndoType::Position:
|
||||
case SculptUndoType::Mask:
|
||||
/* Before any vertex values get modified, ensure their
|
||||
* original positions are logged. */
|
||||
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_ALL) {
|
||||
|
@ -1496,8 +1496,8 @@ static SculptUndoNode *sculpt_undo_bmesh_push(Object *ob, PBVHNode *node, Sculpt
|
|||
BKE_pbvh_vertex_iter_end;
|
||||
break;
|
||||
|
||||
case SCULPT_UNDO_FACE_HIDDEN:
|
||||
case SCULPT_UNDO_HIDDEN: {
|
||||
case SculptUndoType::HideFace:
|
||||
case SculptUndoType::HideVert: {
|
||||
BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_ALL) {
|
||||
BM_log_vert_before_modified(ss->bm_log, vd.bm_vert, vd.cd_vert_mask_offset);
|
||||
}
|
||||
|
@ -1509,12 +1509,12 @@ static SculptUndoNode *sculpt_undo_bmesh_push(Object *ob, PBVHNode *node, Sculpt
|
|||
break;
|
||||
}
|
||||
|
||||
case SCULPT_UNDO_DYNTOPO_BEGIN:
|
||||
case SCULPT_UNDO_DYNTOPO_END:
|
||||
case SCULPT_UNDO_DYNTOPO_SYMMETRIZE:
|
||||
case SCULPT_UNDO_GEOMETRY:
|
||||
case SCULPT_UNDO_FACE_SETS:
|
||||
case SCULPT_UNDO_COLOR:
|
||||
case SculptUndoType::DyntopoBegin:
|
||||
case SculptUndoType::DyntopoEnd:
|
||||
case SculptUndoType::DyntopoSymmetrize:
|
||||
case SculptUndoType::Geometry:
|
||||
case SculptUndoType::FaceSet:
|
||||
case SculptUndoType::Color:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1532,14 +1532,14 @@ SculptUndoNode *SCULPT_undo_push_node(Object *ob, PBVHNode *node, SculptUndoType
|
|||
|
||||
ss->needs_flush_to_id = 1;
|
||||
|
||||
if (ss->bm || ELEM(type, SCULPT_UNDO_DYNTOPO_BEGIN, SCULPT_UNDO_DYNTOPO_END)) {
|
||||
if (ss->bm || ELEM(type, SculptUndoType::DyntopoBegin, SculptUndoType::DyntopoEnd)) {
|
||||
/* Dynamic topology stores only one undo node per stroke,
|
||||
* regardless of the number of PBVH nodes modified. */
|
||||
unode = sculpt_undo_bmesh_push(ob, node, type);
|
||||
BLI_thread_unlock(LOCK_CUSTOM1);
|
||||
return unode;
|
||||
}
|
||||
if (type == SCULPT_UNDO_GEOMETRY) {
|
||||
if (type == SculptUndoType::Geometry) {
|
||||
unode = sculpt_undo_geometry_push(ob, type);
|
||||
BLI_thread_unlock(LOCK_CUSTOM1);
|
||||
return unode;
|
||||
|
@ -1577,30 +1577,30 @@ SculptUndoNode *SCULPT_undo_push_node(Object *ob, PBVHNode *node, SculptUndoType
|
|||
}
|
||||
|
||||
switch (type) {
|
||||
case SCULPT_UNDO_COORDS:
|
||||
case SculptUndoType::Position:
|
||||
sculpt_undo_store_coords(ob, unode);
|
||||
break;
|
||||
case SCULPT_UNDO_HIDDEN:
|
||||
case SculptUndoType::HideVert:
|
||||
sculpt_undo_store_hidden(ob, unode);
|
||||
break;
|
||||
case SCULPT_UNDO_FACE_HIDDEN:
|
||||
case SculptUndoType::HideFace:
|
||||
sculpt_undo_store_face_hidden(*ob, *unode);
|
||||
break;
|
||||
case SCULPT_UNDO_MASK:
|
||||
case SculptUndoType::Mask:
|
||||
if (pbvh_has_mask(ss->pbvh)) {
|
||||
sculpt_undo_store_mask(ob, unode);
|
||||
}
|
||||
break;
|
||||
case SCULPT_UNDO_COLOR:
|
||||
case SculptUndoType::Color:
|
||||
sculpt_undo_store_color(ob, unode);
|
||||
break;
|
||||
case SCULPT_UNDO_DYNTOPO_BEGIN:
|
||||
case SCULPT_UNDO_DYNTOPO_END:
|
||||
case SCULPT_UNDO_DYNTOPO_SYMMETRIZE:
|
||||
case SculptUndoType::DyntopoBegin:
|
||||
case SculptUndoType::DyntopoEnd:
|
||||
case SculptUndoType::DyntopoSymmetrize:
|
||||
BLI_assert_msg(0, "Dynamic topology should've already been handled");
|
||||
case SCULPT_UNDO_GEOMETRY:
|
||||
case SculptUndoType::Geometry:
|
||||
break;
|
||||
case SCULPT_UNDO_FACE_SETS:
|
||||
case SculptUndoType::FaceSet:
|
||||
sculpt_undo_store_face_sets(*static_cast<const Mesh *>(ob->data), *unode);
|
||||
break;
|
||||
}
|
||||
|
@ -1795,7 +1795,7 @@ static bool sculpt_undosys_step_encode(bContext * /*C*/, Main *bmain, UndoStep *
|
|||
us->step.data_size = us->data.undo_size;
|
||||
|
||||
SculptUndoNode *unode = static_cast<SculptUndoNode *>(us->data.nodes.last);
|
||||
if (unode && unode->type == SCULPT_UNDO_DYNTOPO_END) {
|
||||
if (unode && unode->type == SculptUndoType::DyntopoEnd) {
|
||||
us->step.use_memfile_step = true;
|
||||
}
|
||||
us->step.is_applied = true;
|
||||
|
@ -1946,18 +1946,18 @@ static void sculpt_undosys_step_free(UndoStep *us_p)
|
|||
void ED_sculpt_undo_geometry_begin(Object *ob, const wmOperator *op)
|
||||
{
|
||||
SCULPT_undo_push_begin(ob, op);
|
||||
SCULPT_undo_push_node(ob, nullptr, SCULPT_UNDO_GEOMETRY);
|
||||
SCULPT_undo_push_node(ob, nullptr, SculptUndoType::Geometry);
|
||||
}
|
||||
|
||||
void ED_sculpt_undo_geometry_begin_ex(Object *ob, const char *name)
|
||||
{
|
||||
SCULPT_undo_push_begin_ex(ob, name);
|
||||
SCULPT_undo_push_node(ob, nullptr, SCULPT_UNDO_GEOMETRY);
|
||||
SCULPT_undo_push_node(ob, nullptr, SculptUndoType::Geometry);
|
||||
}
|
||||
|
||||
void ED_sculpt_undo_geometry_end(Object *ob)
|
||||
{
|
||||
SCULPT_undo_push_node(ob, nullptr, SCULPT_UNDO_GEOMETRY);
|
||||
SCULPT_undo_push_node(ob, nullptr, SculptUndoType::Geometry);
|
||||
SCULPT_undo_push_end(ob);
|
||||
}
|
||||
|
||||
|
@ -2038,7 +2038,7 @@ static void sculpt_undo_push_all_grids(Object *object)
|
|||
* happens, for example, when an operation which tagged for geometry update was performed prior
|
||||
* to the current operation without making any stroke in between.
|
||||
*
|
||||
* Skip pushing nodes based on the following logic: on redo SCULPT_UNDO_COORDS will ensure
|
||||
* Skip pushing nodes based on the following logic: on redo SculptUndoType::Position will ensure
|
||||
* PBVH for the new base geometry, which will have same coordinates as if we create PBVH here.
|
||||
*/
|
||||
if (ss->pbvh == nullptr) {
|
||||
|
@ -2047,7 +2047,7 @@ static void sculpt_undo_push_all_grids(Object *object)
|
|||
|
||||
Vector<PBVHNode *> nodes = blender::bke::pbvh::search_gather(ss->pbvh, {});
|
||||
for (PBVHNode *node : nodes) {
|
||||
SculptUndoNode *unode = SCULPT_undo_push_node(object, node, SCULPT_UNDO_COORDS);
|
||||
SculptUndoNode *unode = SCULPT_undo_push_node(object, node, SculptUndoType::Position);
|
||||
unode->node = nullptr;
|
||||
}
|
||||
}
|
||||
|
@ -2062,7 +2062,8 @@ void ED_sculpt_undo_push_multires_mesh_begin(bContext *C, const char *str)
|
|||
|
||||
SCULPT_undo_push_begin_ex(object, str);
|
||||
|
||||
SculptUndoNode *geometry_unode = SCULPT_undo_push_node(object, nullptr, SCULPT_UNDO_GEOMETRY);
|
||||
SculptUndoNode *geometry_unode = SCULPT_undo_push_node(
|
||||
object, nullptr, SculptUndoType::Geometry);
|
||||
geometry_unode->geometry_clear_pbvh = false;
|
||||
|
||||
sculpt_undo_push_all_grids(object);
|
||||
|
@ -2077,7 +2078,8 @@ void ED_sculpt_undo_push_multires_mesh_end(bContext *C, const char *str)
|
|||
|
||||
Object *object = CTX_data_active_object(C);
|
||||
|
||||
SculptUndoNode *geometry_unode = SCULPT_undo_push_node(object, nullptr, SCULPT_UNDO_GEOMETRY);
|
||||
SculptUndoNode *geometry_unode = SCULPT_undo_push_node(
|
||||
object, nullptr, SculptUndoType::Geometry);
|
||||
geometry_unode->geometry_clear_pbvh = false;
|
||||
|
||||
SCULPT_undo_push_end(object);
|
||||
|
|
Loading…
Reference in New Issue