diff options
Diffstat (limited to 'source/blender/blenkernel/intern/paint.cc')
-rw-r--r-- | source/blender/blenkernel/intern/paint.cc | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/source/blender/blenkernel/intern/paint.cc b/source/blender/blenkernel/intern/paint.cc index 10dfa3f59e7..73db00e7306 100644 --- a/source/blender/blenkernel/intern/paint.cc +++ b/source/blender/blenkernel/intern/paint.cc @@ -1667,16 +1667,16 @@ static void sculpt_update_object(Depsgraph *depsgraph, /* These are assigned to the base mesh in Multires. This is needed because Face Sets operators * and tools use the Face Sets data from the base mesh when Multires is active. */ - ss->mvert = BKE_mesh_vertices_for_write(me); - ss->mpoly = BKE_mesh_polygons(me); + ss->mvert = BKE_mesh_verts_for_write(me); + ss->mpoly = BKE_mesh_polys(me); ss->mloop = BKE_mesh_loops(me); } else { ss->totvert = me->totvert; ss->totpoly = me->totpoly; ss->totfaces = me->totpoly; - ss->mvert = BKE_mesh_vertices_for_write(me); - ss->mpoly = BKE_mesh_polygons(me); + ss->mvert = BKE_mesh_verts_for_write(me); + ss->mpoly = BKE_mesh_polys(me); ss->mloop = BKE_mesh_loops(me); ss->multires.active = false; ss->multires.modifier = nullptr; @@ -1729,7 +1729,7 @@ static void sculpt_update_object(Depsgraph *depsgraph, if (need_pmap && ob->type == OB_MESH && !ss->pmap) { BKE_mesh_vert_poly_map_create(&ss->pmap, &ss->pmap_mem, - BKE_mesh_polygons(me), + BKE_mesh_polys(me), BKE_mesh_loops(me), me->totvert, me->totpoly, @@ -1744,27 +1744,30 @@ static void sculpt_update_object(Depsgraph *depsgraph, pbvh_show_face_sets_set(ss->pbvh, ss->show_face_sets); if (ss->deform_modifiers_active) { - /* Painting doesn't need crazyspace, use already evaluated mesh coordinates. */ + /* Painting doesn't need crazyspace, use already evaluated mesh coordinates if possible. */ + bool used_me_eval = false; + if (ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT)) { Mesh *me_eval_deform = ob_eval->runtime.mesh_deform_eval; /* If the fully evaluated mesh has the same topology as the deform-only version, use it. - * This matters because 'deform eval' is very restrictive and excludes even modifiers that - * simply recompute vertex weights. */ - if (me_eval_deform->polygons().data() == me_eval->polygons().data() && + * This matters because crazyspace evaluation is very restrictive and excludes even modifiers + * that simply recompute vertex weights (which can even include Geometry Nodes). */ + if (me_eval_deform->polys().data() == me_eval->polys().data() && me_eval_deform->loops().data() == me_eval->loops().data() && me_eval_deform->totvert == me_eval->totvert) { - me_eval_deform = me_eval; - } + BKE_sculptsession_free_deformMats(ss); - BKE_sculptsession_free_deformMats(ss); + BLI_assert(me_eval_deform->totvert == me->totvert); - BLI_assert(me_eval_deform->totvert == me->totvert); + ss->deform_cos = BKE_mesh_vert_coords_alloc(me_eval, NULL); + BKE_pbvh_vert_coords_apply(ss->pbvh, ss->deform_cos, me->totvert); - ss->deform_cos = BKE_mesh_vert_coords_alloc(me_eval_deform, NULL); - BKE_pbvh_vert_coords_apply(ss->pbvh, ss->deform_cos, me->totvert); + used_me_eval = true; + } } - else if (!ss->orig_cos) { + + if (!ss->orig_cos && !used_me_eval) { int a; BKE_sculptsession_free_deformMats(ss); @@ -1926,7 +1929,7 @@ void BKE_sculpt_color_layer_create_if_needed(Object *object) return; } - CustomData_add_layer(&orig_me->vdata, CD_PROP_COLOR, CD_CONSTRUCT, nullptr, orig_me->totvert); + CustomData_add_layer(&orig_me->vdata, CD_PROP_COLOR, CD_SET_DEFAULT, nullptr, orig_me->totvert); CustomDataLayer *layer = orig_me->vdata.layers + CustomData_get_layer_index(&orig_me->vdata, CD_PROP_COLOR); @@ -1953,7 +1956,7 @@ void BKE_sculpt_update_object_for_edit( int BKE_sculpt_mask_layers_ensure(Object *ob, MultiresModifierData *mmd) { Mesh *me = static_cast<Mesh *>(ob->data); - const Span<MPoly> polys = me->polygons(); + const Span<MPoly> polys = me->polys(); const Span<MLoop> loops = me->loops(); int ret = 0; @@ -2245,8 +2248,8 @@ static PBVH *build_pbvh_from_regular_mesh(Object *ob, Mesh *me_eval_deform, bool PBVH *pbvh = BKE_pbvh_new(); BKE_pbvh_respect_hide_set(pbvh, respect_hide); - MutableSpan<MVert> verts = me->vertices_for_write(); - const Span<MPoly> polys = me->polygons(); + MutableSpan<MVert> verts = me->verts_for_write(); + const Span<MPoly> polys = me->polys(); const Span<MLoop> loops = me->loops(); MLoopTri *looptri = static_cast<MLoopTri *>( |