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:
@@ -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
|
||||
|
Reference in New Issue
Block a user