diff options
6 files changed, 66 insertions, 58 deletions
diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.cc b/source/blender/draw/intern/draw_cache_extract_mesh.cc index eed015bc212..117ce2a2817 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh.cc +++ b/source/blender/draw/intern/draw_cache_extract_mesh.cc @@ -861,7 +861,9 @@ static void mesh_buffer_cache_create_requested_subdiv(MeshBatchCache *cache, extractor->init_subdiv(subdiv_cache, &mr, cache, buffer, data); if (extractor->iter_subdiv) { - extractor->iter_subdiv(subdiv_cache, &mr, data); + for (uint i = 0; i < subdiv_cache->num_subdiv_quads; i++) { + extractor->iter_subdiv(subdiv_cache, &mr, data, i); + } } if (extractor->iter_loose_geom_subdiv) { diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh.h b/source/blender/draw/intern/mesh_extractors/extract_mesh.h index 7c6f4dea6c9..5d3eaf16f10 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh.h +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh.h @@ -225,7 +225,8 @@ typedef void(ExtractInitSubdivFn)(const struct DRWSubdivCache *subdiv_cache, void *data); typedef void(ExtractIterSubdivFn)(const struct DRWSubdivCache *subdiv_cache, const MeshRenderData *mr, - void *data); + void *data, + uint subdiv_quad_index); typedef void(ExtractFinishSubdivFn)(const struct DRWSubdivCache *subdiv_cache, const MeshRenderData *mr, struct MeshBatchCache *cache, 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 5cb77426438..3a2b6d468d8 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 @@ -112,30 +112,29 @@ static void extract_edituv_tris_init_subdiv(const DRWSubdivCache *subdiv_cache, static void extract_edituv_tris_iter_subdiv(const DRWSubdivCache *subdiv_cache, const MeshRenderData *mr, - void *_data) + void *_data, + uint subdiv_quad_index) { MeshExtract_EditUvElem_Data *data = static_cast<MeshExtract_EditUvElem_Data *>(_data); int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index; - for (uint i = 0; i < subdiv_cache->num_subdiv_quads; i++) { - const uint loop_idx = i * 4; - const int poly_origindex = subdiv_loop_poly_index[loop_idx]; - BMFace *efa = bm_original_face_get(mr, poly_origindex); + 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, - 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, - loop_idx, - loop_idx + 2, - loop_idx + 3); - } + edituv_tri_add(data, + BM_elem_flag_test(efa, BM_ELEM_HIDDEN) != 0, + BM_elem_flag_test(efa, BM_ELEM_SELECT) != 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, + loop_idx, + loop_idx + 2, + loop_idx + 3); } static void extract_edituv_tris_finish_subdiv(const struct DRWSubdivCache *UNUSED(subdiv_cache), @@ -256,30 +255,28 @@ static void extract_edituv_lines_init_subdiv(const DRWSubdivCache *subdiv_cache, static void extract_edituv_lines_iter_subdiv(const DRWSubdivCache *subdiv_cache, const MeshRenderData *mr, - void *_data) + void *_data, + uint subdiv_quad_index) { 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); - for (uint i = 0; i < subdiv_cache->num_subdiv_quads; i++) { + uint start_loop_idx = subdiv_quad_index * 4; + uint end_loop_idx = (subdiv_quad_index + 1) * 4; - uint start_loop_idx = i * 4; - uint end_loop_idx = (i + 1) * 4; + const int poly_origindex = subdiv_loop_poly_index[start_loop_idx]; + BMFace *efa = bm_original_face_get(mr, poly_origindex); - const int poly_origindex = subdiv_loop_poly_index[start_loop_idx]; - BMFace *efa = bm_original_face_get(mr, poly_origindex); - - 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); - 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, - loop_idx, - (loop_idx + 1 == end_loop_idx) ? start_loop_idx : (loop_idx + 1)); - } + 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); + 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, + loop_idx, + (loop_idx + 1 == end_loop_idx) ? start_loop_idx : (loop_idx + 1)); } } @@ -395,13 +392,16 @@ static void extract_edituv_points_init_subdiv(const DRWSubdivCache *subdiv_cache static void extract_edituv_points_iter_subdiv(const DRWSubdivCache *subdiv_cache, const MeshRenderData *mr, - void *_data) + void *_data, + uint subdiv_quad_index) { 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; - for (uint i = 0; i < subdiv_cache->num_subdiv_loops; i++) { + 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); 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 f125593cff2..59db4ca6445 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 @@ -198,25 +198,24 @@ static void extract_lines_adjacency_init_subdiv(const DRWSubdivCache *subdiv_cac static void extract_lines_adjacency_iter_subdiv(const DRWSubdivCache *subdiv_cache, const MeshRenderData *UNUSED(mr), - void *_data) + void *_data, + uint subdiv_quad_index) { MeshExtract_LineAdjacency_Data *data = static_cast<MeshExtract_LineAdjacency_Data *>(_data); - for (uint i = 0; i < subdiv_cache->num_subdiv_quads; i++) { - const uint loop_index = i * 4; - const uint l0 = loop_index + 0; - const uint l1 = loop_index + 1; - const uint l2 = loop_index + 2; - const uint l3 = loop_index + 3; + const uint loop_index = subdiv_quad_index * 4; + const uint l0 = loop_index + 0; + const uint l1 = loop_index + 1; + const uint l2 = loop_index + 2; + const uint l3 = loop_index + 3; - const uint v0 = subdiv_cache->subdiv_loop_subdiv_vert_index[l0]; - const uint v1 = subdiv_cache->subdiv_loop_subdiv_vert_index[l1]; - const uint v2 = subdiv_cache->subdiv_loop_subdiv_vert_index[l2]; - const uint v3 = subdiv_cache->subdiv_loop_subdiv_vert_index[l3]; + const uint v0 = subdiv_cache->subdiv_loop_subdiv_vert_index[l0]; + const uint v1 = subdiv_cache->subdiv_loop_subdiv_vert_index[l1]; + const uint v2 = subdiv_cache->subdiv_loop_subdiv_vert_index[l2]; + const uint v3 = subdiv_cache->subdiv_loop_subdiv_vert_index[l3]; - lines_adjacency_triangle(v0, v1, v2, l0, l1, l2, data); - lines_adjacency_triangle(v0, v2, v3, l0, l2, l3, data); - } + lines_adjacency_triangle(v0, v1, v2, l0, l1, l2, data); + lines_adjacency_triangle(v0, v2, v3, l0, l2, l3, data); } static void extract_lines_adjacency_finish_subdiv(const DRWSubdivCache *UNUSED(subdiv_cache), 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 0b4172dfb28..2ac495f3b4c 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 @@ -263,14 +263,17 @@ static void extract_edit_data_init_subdiv(const DRWSubdivCache *subdiv_cache, static void extract_edit_data_iter_subdiv(const DRWSubdivCache *subdiv_cache, const MeshRenderData *mr, - void *_data) + void *_data, + uint subdiv_quad_index) { 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; - for (uint i = 0; i < subdiv_cache->num_subdiv_loops; i++) { + 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]; 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 067d482bc2b..b1866708d14 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 @@ -141,14 +141,17 @@ static void extract_edituv_data_init_subdiv(const DRWSubdivCache *subdiv_cache, static void extract_edituv_data_iter_subdiv(const DRWSubdivCache *subdiv_cache, const MeshRenderData *mr, - void *_data) + void *_data, + uint subdiv_quad_index) { 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; - for (uint i = 0; i < subdiv_cache->num_subdiv_loops; i++) { + 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]; |