From 612ec0ecdf047980164b3820e5a890d0fd0f0969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dietrich?= Date: Wed, 23 Mar 2022 04:01:12 +0100 Subject: 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. --- .../intern/mesh_extractors/extract_mesh_ibo_edituv.cc | 7 ++----- .../mesh_extractors/extract_mesh_vbo_edituv_data.cc | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 6 deletions(-) (limited to 'source/blender/draw/intern') diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc index ae536f0b87c..27149a80f9b 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc @@ -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); } diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_data.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_data.cc index 2dfd2cd43dc..f79fe345f5a 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_data.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_data.cc @@ -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(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); } } -- cgit v1.2.3