Fix T96372: UV editor selection display wrong with GPU subdivision

Vertices were not drawn properly as the logic for mapped mesh was used
in the BMesh case.

Edge display would ignore subdivided edges which would come from coarse
edges when setting display flags.
This commit is contained in:
Kévin Dietrich 2022-03-23 04:01:12 +01:00
parent 694fe9f77b
commit 612ec0ecdf
Notes: blender-bot 2023-02-14 03:00:45 +01:00
Referenced by issue #96372, UV Editor doesn't work when GPU Subdivision in the Viewport is enabled
Referenced by issue #96241, 3.1: Potential candidates for corrective releases
2 changed files with 19 additions and 6 deletions

View File

@ -419,7 +419,7 @@ static void extract_edituv_points_init_subdiv(const DRWSubdivCache *subdiv_cache
}
static void extract_edituv_points_iter_subdiv_bm(const DRWSubdivCache *subdiv_cache,
const MeshRenderData *mr,
const MeshRenderData *UNUSED(mr),
void *_data,
uint subdiv_quad_index,
const BMFace *coarse_quad)
@ -431,11 +431,8 @@ static void extract_edituv_points_iter_subdiv_bm(const DRWSubdivCache *subdiv_ca
uint end_loop_idx = (subdiv_quad_index + 1) * 4;
for (uint i = start_loop_idx; i < end_loop_idx; i++) {
const int vert_origindex = subdiv_loop_vert_index[i];
const bool real_vert = (mr->extract_type == MR_EXTRACT_MAPPED && (mr->v_origindex) &&
vert_origindex != -1 &&
mr->v_origindex[vert_origindex] != ORIGINDEX_NONE);
edituv_point_add(data,
(BM_elem_flag_test(coarse_quad, BM_ELEM_HIDDEN)) || !real_vert,
(BM_elem_flag_test(coarse_quad, BM_ELEM_HIDDEN) || vert_origindex == -1),
BM_elem_flag_test(coarse_quad, BM_ELEM_SELECT) != 0,
i);
}

View File

@ -137,7 +137,7 @@ static void extract_edituv_data_iter_subdiv_bm(const DRWSubdivCache *subdiv_cach
uint end_loop_idx = (subdiv_quad_index + 1) * 4;
for (uint i = start_loop_idx; i < end_loop_idx; i++) {
const int vert_origindex = subdiv_loop_vert_index[i];
const int edge_origindex = subdiv_loop_edge_index[i];
int edge_origindex = subdiv_loop_edge_index[i];
EditLoopData *edit_loop_data = &data->vbo_data[i];
memset(edit_loop_data, 0, sizeof(EditLoopData));
@ -149,6 +149,22 @@ static void extract_edituv_data_iter_subdiv_bm(const DRWSubdivCache *subdiv_cach
mesh_render_data_loop_flag(mr, l, data->cd_ofs, edit_loop_data);
mesh_render_data_loop_edge_flag(mr, l, data->cd_ofs, edit_loop_data);
}
else {
if (edge_origindex == -1) {
/* Find if the loop's vert is not part of an edit edge.
* For this, we check if the previous loop was on an edge. */
const uint loop_index_last = (i == start_loop_idx) ? end_loop_idx - 1 : i - 1;
edge_origindex = subdiv_loop_edge_index[loop_index_last];
}
if (edge_origindex != -1) {
/* Mapped points on an edge between two edit verts. */
BMEdge *eed = BM_edge_at_index(mr->bm, edge_origindex);
BMLoop *l = BM_face_edge_share_loop(const_cast<BMFace *>(coarse_quad), eed);
mesh_render_data_loop_edge_flag(mr, l, data->cd_ofs, edit_loop_data);
}
}
mesh_render_data_face_flag(mr, coarse_quad, data->cd_ofs, edit_loop_data);
}
}