diff options
author | Kévin Dietrich <kevin.dietrich@mailoo.org> | 2022-01-16 10:40:38 +0300 |
---|---|---|
committer | Kévin Dietrich <kevin.dietrich@mailoo.org> | 2022-01-16 10:40:38 +0300 |
commit | bc66cd9868746ce92dd6de004a8b8e6a0188defe (patch) | |
tree | 709174bdf08407a7c06d9fd4c10b3523ab3487b0 /source/blender/draw/intern | |
parent | 3574f2730d2a42cda2881d26209b8dc53b1d2047 (diff) |
Fix T94865: GPU subdiv crash switching to texpaint area
The crash is due to the fact that GPU subdivision extraction routines
for edit data (including UVs) only worked for BMesh. However, a Mesh
based version is still needed for texture painting. This adds the
missing components. This also ensures all data are properly initialized
(at least the ones revealed by the bug).
Diffstat (limited to 'source/blender/draw/intern')
7 files changed, 192 insertions, 65 deletions
diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.cc b/source/blender/draw/intern/draw_cache_extract_mesh.cc index 117ce2a2817..fe55778527b 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh.cc +++ b/source/blender/draw/intern/draw_cache_extract_mesh.cc @@ -848,6 +848,7 @@ static void mesh_buffer_cache_create_requested_subdiv(MeshBatchCache *cache, } MeshRenderData mr; + memset(&mr, 0, sizeof(MeshRenderData)); draw_subdiv_init_mesh_render_data(subdiv_cache, &mr, ts); mesh_render_data_update_loose_geom(&mr, mbc, MR_ITER_LEDGE | MR_ITER_LVERT, MR_DATA_LOOSE_GEOM); @@ -860,9 +861,25 @@ static void mesh_buffer_cache_create_requested_subdiv(MeshBatchCache *cache, extractor->init_subdiv(subdiv_cache, &mr, cache, buffer, data); - if (extractor->iter_subdiv) { - for (uint i = 0; i < subdiv_cache->num_subdiv_quads; i++) { - extractor->iter_subdiv(subdiv_cache, &mr, data, i); + if (extractor->iter_subdiv_mesh || extractor->iter_subdiv_bm) { + int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index; + if (subdiv_cache->bm) { + for (uint i = 0; i < subdiv_cache->num_subdiv_quads; i++) { + /* Multiply by 4 to have the start index of the quad's loop, as subdiv_loop_poly_index is + * based on the subdivision loops. */ + const int poly_origindex = subdiv_loop_poly_index[i * 4]; + const BMFace *efa = bm_original_face_get(&mr, poly_origindex); + extractor->iter_subdiv_bm(subdiv_cache, &mr, data, i, efa); + } + } + else { + for (uint i = 0; i < subdiv_cache->num_subdiv_quads; i++) { + /* Multiply by 4 to have the start index of the quad's loop, as subdiv_loop_poly_index is + * based on the subdivision loops. */ + const int poly_origindex = subdiv_loop_poly_index[i * 4]; + const MPoly *mp = &mr.mpoly[poly_origindex]; + extractor->iter_subdiv_mesh(subdiv_cache, &mr, data, i, mp); + } } } diff --git a/source/blender/draw/intern/draw_cache_impl_subdivision.cc b/source/blender/draw/intern/draw_cache_impl_subdivision.cc index 3e6cd01e7cb..e975d213e22 100644 --- a/source/blender/draw/intern/draw_cache_impl_subdivision.cc +++ b/source/blender/draw/intern/draw_cache_impl_subdivision.cc @@ -1676,6 +1676,10 @@ void draw_subdiv_init_mesh_render_data(DRWSubdivCache *cache, mr->poly_len = mesh->totpoly; mr->loop_len = mesh->totloop; mr->extract_type = MR_EXTRACT_MESH; + mr->toolsettings = toolsettings; + mr->v_origindex = static_cast<int *>(CustomData_get_layer(&mr->me->vdata, CD_ORIGINDEX)); + mr->e_origindex = static_cast<int *>(CustomData_get_layer(&mr->me->edata, CD_ORIGINDEX)); + mr->p_origindex = static_cast<int *>(CustomData_get_layer(&mr->me->pdata, CD_ORIGINDEX)); /* MeshRenderData is only used for generating edit mode data here. */ if (!cache->bm) { @@ -1686,7 +1690,6 @@ void draw_subdiv_init_mesh_render_data(DRWSubdivCache *cache, BM_mesh_elem_table_ensure(bm, BM_EDGE | BM_FACE | BM_VERT); mr->bm = bm; - mr->toolsettings = toolsettings; mr->eed_act = BM_mesh_active_edge_get(bm); mr->efa_act = BM_mesh_active_face_get(bm, false, true); mr->eve_act = BM_mesh_active_vert_get(bm); @@ -1696,9 +1699,6 @@ void draw_subdiv_init_mesh_render_data(DRWSubdivCache *cache, mr->freestyle_edge_ofs = CustomData_get_offset(&bm->edata, CD_FREESTYLE_EDGE); mr->freestyle_face_ofs = CustomData_get_offset(&bm->pdata, CD_FREESTYLE_FACE); #endif - mr->v_origindex = static_cast<int *>(CustomData_get_layer(&mr->me->vdata, CD_ORIGINDEX)); - mr->e_origindex = static_cast<int *>(CustomData_get_layer(&mr->me->edata, CD_ORIGINDEX)); - mr->p_origindex = static_cast<int *>(CustomData_get_layer(&mr->me->pdata, CD_ORIGINDEX)); } /** diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh.h b/source/blender/draw/intern/mesh_extractors/extract_mesh.h index 5d3eaf16f10..834f378c07a 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh.h +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh.h @@ -223,10 +223,16 @@ typedef void(ExtractInitSubdivFn)(const struct DRWSubdivCache *subdiv_cache, struct MeshBatchCache *cache, void *buf, void *data); -typedef void(ExtractIterSubdivFn)(const struct DRWSubdivCache *subdiv_cache, - const MeshRenderData *mr, - void *data, - uint subdiv_quad_index); +typedef void(ExtractIterSubdivBMeshFn)(const struct DRWSubdivCache *subdiv_cache, + const MeshRenderData *mr, + void *data, + uint subdiv_quad_index, + const BMFace *coarse_quad); +typedef void(ExtractIterSubdivMeshFn)(const struct DRWSubdivCache *subdiv_cache, + const MeshRenderData *mr, + void *data, + uint subdiv_quad_index, + const MPoly *coarse_quad); typedef void(ExtractFinishSubdivFn)(const struct DRWSubdivCache *subdiv_cache, const MeshRenderData *mr, struct MeshBatchCache *cache, @@ -251,7 +257,8 @@ typedef struct MeshExtract { ExtractFinishFn *finish; /** Executed on main thread for subdivision evaluation. */ ExtractInitSubdivFn *init_subdiv; - ExtractIterSubdivFn *iter_subdiv; + ExtractIterSubdivBMeshFn *iter_subdiv_bm; + ExtractIterSubdivMeshFn *iter_subdiv_mesh; ExtractFinishSubdivFn *finish_subdiv; /** Used to request common data. */ eMRDataType data_type; 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 3a2b6d468d8..cd71beb1f02 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 @@ -110,28 +110,49 @@ static void extract_edituv_tris_init_subdiv(const DRWSubdivCache *subdiv_cache, data->sync_selection = (mr->toolsettings->uv_flag & UV_SYNC_SELECTION) != 0; } -static void extract_edituv_tris_iter_subdiv(const DRWSubdivCache *subdiv_cache, - const MeshRenderData *mr, - void *_data, - uint subdiv_quad_index) +static void extract_edituv_tris_iter_subdiv_bm(const DRWSubdivCache *UNUSED(subdiv_cache), + const MeshRenderData *UNUSED(mr), + void *_data, + uint subdiv_quad_index, + const BMFace *coarse_quad) { MeshExtract_EditUvElem_Data *data = static_cast<MeshExtract_EditUvElem_Data *>(_data); - int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index; + const uint loop_idx = subdiv_quad_index * 4; + + edituv_tri_add(data, + BM_elem_flag_test(coarse_quad, BM_ELEM_HIDDEN) != 0, + BM_elem_flag_test(coarse_quad, BM_ELEM_SELECT) != 0, + loop_idx, + loop_idx + 1, + loop_idx + 2); + edituv_tri_add(data, + BM_elem_flag_test(coarse_quad, BM_ELEM_HIDDEN) != 0, + BM_elem_flag_test(coarse_quad, BM_ELEM_SELECT) != 0, + loop_idx, + loop_idx + 2, + loop_idx + 3); +} + +static void extract_edituv_tris_iter_subdiv_mesh(const DRWSubdivCache *UNUSED(subdiv_cache), + const MeshRenderData *UNUSED(mr), + void *_data, + uint subdiv_quad_index, + const MPoly *coarse_quad) +{ + MeshExtract_EditUvElem_Data *data = static_cast<MeshExtract_EditUvElem_Data *>(_data); const uint loop_idx = subdiv_quad_index * 4; - const int poly_origindex = subdiv_loop_poly_index[loop_idx]; - BMFace *efa = bm_original_face_get(mr, poly_origindex); edituv_tri_add(data, - BM_elem_flag_test(efa, BM_ELEM_HIDDEN) != 0, - BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0, + (coarse_quad->flag & ME_HIDE) != 0, + (coarse_quad->flag & ME_FACE_SEL) != 0, loop_idx, loop_idx + 1, loop_idx + 2); edituv_tri_add(data, - BM_elem_flag_test(efa, BM_ELEM_HIDDEN) != 0, - BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0, + (coarse_quad->flag & ME_HIDE) != 0, + (coarse_quad->flag & ME_FACE_SEL) != 0, loop_idx, loop_idx + 2, loop_idx + 3); @@ -156,7 +177,8 @@ constexpr MeshExtract create_extractor_edituv_tris() extractor.iter_looptri_mesh = extract_edituv_tris_iter_looptri_mesh; extractor.finish = extract_edituv_tris_finish; extractor.init_subdiv = extract_edituv_tris_init_subdiv; - extractor.iter_subdiv = extract_edituv_tris_iter_subdiv; + extractor.iter_subdiv_bm = extract_edituv_tris_iter_subdiv_bm; + extractor.iter_subdiv_mesh = extract_edituv_tris_iter_subdiv_mesh; extractor.finish_subdiv = extract_edituv_tris_finish_subdiv; extractor.data_type = MR_DATA_NONE; extractor.data_size = sizeof(MeshExtract_EditUvElem_Data); @@ -253,28 +275,49 @@ static void extract_edituv_lines_init_subdiv(const DRWSubdivCache *subdiv_cache, data->sync_selection = (mr->toolsettings->uv_flag & UV_SYNC_SELECTION) != 0; } -static void extract_edituv_lines_iter_subdiv(const DRWSubdivCache *subdiv_cache, - const MeshRenderData *mr, - void *_data, - uint subdiv_quad_index) +static void extract_edituv_lines_iter_subdiv_bm(const DRWSubdivCache *subdiv_cache, + const MeshRenderData *mr, + void *_data, + uint subdiv_quad_index, + const BMFace *coarse_poly) { MeshExtract_EditUvElem_Data *data = static_cast<MeshExtract_EditUvElem_Data *>(_data); - int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index; int *subdiv_loop_edge_index = (int *)GPU_vertbuf_get_data(subdiv_cache->edges_orig_index); uint start_loop_idx = subdiv_quad_index * 4; uint end_loop_idx = (subdiv_quad_index + 1) * 4; + for (uint loop_idx = start_loop_idx; loop_idx < end_loop_idx; loop_idx++) { + const int edge_origindex = subdiv_loop_edge_index[loop_idx]; + const bool real_edge = (edge_origindex != -1 && + (mr->e_origindex == nullptr || + mr->e_origindex[edge_origindex] != ORIGINDEX_NONE)); + edituv_edge_add(data, + BM_elem_flag_test_bool(coarse_poly, BM_ELEM_HIDDEN) != 0 || !real_edge, + BM_elem_flag_test_bool(coarse_poly, BM_ELEM_SELECT) != 0, + loop_idx, + (loop_idx + 1 == end_loop_idx) ? start_loop_idx : (loop_idx + 1)); + } +} - const int poly_origindex = subdiv_loop_poly_index[start_loop_idx]; - BMFace *efa = bm_original_face_get(mr, poly_origindex); +static void extract_edituv_lines_iter_subdiv_mesh(const DRWSubdivCache *subdiv_cache, + const MeshRenderData *mr, + void *_data, + uint subdiv_quad_index, + const MPoly *coarse_poly) +{ + MeshExtract_EditUvElem_Data *data = static_cast<MeshExtract_EditUvElem_Data *>(_data); + int *subdiv_loop_edge_index = (int *)GPU_vertbuf_get_data(subdiv_cache->edges_orig_index); + uint start_loop_idx = subdiv_quad_index * 4; + uint end_loop_idx = (subdiv_quad_index + 1) * 4; for (uint loop_idx = start_loop_idx; loop_idx < end_loop_idx; loop_idx++) { const int edge_origindex = subdiv_loop_edge_index[loop_idx]; const bool real_edge = (edge_origindex != -1 && - mr->e_origindex[edge_origindex] != ORIGINDEX_NONE); + (mr->e_origindex == nullptr || + mr->e_origindex[edge_origindex] != ORIGINDEX_NONE)); edituv_edge_add(data, - BM_elem_flag_test_bool(efa, BM_ELEM_HIDDEN) != 0 || !real_edge, - BM_elem_flag_test_bool(efa, BM_ELEM_SELECT) != 0, + (coarse_poly->flag & ME_HIDE) != 0 || !real_edge, + (coarse_poly->flag & ME_FACE_SEL) != 0, loop_idx, (loop_idx + 1 == end_loop_idx) ? start_loop_idx : (loop_idx + 1)); } @@ -299,7 +342,8 @@ constexpr MeshExtract create_extractor_edituv_lines() extractor.iter_poly_mesh = extract_edituv_lines_iter_poly_mesh; extractor.finish = extract_edituv_lines_finish; extractor.init_subdiv = extract_edituv_lines_init_subdiv; - extractor.iter_subdiv = extract_edituv_lines_iter_subdiv; + extractor.iter_subdiv_bm = extract_edituv_lines_iter_subdiv_bm; + extractor.iter_subdiv_mesh = extract_edituv_lines_iter_subdiv_mesh; extractor.finish_subdiv = extract_edituv_lines_finish_subdiv; extractor.data_type = MR_DATA_NONE; extractor.data_size = sizeof(MeshExtract_EditUvElem_Data); @@ -390,28 +434,48 @@ static void extract_edituv_points_init_subdiv(const DRWSubdivCache *subdiv_cache data->sync_selection = (mr->toolsettings->uv_flag & UV_SYNC_SELECTION) != 0; } -static void extract_edituv_points_iter_subdiv(const DRWSubdivCache *subdiv_cache, - const MeshRenderData *mr, - void *_data, - uint subdiv_quad_index) +static void extract_edituv_points_iter_subdiv_bm(const DRWSubdivCache *subdiv_cache, + const MeshRenderData *mr, + void *_data, + uint subdiv_quad_index, + const BMFace *coarse_quad) { MeshExtract_EditUvElem_Data *data = static_cast<MeshExtract_EditUvElem_Data *>(_data); int *subdiv_loop_vert_index = (int *)GPU_vertbuf_get_data(subdiv_cache->verts_orig_index); - int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index; uint start_loop_idx = subdiv_quad_index * 4; 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 poly_origindex = subdiv_loop_poly_index[i]; - BMFace *efa = bm_original_face_get(mr, poly_origindex); + 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_SELECT) != 0, + i); + } +} +static void extract_edituv_points_iter_subdiv_mesh(const DRWSubdivCache *subdiv_cache, + const MeshRenderData *mr, + void *_data, + uint subdiv_quad_index, + const MPoly *coarse_quad) +{ + MeshExtract_EditUvElem_Data *data = static_cast<MeshExtract_EditUvElem_Data *>(_data); + int *subdiv_loop_vert_index = (int *)GPU_vertbuf_get_data(subdiv_cache->verts_orig_index); + + uint start_loop_idx = subdiv_quad_index * 4; + 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(efa, BM_ELEM_HIDDEN)) || !real_vert, - BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0, + ((coarse_quad->flag & ME_HIDE) != 0) || !real_vert, + (coarse_quad->flag & ME_FACE_SEL) != 0, i); } } @@ -435,7 +499,8 @@ constexpr MeshExtract create_extractor_edituv_points() extractor.iter_poly_mesh = extract_edituv_points_iter_poly_mesh; extractor.finish = extract_edituv_points_finish; extractor.init_subdiv = extract_edituv_points_init_subdiv; - extractor.iter_subdiv = extract_edituv_points_iter_subdiv; + extractor.iter_subdiv_bm = extract_edituv_points_iter_subdiv_bm; + extractor.iter_subdiv_mesh = extract_edituv_points_iter_subdiv_mesh; extractor.finish_subdiv = extract_edituv_points_finish_subdiv; extractor.data_type = MR_DATA_NONE; extractor.data_size = sizeof(MeshExtract_EditUvElem_Data); diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc index 59db4ca6445..2b01b6801c2 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc @@ -218,6 +218,24 @@ static void extract_lines_adjacency_iter_subdiv(const DRWSubdivCache *subdiv_cac lines_adjacency_triangle(v0, v2, v3, l0, l2, l3, data); } +static void extract_lines_adjacency_iter_subdiv_bm(const DRWSubdivCache *subdiv_cache, + const MeshRenderData *mr, + void *_data, + uint subdiv_quad_index, + const BMFace *UNUSED(coarse_quad)) +{ + extract_lines_adjacency_iter_subdiv(subdiv_cache, mr, _data, subdiv_quad_index); +} + +static void extract_lines_adjacency_iter_subdiv_mesh(const DRWSubdivCache *subdiv_cache, + const MeshRenderData *mr, + void *_data, + uint subdiv_quad_index, + const MPoly *UNUSED(coarse_quad)) +{ + extract_lines_adjacency_iter_subdiv(subdiv_cache, mr, _data, subdiv_quad_index); +} + static void extract_lines_adjacency_finish_subdiv(const DRWSubdivCache *UNUSED(subdiv_cache), const MeshRenderData *mr, struct MeshBatchCache *cache, @@ -237,7 +255,8 @@ constexpr MeshExtract create_extractor_lines_adjacency() extractor.iter_looptri_mesh = extract_lines_adjacency_iter_looptri_mesh; extractor.finish = extract_lines_adjacency_finish; extractor.init_subdiv = extract_lines_adjacency_init_subdiv; - extractor.iter_subdiv = extract_lines_adjacency_iter_subdiv; + extractor.iter_subdiv_bm = extract_lines_adjacency_iter_subdiv_bm; + extractor.iter_subdiv_mesh = extract_lines_adjacency_iter_subdiv_mesh; extractor.finish_subdiv = extract_lines_adjacency_finish_subdiv; extractor.data_type = MR_DATA_NONE; extractor.data_size = sizeof(MeshExtract_LineAdjacency_Data); diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc index 2ac495f3b4c..3cc1375329e 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc @@ -261,22 +261,21 @@ static void extract_edit_data_init_subdiv(const DRWSubdivCache *subdiv_cache, *(EditLoopData **)data = vbo_data; } -static void extract_edit_data_iter_subdiv(const DRWSubdivCache *subdiv_cache, - const MeshRenderData *mr, - void *_data, - uint subdiv_quad_index) +static void extract_edit_data_iter_subdiv_bm(const DRWSubdivCache *subdiv_cache, + const MeshRenderData *mr, + void *_data, + uint subdiv_quad_index, + const BMFace *coarse_quad) { EditLoopData *vbo_data = *(EditLoopData **)_data; int *subdiv_loop_vert_index = (int *)GPU_vertbuf_get_data(subdiv_cache->verts_orig_index); int *subdiv_loop_edge_index = (int *)GPU_vertbuf_get_data(subdiv_cache->edges_orig_index); - int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index; uint start_loop_idx = subdiv_quad_index * 4; 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]; - const int poly_origindex = subdiv_loop_poly_index[i]; EditLoopData *edit_loop_data = &vbo_data[i]; memset(edit_loop_data, 0, sizeof(EditLoopData)); @@ -295,12 +294,22 @@ static void extract_edit_data_iter_subdiv(const DRWSubdivCache *subdiv_cache, } } - BMFace *efa = bm_original_face_get(mr, poly_origindex); /* The -1 parameter is for edit_uvs, which we don't do here. */ - mesh_render_data_face_flag(mr, efa, -1, edit_loop_data); + mesh_render_data_face_flag(mr, coarse_quad, -1, edit_loop_data); } } +static void extract_edit_data_iter_subdiv_mesh(const DRWSubdivCache *subdiv_cache, + const MeshRenderData *mr, + void *_data, + uint subdiv_quad_index, + const MPoly *coarse_quad) +{ + const int coarse_quad_index = static_cast<int>(coarse_quad - mr->mpoly); + BMFace *coarse_quad_bm = bm_original_face_get(mr, coarse_quad_index); + extract_edit_data_iter_subdiv_bm(subdiv_cache, mr, _data, subdiv_quad_index, coarse_quad_bm); +} + static void extract_edit_data_loose_geom_subdiv(const DRWSubdivCache *subdiv_cache, const MeshRenderData *mr, const MeshExtractLooseGeom *loose_geom, @@ -336,7 +345,8 @@ constexpr MeshExtract create_extractor_edit_data() extractor.iter_lvert_bm = extract_edit_data_iter_lvert_bm; extractor.iter_lvert_mesh = extract_edit_data_iter_lvert_mesh; extractor.init_subdiv = extract_edit_data_init_subdiv; - extractor.iter_subdiv = extract_edit_data_iter_subdiv; + extractor.iter_subdiv_bm = extract_edit_data_iter_subdiv_bm; + extractor.iter_subdiv_mesh = extract_edit_data_iter_subdiv_mesh; extractor.iter_loose_geom_subdiv = extract_edit_data_loose_geom_subdiv; extractor.data_type = MR_DATA_NONE; extractor.data_size = sizeof(EditLoopData *); 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 b1866708d14..b25e40690c9 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 @@ -139,38 +139,46 @@ static void extract_edituv_data_init_subdiv(const DRWSubdivCache *subdiv_cache, extract_edituv_data_init_common(mr, vbo, data, subdiv_cache->num_subdiv_loops); } -static void extract_edituv_data_iter_subdiv(const DRWSubdivCache *subdiv_cache, - const MeshRenderData *mr, - void *_data, - uint subdiv_quad_index) +static void extract_edituv_data_iter_subdiv_bm(const DRWSubdivCache *subdiv_cache, + const MeshRenderData *mr, + void *_data, + uint subdiv_quad_index, + const BMFace *coarse_quad) { MeshExtract_EditUVData_Data *data = static_cast<MeshExtract_EditUVData_Data *>(_data); int *subdiv_loop_vert_index = (int *)GPU_vertbuf_get_data(subdiv_cache->verts_orig_index); int *subdiv_loop_edge_index = (int *)GPU_vertbuf_get_data(subdiv_cache->edges_orig_index); - int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index; uint start_loop_idx = subdiv_quad_index * 4; 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]; - const int poly_origindex = subdiv_loop_poly_index[i]; EditLoopData *edit_loop_data = &data->vbo_data[i]; memset(edit_loop_data, 0, sizeof(EditLoopData)); - BMFace *efa = bm_original_face_get(mr, poly_origindex); - if (vert_origindex != -1 && edge_origindex != -1) { BMEdge *eed = bm_original_edge_get(mr, edge_origindex); /* Loop on an edge endpoint. */ - BMLoop *l = BM_face_edge_share_loop(efa, eed); + BMLoop *l = BM_face_edge_share_loop(const_cast<BMFace *>(coarse_quad), eed); 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); } } } +static void extract_edituv_data_iter_subdiv_mesh(const DRWSubdivCache *subdiv_cache, + const MeshRenderData *mr, + void *_data, + uint subdiv_quad_index, + const MPoly *coarse_quad) +{ + const int coarse_quad_index = static_cast<int>(coarse_quad - mr->mpoly); + BMFace *coarse_quad_bm = bm_original_face_get(mr, coarse_quad_index); + extract_edituv_data_iter_subdiv_bm(subdiv_cache, mr, _data, subdiv_quad_index, coarse_quad_bm); +} + constexpr MeshExtract create_extractor_edituv_data() { MeshExtract extractor = {nullptr}; @@ -178,7 +186,8 @@ constexpr MeshExtract create_extractor_edituv_data() extractor.iter_poly_bm = extract_edituv_data_iter_poly_bm; extractor.iter_poly_mesh = extract_edituv_data_iter_poly_mesh; extractor.init_subdiv = extract_edituv_data_init_subdiv; - extractor.iter_subdiv = extract_edituv_data_iter_subdiv; + extractor.iter_subdiv_bm = extract_edituv_data_iter_subdiv_bm; + extractor.iter_subdiv_mesh = extract_edituv_data_iter_subdiv_mesh; extractor.data_type = MR_DATA_NONE; extractor.data_size = sizeof(MeshExtract_EditUVData_Data); extractor.use_threading = true; |