Fix T81915: Draw Face Sets not working with deformed sculpt mesh
The draw face sets brush uses the poly center when used in meshes to increase its precision when working in low poly geometry. For this to work with deformed meshes, the deformed coordinates from the PBVH should be used instead. Reviewed By: sergey Maniphest Tasks: T81915 Differential Revision: https://developer.blender.org/D9424
This commit is contained in:
parent
e041d0fc02
commit
02677ec4e0
Notes:
blender-bot
2023-02-13 20:47:37 +01:00
Referenced by issue #83487, Viewport rendered shading keeps refreshing Referenced by issue #82460, Color Management Use Curves do not update when UV Editor is presented Referenced by issue #81915, FaceSets drawing not working on mesh with shapekeys
|
@ -292,6 +292,21 @@ void SCULPT_active_vertex_normal_get(SculptSession *ss, float normal[3])
|
|||
SCULPT_vertex_normal_get(ss, SCULPT_active_vertex_get(ss), normal);
|
||||
}
|
||||
|
||||
MVert *SCULPT_mesh_deformed_mverts_get(SculptSession *ss)
|
||||
{
|
||||
switch (BKE_pbvh_type(ss->pbvh)) {
|
||||
case PBVH_FACES:
|
||||
if (ss->shapekey_active || ss->deform_modifiers_active) {
|
||||
return BKE_pbvh_get_verts(ss->pbvh);
|
||||
}
|
||||
return ss->mvert;
|
||||
case PBVH_BMESH:
|
||||
case PBVH_GRIDS:
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
float *SCULPT_brush_deform_target_vertex_co_get(SculptSession *ss,
|
||||
const int deform_target,
|
||||
PBVHVertexIter *iter)
|
||||
|
|
|
@ -132,6 +132,8 @@ static void do_draw_face_sets_brush_task_cb_ex(void *__restrict userdata,
|
|||
ss, &test, data->brush->falloff_shape);
|
||||
const int thread_id = BLI_task_parallel_thread_id(tls);
|
||||
|
||||
MVert *mvert = SCULPT_mesh_deformed_mverts_get(ss);
|
||||
|
||||
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
|
||||
{
|
||||
if (BKE_pbvh_type(ss->pbvh) == PBVH_FACES) {
|
||||
|
@ -140,7 +142,7 @@ static void do_draw_face_sets_brush_task_cb_ex(void *__restrict userdata,
|
|||
const MPoly *p = &ss->mpoly[vert_map->indices[j]];
|
||||
|
||||
float poly_center[3];
|
||||
BKE_mesh_calc_poly_center(p, &ss->mloop[p->loopstart], ss->mvert, poly_center);
|
||||
BKE_mesh_calc_poly_center(p, &ss->mloop[p->loopstart], mvert, poly_center);
|
||||
|
||||
if (sculpt_brush_test_sq_fn(&test, poly_center)) {
|
||||
const float fade = bstrength * SCULPT_brush_strength_factor(ss,
|
||||
|
|
|
@ -170,6 +170,10 @@ int SCULPT_active_vertex_get(SculptSession *ss);
|
|||
const float *SCULPT_active_vertex_co_get(SculptSession *ss);
|
||||
void SCULPT_active_vertex_normal_get(SculptSession *ss, float normal[3]);
|
||||
|
||||
/* Returns PBVH deformed vertices array if shape keys or deform modifiers are used, otherwise
|
||||
* returns mesh original vertices array. */
|
||||
struct MVert *SCULPT_mesh_deformed_mverts_get(SculptSession *ss);
|
||||
|
||||
/* Fake Neighbors */
|
||||
|
||||
#define FAKE_NEIGHBOR_NONE -1
|
||||
|
|
Loading…
Reference in New Issue