From f7d2a77871ded4dbbfe3203e278bc51e62da973a Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Wed, 27 Mar 2024 14:30:00 -0300 Subject: [PATCH 1/4] Cleanup: Select Engine: Draw actual indices instead of 'Original Index' The selection engine renders a uint texture with the selectable mesh indices. When these meshes have modifiers, the original index is used for the texture. However this does not seem to be necessary. The real mesh indexes can be used in the texture and, only at the end, the original index can be retrieved on the CPU itself. Advantages of this approach: - Optimizes the code to generate selection buffers. - Makes the select id texture more informative as it identifies the real elements instead of the original ones. --- .../blender/blenkernel/BKE_mesh_iterators.hh | 5 ++ .../blender/blenkernel/intern/DerivedMesh.cc | 3 +- source/blender/blenkernel/intern/editmesh.cc | 2 +- .../blenkernel/intern/mesh_iterators.cc | 38 +++++++---- source/blender/draw/DRW_select_buffer.hh | 3 +- .../draw/engines/select/select_draw_utils.cc | 6 +- .../blender/draw/intern/draw_select_buffer.cc | 25 ++++++- .../extract_mesh_vbo_select_idx.cc | 68 ++++--------------- .../blender/editors/mesh/editmesh_select.cc | 2 +- source/blender/editors/mesh/meshtools.cc | 3 +- .../editors/sculpt_paint/paint_vertex_proj.cc | 9 ++- .../sculpt_paint/paint_vertex_weight_ops.cc | 6 +- .../editors/space_view3d/view3d_iterators.cc | 16 +++-- source/blender/editors/util/ed_transverts.cc | 2 +- 14 files changed, 96 insertions(+), 92 deletions(-) diff --git a/source/blender/blenkernel/BKE_mesh_iterators.hh b/source/blender/blenkernel/BKE_mesh_iterators.hh index 0e7a2909ba3..9967ec8e39d 100644 --- a/source/blender/blenkernel/BKE_mesh_iterators.hh +++ b/source/blender/blenkernel/BKE_mesh_iterators.hh @@ -17,6 +17,7 @@ enum MeshForeachFlag { void BKE_mesh_foreach_mapped_vert( const Mesh *mesh, + const bool use_orig_index, void (*func)(void *user_data, int index, const float co[3], const float no[3]), void *user_data, MeshForeachFlag flag); @@ -28,9 +29,11 @@ void BKE_mesh_foreach_mapped_vert( void BKE_mesh_foreach_mapped_edge( Mesh *mesh, int tot_edges, + const bool use_orig_index, void (*func)(void *user_data, int index, const float v0co[3], const float v1co[3]), void *user_data); void BKE_mesh_foreach_mapped_loop(Mesh *mesh, + const bool use_orig_index, void (*func)(void *user_data, int vertex_index, int face_index, @@ -40,11 +43,13 @@ void BKE_mesh_foreach_mapped_loop(Mesh *mesh, MeshForeachFlag flag); void BKE_mesh_foreach_mapped_face_center( Mesh *mesh, + const bool use_orig_index, void (*func)(void *user_data, int index, const float cent[3], const float no[3]), void *user_data, MeshForeachFlag flag); void BKE_mesh_foreach_mapped_subdiv_face_center( Mesh *mesh, + const bool use_orig_index, void (*func)(void *user_data, int index, const float cent[3], const float no[3]), void *user_data, MeshForeachFlag flag); diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc index 55fda2dcba8..c913b695f21 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.cc +++ b/source/blender/blenkernel/intern/DerivedMesh.cc @@ -1620,7 +1620,8 @@ void mesh_get_mapped_verts_coords(Mesh *mesh_eval, blender::MutableSpan(r_cos.data()); user_data.vertex_visit = BLI_BITMAP_NEW(r_cos.size(), "vertexcos flags"); - BKE_mesh_foreach_mapped_vert(mesh_eval, make_vertexcos__mapFunc, &user_data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert( + mesh_eval, true, make_vertexcos__mapFunc, &user_data, MESH_FOREACH_NOP); MEM_freeN(user_data.vertex_visit); } else { diff --git a/source/blender/blenkernel/intern/editmesh.cc b/source/blender/blenkernel/intern/editmesh.cc index cc1c8cf16ea..e4b7b26b4d3 100644 --- a/source/blender/blenkernel/intern/editmesh.cc +++ b/source/blender/blenkernel/intern/editmesh.cc @@ -157,7 +157,7 @@ float (*BKE_editmesh_vert_coords_alloc( data.cos_cage = cos_cage; data.visit_bitmap = visit_bitmap; - BKE_mesh_foreach_mapped_vert(cage, cage_mapped_verts_callback, &data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(cage, true, cage_mapped_verts_callback, &data, MESH_FOREACH_NOP); MEM_freeN(visit_bitmap); diff --git a/source/blender/blenkernel/intern/mesh_iterators.cc b/source/blender/blenkernel/intern/mesh_iterators.cc index 9ef65b70976..9e4bedb0d40 100644 --- a/source/blender/blenkernel/intern/mesh_iterators.cc +++ b/source/blender/blenkernel/intern/mesh_iterators.cc @@ -31,6 +31,7 @@ void BKE_mesh_foreach_mapped_vert( const Mesh *mesh, + const bool use_orig_index, void (*func)(void *user_data, int index, const float co[3], const float no[3]), void *user_data, MeshForeachFlag flag) @@ -62,8 +63,9 @@ void BKE_mesh_foreach_mapped_vert( } else { const blender::Span positions = mesh->vert_positions(); - const int *index = static_cast( - CustomData_get_layer(&mesh->vert_data, CD_ORIGINDEX)); + const int *index = use_orig_index ? static_cast( + CustomData_get_layer(&mesh->vert_data, CD_ORIGINDEX)) : + nullptr; blender::Span vert_normals; if (flag & MESH_FOREACH_USE_NORMAL) { vert_normals = mesh->vert_normals(); @@ -91,6 +93,7 @@ void BKE_mesh_foreach_mapped_vert( void BKE_mesh_foreach_mapped_edge( Mesh *mesh, const int tot_edges, + const bool use_orig_index, void (*func)(void *user_data, int index, const float v0co[3], const float v1co[3]), void *user_data) { @@ -119,8 +122,9 @@ void BKE_mesh_foreach_mapped_edge( else { const blender::Span positions = mesh->vert_positions(); const blender::Span edges = mesh->edges(); - const int *index = static_cast( - CustomData_get_layer(&mesh->edge_data, CD_ORIGINDEX)); + const int *index = use_orig_index ? static_cast( + CustomData_get_layer(&mesh->edge_data, CD_ORIGINDEX)) : + nullptr; if (index) { for (const int i : edges.index_range()) { @@ -141,6 +145,7 @@ void BKE_mesh_foreach_mapped_edge( } void BKE_mesh_foreach_mapped_loop(Mesh *mesh, + const bool use_orig_index, void (*func)(void *user_data, int vertex_index, int face_index, @@ -195,10 +200,12 @@ void BKE_mesh_foreach_mapped_loop(Mesh *mesh, const blender::Span positions = mesh->vert_positions(); const blender::OffsetIndices faces = mesh->faces(); const blender::Span corner_verts = mesh->corner_verts(); - const int *v_index = static_cast( - CustomData_get_layer(&mesh->vert_data, CD_ORIGINDEX)); - const int *f_index = static_cast( - CustomData_get_layer(&mesh->face_data, CD_ORIGINDEX)); + const int *v_index = use_orig_index ? static_cast(CustomData_get_layer( + &mesh->vert_data, CD_ORIGINDEX)) : + nullptr; + const int *f_index = use_orig_index ? static_cast(CustomData_get_layer( + &mesh->face_data, CD_ORIGINDEX)) : + nullptr; if (v_index || f_index) { for (const int face_i : faces.index_range()) { @@ -228,6 +235,7 @@ void BKE_mesh_foreach_mapped_loop(Mesh *mesh, void BKE_mesh_foreach_mapped_face_center( Mesh *mesh, + const bool use_orig_index, void (*func)(void *user_data, int index, const float cent[3], const float no[3]), void *user_data, MeshForeachFlag flag) @@ -267,8 +275,9 @@ void BKE_mesh_foreach_mapped_face_center( const blender::Span positions = mesh->vert_positions(); const blender::OffsetIndices faces = mesh->faces(); const blender::Span corner_verts = mesh->corner_verts(); - const int *index = static_cast( - CustomData_get_layer(&mesh->face_data, CD_ORIGINDEX)); + const int *index = use_orig_index ? static_cast( + CustomData_get_layer(&mesh->face_data, CD_ORIGINDEX)) : + nullptr; if (index) { for (const int i : faces.index_range()) { @@ -305,6 +314,7 @@ void BKE_mesh_foreach_mapped_face_center( void BKE_mesh_foreach_mapped_subdiv_face_center( Mesh *mesh, + const bool use_orig_index, void (*func)(void *user_data, int index, const float cent[3], const float no[3]), void *user_data, MeshForeachFlag flag) @@ -316,8 +326,9 @@ void BKE_mesh_foreach_mapped_subdiv_face_center( if (flag & MESH_FOREACH_USE_NORMAL) { vert_normals = mesh->vert_normals(); } - const int *index = static_cast( - CustomData_get_layer(&mesh->face_data, CD_ORIGINDEX)); + const int *index = use_orig_index ? static_cast( + CustomData_get_layer(&mesh->face_data, CD_ORIGINDEX)) : + nullptr; const blender::BitSpan facedot_tags = mesh->runtime->subsurf_face_dot_tags; if (index) { @@ -381,6 +392,7 @@ void BKE_mesh_foreach_mapped_vert_coords_get(const Mesh *mesh_eval, memset(r_cos, 0, sizeof(*r_cos) * totcos); user_data.vertexcos = r_cos; user_data.vertex_visit = BLI_BITMAP_NEW(totcos, __func__); - BKE_mesh_foreach_mapped_vert(mesh_eval, get_vertexcos__mapFunc, &user_data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert( + mesh_eval, true, get_vertexcos__mapFunc, &user_data, MESH_FOREACH_NOP); MEM_freeN(user_data.vertex_visit); } diff --git a/source/blender/draw/DRW_select_buffer.hh b/source/blender/draw/DRW_select_buffer.hh index f865d963c3a..827f558e6f1 100644 --- a/source/blender/draw/DRW_select_buffer.hh +++ b/source/blender/draw/DRW_select_buffer.hh @@ -68,7 +68,8 @@ struct SELECTID_Context { /* `draw_select_buffer.cc` */ -bool DRW_select_buffer_elem_get(uint sel_id, uint *r_elem, uint *r_base_index, char *r_elem_type); +bool DRW_select_buffer_elem_get( + uint sel_id, uint *r_elem, uint *r_base_index, char *r_elem_type, const bool use_orig_index); uint DRW_select_buffer_context_offset_for_object_elem(Depsgraph *depsgraph, Object *object, char elem_type); diff --git a/source/blender/draw/engines/select/select_draw_utils.cc b/source/blender/draw/engines/select/select_draw_utils.cc index d40b11c4a8f..bb205fe673b 100644 --- a/source/blender/draw/engines/select/select_draw_utils.cc +++ b/source/blender/draw/engines/select/select_draw_utils.cc @@ -93,7 +93,7 @@ static void draw_select_id_edit_mesh(SELECTID_StorageList *stl, blender::gpu::Batch *geom_facedots = DRW_mesh_batch_cache_get_facedots_with_select_id(mesh); DRW_shgroup_call_no_cull(face_shgrp, geom_facedots, ob); } - *r_face_offset = initial_offset + em->bm->totface; + *r_face_offset = initial_offset + mesh->faces_num; } else { if (ob->dt >= OB_SOLID) { @@ -114,7 +114,7 @@ static void draw_select_id_edit_mesh(SELECTID_StorageList *stl, DRWShadingGroup *edge_shgrp = DRW_shgroup_create_sub(stl->g_data->shgrp_edge); DRW_shgroup_uniform_int_copy(edge_shgrp, "offset", *(int *)r_face_offset); DRW_shgroup_call_no_cull(edge_shgrp, geom_edges, ob); - *r_edge_offset = *r_face_offset + em->bm->totedge; + *r_edge_offset = *r_face_offset + mesh->edges_num; } else { /* Note that `r_vert_offset` is calculated from `r_edge_offset`. @@ -128,7 +128,7 @@ static void draw_select_id_edit_mesh(SELECTID_StorageList *stl, DRWShadingGroup *vert_shgrp = DRW_shgroup_create_sub(stl->g_data->shgrp_vert); DRW_shgroup_uniform_int_copy(vert_shgrp, "offset", *(int *)r_edge_offset); DRW_shgroup_call_no_cull(vert_shgrp, geom_verts, ob); - *r_vert_offset = *r_edge_offset + em->bm->totvert; + *r_vert_offset = *r_edge_offset + mesh->verts_num; } else { *r_vert_offset = *r_edge_offset; diff --git a/source/blender/draw/intern/draw_select_buffer.cc b/source/blender/draw/intern/draw_select_buffer.cc index 3b0d311dd48..1557c5a6acc 100644 --- a/source/blender/draw/intern/draw_select_buffer.cc +++ b/source/blender/draw/intern/draw_select_buffer.cc @@ -17,6 +17,10 @@ #include "DNA_screen_types.h" +#include "BKE_customdata.hh" +#include "BKE_mesh.hh" +#include "BKE_object.hh" + #include "GPU_select.hh" #include "DEG_depsgraph.hh" @@ -392,7 +396,8 @@ uint DRW_select_buffer_find_nearest_to_point(Depsgraph *depsgraph, bool DRW_select_buffer_elem_get(const uint sel_id, uint *r_elem, uint *r_base_index, - char *r_elem_type) + char *r_elem_type, + const bool use_orig_index) { SELECTID_Context *select_ctx = DRW_select_engine_context_get(); @@ -424,8 +429,6 @@ bool DRW_select_buffer_elem_get(const uint sel_id, return false; } - *r_elem = elem_id; - if (r_base_index) { *r_base_index = base_index; } @@ -434,6 +437,22 @@ bool DRW_select_buffer_elem_get(const uint sel_id, *r_elem_type = elem_type; } + if (use_orig_index) { + Object *object = select_ctx->objects[base_index]; + Mesh *mesh_eval = BKE_object_get_evaluated_mesh(object); + const int *orig_index = reinterpret_cast( + CustomData_get_layer(elem_type == SCE_SELECT_FACE ? &mesh_eval->face_data : + elem_type == SCE_SELECT_EDGE ? &mesh_eval->edge_data : + &mesh_eval->vert_data, + CD_ORIGINDEX)); + + if (orig_index) { + elem_id = orig_index[elem_id]; + } + } + + *r_elem = elem_id; + return true; } diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_select_idx.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_select_idx.cc index a219dce045a..756cc8de620 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_select_idx.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_select_idx.cc @@ -38,11 +38,6 @@ static void extract_select_idx_init(const MeshRenderData &mr, extract_select_idx_init_impl(mr, mr.corners_num + mr.loose_indices_num, buf, tls_data); } -/* TODO: Use #glVertexID to get loop index and use the data structure on the CPU to retrieve the - * select element associated with this loop ID. This would remove the need for this separate - * index VBO's. We could upload the p/e/v_origindex as a buffer texture and sample it inside the - * shader to output original index. */ - static void extract_face_idx_iter_face_bm(const MeshRenderData & /*mr*/, const BMFace *f, const int f_index, @@ -115,7 +110,7 @@ static void extract_face_idx_iter_face_mesh(const MeshRenderData &mr, void *data) { for (const int corner : mr.faces[face_index]) { - (*(int32_t **)data)[corner] = (mr.p_origindex) ? mr.p_origindex[face_index] : face_index; + (*(int32_t **)data)[corner] = face_index; } } @@ -125,7 +120,7 @@ static void extract_edge_idx_iter_face_mesh(const MeshRenderData &mr, { for (const int corner : mr.faces[face_index]) { const int edge = mr.corner_edges[corner]; - (*(int32_t **)data)[corner] = (mr.e_origindex) ? mr.e_origindex[edge] : edge; + (*(int32_t **)data)[corner] = edge; } } @@ -135,7 +130,7 @@ static void extract_vert_idx_iter_face_mesh(const MeshRenderData &mr, { for (const int corner : mr.faces[face_index]) { const int vert = mr.corner_verts[corner]; - (*(int32_t **)data)[corner] = (mr.v_origindex) ? mr.v_origindex[vert] : vert; + (*(int32_t **)data)[corner] = vert; } } @@ -145,9 +140,8 @@ static void extract_edge_idx_iter_loose_edge_mesh(const MeshRenderData &mr, void *data) { const int e_index = mr.loose_edges[loose_edge_i]; - const int e_orig = (mr.e_origindex) ? mr.e_origindex[e_index] : e_index; - (*(int32_t **)data)[mr.corners_num + loose_edge_i * 2 + 0] = e_orig; - (*(int32_t **)data)[mr.corners_num + loose_edge_i * 2 + 1] = e_orig; + (*(int32_t **)data)[mr.corners_num + loose_edge_i * 2 + 0] = e_index; + (*(int32_t **)data)[mr.corners_num + loose_edge_i * 2 + 1] = e_index; } static void extract_vert_idx_iter_loose_edge_mesh(const MeshRenderData &mr, @@ -155,8 +149,8 @@ static void extract_vert_idx_iter_loose_edge_mesh(const MeshRenderData &mr, const int loose_edge_i, void *data) { - int v1_orig = (mr.v_origindex) ? mr.v_origindex[edge[0]] : edge[0]; - int v2_orig = (mr.v_origindex) ? mr.v_origindex[edge[1]] : edge[1]; + int v1_orig = edge[0]; + int v2_orig = edge[1]; (*(int32_t **)data)[mr.corners_num + loose_edge_i * 2 + 0] = v1_orig; (*(int32_t **)data)[mr.corners_num + loose_edge_i * 2 + 1] = v2_orig; } @@ -168,8 +162,7 @@ static void extract_vert_idx_iter_loose_vert_mesh(const MeshRenderData &mr, const int offset = mr.corners_num + (mr.loose_edges_num * 2); const int v_index = mr.loose_verts[loose_vert_i]; - const int v_orig = (mr.v_origindex) ? mr.v_origindex[v_index] : v_index; - (*(int32_t **)data)[offset + loose_vert_i] = v_orig; + (*(int32_t **)data)[offset + loose_vert_i] = v_index; } static void extract_vert_idx_init_subdiv(const DRWSubdivCache &subdiv_cache, @@ -185,20 +178,6 @@ static void extract_vert_idx_init_subdiv(const DRWSubdivCache &subdiv_cache, (int32_t *)GPU_vertbuf_get_data(subdiv_cache.verts_orig_index), subdiv_cache.num_subdiv_loops, loose_geom.loop_len); - if (!mr.v_origindex) { - return; - } - - /* Remap the vertex indices to those pointed by the origin indices layer. At this point, the - * VBO data is a copy of #verts_orig_index which contains the coarse vertices indices, so - * the memory can both be accessed for lookup and immediately overwritten. */ - int32_t *vbo_data = static_cast(GPU_vertbuf_get_data(vbo)); - for (int i = 0; i < subdiv_cache.num_subdiv_loops; i++) { - if (vbo_data[i] == -1) { - continue; - } - vbo_data[i] = mr.v_origindex[vbo_data[i]]; - } } static void extract_vert_idx_loose_geom_subdiv(const DRWSubdivCache &subdiv_cache, @@ -222,13 +201,11 @@ static void extract_vert_idx_loose_geom_subdiv(const DRWSubdivCache &subdiv_cach const DRWSubdivLooseVertex &v2 = loose_geom.verts[loose_edge.loose_subdiv_v2_index]; if (v1.coarse_vertex_index != -1u) { - vert_idx_data[offset] = mr.v_origindex ? mr.v_origindex[v1.coarse_vertex_index] : - v1.coarse_vertex_index; + vert_idx_data[offset] = v1.coarse_vertex_index; } if (v2.coarse_vertex_index != -1u) { - vert_idx_data[offset + 1] = mr.v_origindex ? mr.v_origindex[v2.coarse_vertex_index] : - v2.coarse_vertex_index; + vert_idx_data[offset + 1] = v2.coarse_vertex_index; } offset += 2; @@ -237,8 +214,7 @@ static void extract_vert_idx_loose_geom_subdiv(const DRWSubdivCache &subdiv_cach Span loose_verts = draw_subdiv_cache_get_loose_verts(subdiv_cache); for (const DRWSubdivLooseVertex &loose_vert : loose_verts) { - vert_idx_data[offset] = mr.v_origindex ? mr.v_origindex[loose_vert.coarse_vertex_index] : - loose_vert.coarse_vertex_index; + vert_idx_data[offset] = loose_vert.coarse_vertex_index; offset += 1; } } @@ -274,8 +250,7 @@ static void extract_edge_idx_loose_geom_subdiv(const DRWSubdivCache &subdiv_cach Span loose_edges = draw_subdiv_cache_get_loose_edges(subdiv_cache); for (const DRWSubdivLooseEdge &loose_edge : loose_edges) { - const int coarse_edge_index = mr.e_origindex ? mr.e_origindex[loose_edge.coarse_edge_index] : - loose_edge.coarse_edge_index; + const int coarse_edge_index = loose_edge.coarse_edge_index; vert_idx_data[offset] = coarse_edge_index; vert_idx_data[offset + 1] = coarse_edge_index; offset += 2; @@ -291,18 +266,6 @@ static void extract_face_idx_init_subdiv(const DRWSubdivCache &subdiv_cache, gpu::VertBuf *vbo = static_cast(buf); draw_subdiv_init_origindex_buffer( vbo, subdiv_cache.subdiv_loop_face_index, subdiv_cache.num_subdiv_loops, 0); - - if (!mr.p_origindex) { - return; - } - - /* Remap the face indices to those pointed by the origin indices layer. At this point, the - * VBO data is a copy of #subdiv_loop_face_index which contains the coarse face indices, so - * the memory can both be accessed for lookup and immediately overwritten. */ - int32_t *vbo_data = static_cast(GPU_vertbuf_get_data(vbo)); - for (int i = 0; i < subdiv_cache.num_subdiv_loops; i++) { - vbo_data[i] = mr.p_origindex[vbo_data[i]]; - } } constexpr MeshExtract create_extractor_face_idx() @@ -375,12 +338,7 @@ static void extract_fdot_idx_iter_face_mesh(const MeshRenderData &mr, const int face_index, void *data) { - if (mr.p_origindex != nullptr) { - (*(int32_t **)data)[face_index] = mr.p_origindex[face_index]; - } - else { - (*(int32_t **)data)[face_index] = face_index; - } + (*(int32_t **)data)[face_index] = face_index; } constexpr MeshExtract create_extractor_fdot_idx() diff --git a/source/blender/editors/mesh/editmesh_select.cc b/source/blender/editors/mesh/editmesh_select.cc index 4b6b79ab179..f203964e64a 100644 --- a/source/blender/editors/mesh/editmesh_select.cc +++ b/source/blender/editors/mesh/editmesh_select.cc @@ -181,7 +181,7 @@ static BMElem *edbm_select_id_bm_elem_get(const Span bases, { uint elem_id; char elem_type = 0; - bool success = DRW_select_buffer_elem_get(sel_id, &elem_id, r_base_index, &elem_type); + bool success = DRW_select_buffer_elem_get(sel_id, &elem_id, r_base_index, &elem_type, true); if (success) { Object *obedit = bases[*r_base_index]->object; diff --git a/source/blender/editors/mesh/meshtools.cc b/source/blender/editors/mesh/meshtools.cc index 52974abea7c..7f64c3efd50 100644 --- a/source/blender/editors/mesh/meshtools.cc +++ b/source/blender/editors/mesh/meshtools.cc @@ -1391,7 +1391,8 @@ bool ED_mesh_pick_vert( data.v_idx_best = -1; data.hide_vert = *attributes.lookup(".hide_vert", bke::AttrDomain::Point); - BKE_mesh_foreach_mapped_vert(mesh_eval, ed_mesh_pick_vert__mapFunc, &data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert( + mesh_eval, true, ed_mesh_pick_vert__mapFunc, &data, MESH_FOREACH_NOP); if (data.v_idx_best == -1) { return false; diff --git a/source/blender/editors/sculpt_paint/paint_vertex_proj.cc b/source/blender/editors/sculpt_paint/paint_vertex_proj.cc index 621bbca5a3f..060b3c57861 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_proj.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex_proj.cc @@ -83,7 +83,7 @@ static void vpaint_proj_dm_map_cosnos_init(Depsgraph *depsgraph, memset(vp_handle->vcosnos, 0, sizeof(*vp_handle->vcosnos) * mesh->verts_num); BKE_mesh_foreach_mapped_vert( - mesh_eval, vpaint_proj_dm_map_cosnos_init__map_cb, vp_handle, MESH_FOREACH_USE_NORMAL); + mesh_eval, true, vpaint_proj_dm_map_cosnos_init__map_cb, vp_handle, MESH_FOREACH_USE_NORMAL); } /* -------------------------------------------------------------------- */ @@ -146,8 +146,11 @@ static void vpaint_proj_dm_map_cosnos_update(Depsgraph *depsgraph, BLI_assert(BLI_listbase_is_empty(&ob->modifiers) == false); copy_vn_fl(vp_handle->dists_sq, mesh->verts_num, FLT_MAX); - BKE_mesh_foreach_mapped_vert( - mesh_eval, vpaint_proj_dm_map_cosnos_update__map_cb, &vp_update, MESH_FOREACH_USE_NORMAL); + BKE_mesh_foreach_mapped_vert(mesh_eval, + true, + vpaint_proj_dm_map_cosnos_update__map_cb, + &vp_update, + MESH_FOREACH_USE_NORMAL); } /* -------------------------------------------------------------------- */ diff --git a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.cc b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.cc index aa54d6f4d1c..939d10052c6 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.cc @@ -830,13 +830,15 @@ static int paint_weight_gradient_exec(bContext *C, wmOperator *op) if (data.is_init) { data.vert_visit = BLI_BITMAP_NEW(mesh->verts_num, __func__); - BKE_mesh_foreach_mapped_vert(mesh_eval, gradientVertInit__mapFunc, &data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert( + mesh_eval, true, gradientVertInit__mapFunc, &data, MESH_FOREACH_NOP); MEM_freeN(data.vert_visit); data.vert_visit = nullptr; } else { - BKE_mesh_foreach_mapped_vert(mesh_eval, gradientVertUpdate__mapFunc, &data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert( + mesh_eval, true, gradientVertUpdate__mapFunc, &data, MESH_FOREACH_NOP); } DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); diff --git a/source/blender/editors/space_view3d/view3d_iterators.cc b/source/blender/editors/space_view3d/view3d_iterators.cc index 042b839b8f1..7b255673a00 100644 --- a/source/blender/editors/space_view3d/view3d_iterators.cc +++ b/source/blender/editors/space_view3d/view3d_iterators.cc @@ -312,7 +312,7 @@ void meshobject_foreachScreenVert(const ViewContext *vc, } BKE_mesh_foreach_mapped_vert( - mesh, meshobject_foreachScreenVert__mapFunc, &data, MESH_FOREACH_NOP); + mesh, true, meshobject_foreachScreenVert__mapFunc, &data, MESH_FOREACH_NOP); } static void mesh_foreachScreenVert__mapFunc(void *user_data, @@ -361,7 +361,8 @@ void mesh_foreachScreenVert( } BM_mesh_elem_table_ensure(vc->em->bm, BM_VERT); - BKE_mesh_foreach_mapped_vert(mesh, mesh_foreachScreenVert__mapFunc, &data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert( + mesh, true, mesh_foreachScreenVert__mapFunc, &data, MESH_FOREACH_NOP); } /** \} */ @@ -440,7 +441,8 @@ void mesh_foreachScreenEdge(const ViewContext *vc, } BM_mesh_elem_table_ensure(vc->em->bm, BM_EDGE); - BKE_mesh_foreach_mapped_edge(mesh, vc->em->bm->totedge, mesh_foreachScreenEdge__mapFunc, &data); + BKE_mesh_foreach_mapped_edge( + mesh, true, vc->em->bm->totedge, mesh_foreachScreenEdge__mapFunc, &data); } /** \} */ @@ -530,11 +532,11 @@ void mesh_foreachScreenEdge_clip_bb_segment(const ViewContext *vc, ED_view3d_clipping_local( vc->rv3d, vc->obedit->object_to_world().ptr()); /* for local clipping lookups. */ BKE_mesh_foreach_mapped_edge( - mesh, vc->em->bm->totedge, mesh_foreachScreenEdge_clip_bb_segment__mapFunc, &data); + mesh, true, vc->em->bm->totedge, mesh_foreachScreenEdge_clip_bb_segment__mapFunc, &data); } else { BKE_mesh_foreach_mapped_edge( - mesh, vc->em->bm->totedge, mesh_foreachScreenEdge__mapFunc, &data); + mesh, true, vc->em->bm->totedge, mesh_foreachScreenEdge__mapFunc, &data); } } @@ -589,11 +591,11 @@ void mesh_foreachScreenFace( const int face_dot_tags_num = mesh->runtime->subsurf_face_dot_tags.size(); if (face_dot_tags_num && (face_dot_tags_num != mesh->verts_num)) { BKE_mesh_foreach_mapped_subdiv_face_center( - mesh, mesh_foreachScreenFace__mapFunc, &data, MESH_FOREACH_NOP); + mesh, true, mesh_foreachScreenFace__mapFunc, &data, MESH_FOREACH_NOP); } else { BKE_mesh_foreach_mapped_face_center( - mesh, mesh_foreachScreenFace__mapFunc, &data, MESH_FOREACH_NOP); + mesh, true, mesh_foreachScreenFace__mapFunc, &data, MESH_FOREACH_NOP); } } diff --git a/source/blender/editors/util/ed_transverts.cc b/source/blender/editors/util/ed_transverts.cc index 22b98b3294f..2fc90922244 100644 --- a/source/blender/editors/util/ed_transverts.cc +++ b/source/blender/editors/util/ed_transverts.cc @@ -310,7 +310,7 @@ void ED_transverts_create_from_obedit(TransVertStore *tvs, const Object *obedit, if (tvs->transverts && editmesh_eval_cage) { BM_mesh_elem_table_ensure(bm, BM_VERT); BKE_mesh_foreach_mapped_vert( - editmesh_eval_cage, set_mapped_co, userdata, MESH_FOREACH_NOP); + editmesh_eval_cage, true, set_mapped_co, userdata, MESH_FOREACH_NOP); } } } -- 2.30.2 From 051755ff6d90b8281616f3e73215ec0975fa015b Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Mon, 15 Apr 2024 10:55:24 -0300 Subject: [PATCH 2/4] Remove the new params 'use_orig_index' for the mesh iterators | keep the change in the DRW manager --- .../blender/blenkernel/BKE_mesh_iterators.hh | 5 --- .../blender/blenkernel/intern/DerivedMesh.cc | 3 +- source/blender/blenkernel/intern/editmesh.cc | 2 +- .../blenkernel/intern/mesh_iterators.cc | 38 +++++++------------ source/blender/editors/mesh/meshtools.cc | 3 +- .../editors/sculpt_paint/paint_vertex_proj.cc | 9 ++--- .../sculpt_paint/paint_vertex_weight_ops.cc | 6 +-- .../editors/space_view3d/view3d_iterators.cc | 16 ++++---- source/blender/editors/util/ed_transverts.cc | 2 +- 9 files changed, 29 insertions(+), 55 deletions(-) diff --git a/source/blender/blenkernel/BKE_mesh_iterators.hh b/source/blender/blenkernel/BKE_mesh_iterators.hh index 9967ec8e39d..0e7a2909ba3 100644 --- a/source/blender/blenkernel/BKE_mesh_iterators.hh +++ b/source/blender/blenkernel/BKE_mesh_iterators.hh @@ -17,7 +17,6 @@ enum MeshForeachFlag { void BKE_mesh_foreach_mapped_vert( const Mesh *mesh, - const bool use_orig_index, void (*func)(void *user_data, int index, const float co[3], const float no[3]), void *user_data, MeshForeachFlag flag); @@ -29,11 +28,9 @@ void BKE_mesh_foreach_mapped_vert( void BKE_mesh_foreach_mapped_edge( Mesh *mesh, int tot_edges, - const bool use_orig_index, void (*func)(void *user_data, int index, const float v0co[3], const float v1co[3]), void *user_data); void BKE_mesh_foreach_mapped_loop(Mesh *mesh, - const bool use_orig_index, void (*func)(void *user_data, int vertex_index, int face_index, @@ -43,13 +40,11 @@ void BKE_mesh_foreach_mapped_loop(Mesh *mesh, MeshForeachFlag flag); void BKE_mesh_foreach_mapped_face_center( Mesh *mesh, - const bool use_orig_index, void (*func)(void *user_data, int index, const float cent[3], const float no[3]), void *user_data, MeshForeachFlag flag); void BKE_mesh_foreach_mapped_subdiv_face_center( Mesh *mesh, - const bool use_orig_index, void (*func)(void *user_data, int index, const float cent[3], const float no[3]), void *user_data, MeshForeachFlag flag); diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc index aae83593a69..446ce25aad2 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.cc +++ b/source/blender/blenkernel/intern/DerivedMesh.cc @@ -1564,8 +1564,7 @@ void mesh_get_mapped_verts_coords(Mesh *mesh_eval, blender::MutableSpan(r_cos.data()); user_data.vertex_visit = BLI_BITMAP_NEW(r_cos.size(), "vertexcos flags"); - BKE_mesh_foreach_mapped_vert( - mesh_eval, true, make_vertexcos__mapFunc, &user_data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(mesh_eval, make_vertexcos__mapFunc, &user_data, MESH_FOREACH_NOP); MEM_freeN(user_data.vertex_visit); } else { diff --git a/source/blender/blenkernel/intern/editmesh.cc b/source/blender/blenkernel/intern/editmesh.cc index b9bb997fd6d..eb854c2e565 100644 --- a/source/blender/blenkernel/intern/editmesh.cc +++ b/source/blender/blenkernel/intern/editmesh.cc @@ -162,7 +162,7 @@ Array BKE_editmesh_vert_coords_alloc(Depsgraph *depsgraph, data.positions_cage = positions_cage; data.visit_bitmap = visit_bitmap; - BKE_mesh_foreach_mapped_vert(cage, true, cage_mapped_verts_callback, &data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(cage, cage_mapped_verts_callback, &data, MESH_FOREACH_NOP); MEM_freeN(visit_bitmap); diff --git a/source/blender/blenkernel/intern/mesh_iterators.cc b/source/blender/blenkernel/intern/mesh_iterators.cc index 24a15270dea..f824e40dac1 100644 --- a/source/blender/blenkernel/intern/mesh_iterators.cc +++ b/source/blender/blenkernel/intern/mesh_iterators.cc @@ -31,7 +31,6 @@ void BKE_mesh_foreach_mapped_vert( const Mesh *mesh, - const bool use_orig_index, void (*func)(void *user_data, int index, const float co[3], const float no[3]), void *user_data, MeshForeachFlag flag) @@ -62,9 +61,8 @@ void BKE_mesh_foreach_mapped_vert( } else { const blender::Span positions = mesh->vert_positions(); - const int *index = use_orig_index ? static_cast( - CustomData_get_layer(&mesh->vert_data, CD_ORIGINDEX)) : - nullptr; + const int *index = static_cast( + CustomData_get_layer(&mesh->vert_data, CD_ORIGINDEX)); blender::Span vert_normals; if (flag & MESH_FOREACH_USE_NORMAL) { vert_normals = mesh->vert_normals(); @@ -92,7 +90,6 @@ void BKE_mesh_foreach_mapped_vert( void BKE_mesh_foreach_mapped_edge( Mesh *mesh, const int tot_edges, - const bool use_orig_index, void (*func)(void *user_data, int index, const float v0co[3], const float v1co[3]), void *user_data) { @@ -121,9 +118,8 @@ void BKE_mesh_foreach_mapped_edge( else { const blender::Span positions = mesh->vert_positions(); const blender::Span edges = mesh->edges(); - const int *index = use_orig_index ? static_cast( - CustomData_get_layer(&mesh->edge_data, CD_ORIGINDEX)) : - nullptr; + const int *index = static_cast( + CustomData_get_layer(&mesh->edge_data, CD_ORIGINDEX)); if (index) { for (const int i : edges.index_range()) { @@ -144,7 +140,6 @@ void BKE_mesh_foreach_mapped_edge( } void BKE_mesh_foreach_mapped_loop(Mesh *mesh, - const bool use_orig_index, void (*func)(void *user_data, int vertex_index, int face_index, @@ -199,12 +194,10 @@ void BKE_mesh_foreach_mapped_loop(Mesh *mesh, const blender::Span positions = mesh->vert_positions(); const blender::OffsetIndices faces = mesh->faces(); const blender::Span corner_verts = mesh->corner_verts(); - const int *v_index = use_orig_index ? static_cast(CustomData_get_layer( - &mesh->vert_data, CD_ORIGINDEX)) : - nullptr; - const int *f_index = use_orig_index ? static_cast(CustomData_get_layer( - &mesh->face_data, CD_ORIGINDEX)) : - nullptr; + const int *v_index = static_cast( + CustomData_get_layer(&mesh->vert_data, CD_ORIGINDEX)); + const int *f_index = static_cast( + CustomData_get_layer(&mesh->face_data, CD_ORIGINDEX)); if (v_index || f_index) { for (const int face_i : faces.index_range()) { @@ -234,7 +227,6 @@ void BKE_mesh_foreach_mapped_loop(Mesh *mesh, void BKE_mesh_foreach_mapped_face_center( Mesh *mesh, - const bool use_orig_index, void (*func)(void *user_data, int index, const float cent[3], const float no[3]), void *user_data, MeshForeachFlag flag) @@ -272,9 +264,8 @@ void BKE_mesh_foreach_mapped_face_center( const blender::Span positions = mesh->vert_positions(); const blender::OffsetIndices faces = mesh->faces(); const blender::Span corner_verts = mesh->corner_verts(); - const int *index = use_orig_index ? static_cast( - CustomData_get_layer(&mesh->face_data, CD_ORIGINDEX)) : - nullptr; + const int *index = static_cast( + CustomData_get_layer(&mesh->face_data, CD_ORIGINDEX)); if (index) { for (const int i : faces.index_range()) { @@ -311,7 +302,6 @@ void BKE_mesh_foreach_mapped_face_center( void BKE_mesh_foreach_mapped_subdiv_face_center( Mesh *mesh, - const bool use_orig_index, void (*func)(void *user_data, int index, const float cent[3], const float no[3]), void *user_data, MeshForeachFlag flag) @@ -323,9 +313,8 @@ void BKE_mesh_foreach_mapped_subdiv_face_center( if (flag & MESH_FOREACH_USE_NORMAL) { vert_normals = mesh->vert_normals(); } - const int *index = use_orig_index ? static_cast( - CustomData_get_layer(&mesh->face_data, CD_ORIGINDEX)) : - nullptr; + const int *index = static_cast( + CustomData_get_layer(&mesh->face_data, CD_ORIGINDEX)); const blender::BitSpan facedot_tags = mesh->runtime->subsurf_face_dot_tags; if (index) { @@ -389,7 +378,6 @@ void BKE_mesh_foreach_mapped_vert_coords_get(const Mesh *mesh_eval, memset(r_cos, 0, sizeof(*r_cos) * totcos); user_data.vertexcos = r_cos; user_data.vertex_visit = BLI_BITMAP_NEW(totcos, __func__); - BKE_mesh_foreach_mapped_vert( - mesh_eval, true, get_vertexcos__mapFunc, &user_data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(mesh_eval, get_vertexcos__mapFunc, &user_data, MESH_FOREACH_NOP); MEM_freeN(user_data.vertex_visit); } diff --git a/source/blender/editors/mesh/meshtools.cc b/source/blender/editors/mesh/meshtools.cc index 67c1714aff0..b4d750e3c22 100644 --- a/source/blender/editors/mesh/meshtools.cc +++ b/source/blender/editors/mesh/meshtools.cc @@ -1391,8 +1391,7 @@ bool ED_mesh_pick_vert( data.v_idx_best = -1; data.hide_vert = *attributes.lookup(".hide_vert", bke::AttrDomain::Point); - BKE_mesh_foreach_mapped_vert( - mesh_eval, true, ed_mesh_pick_vert__mapFunc, &data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(mesh_eval, ed_mesh_pick_vert__mapFunc, &data, MESH_FOREACH_NOP); if (data.v_idx_best == -1) { return false; diff --git a/source/blender/editors/sculpt_paint/paint_vertex_proj.cc b/source/blender/editors/sculpt_paint/paint_vertex_proj.cc index 060b3c57861..621bbca5a3f 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_proj.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex_proj.cc @@ -83,7 +83,7 @@ static void vpaint_proj_dm_map_cosnos_init(Depsgraph *depsgraph, memset(vp_handle->vcosnos, 0, sizeof(*vp_handle->vcosnos) * mesh->verts_num); BKE_mesh_foreach_mapped_vert( - mesh_eval, true, vpaint_proj_dm_map_cosnos_init__map_cb, vp_handle, MESH_FOREACH_USE_NORMAL); + mesh_eval, vpaint_proj_dm_map_cosnos_init__map_cb, vp_handle, MESH_FOREACH_USE_NORMAL); } /* -------------------------------------------------------------------- */ @@ -146,11 +146,8 @@ static void vpaint_proj_dm_map_cosnos_update(Depsgraph *depsgraph, BLI_assert(BLI_listbase_is_empty(&ob->modifiers) == false); copy_vn_fl(vp_handle->dists_sq, mesh->verts_num, FLT_MAX); - BKE_mesh_foreach_mapped_vert(mesh_eval, - true, - vpaint_proj_dm_map_cosnos_update__map_cb, - &vp_update, - MESH_FOREACH_USE_NORMAL); + BKE_mesh_foreach_mapped_vert( + mesh_eval, vpaint_proj_dm_map_cosnos_update__map_cb, &vp_update, MESH_FOREACH_USE_NORMAL); } /* -------------------------------------------------------------------- */ diff --git a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.cc b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.cc index 939d10052c6..aa54d6f4d1c 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.cc @@ -830,15 +830,13 @@ static int paint_weight_gradient_exec(bContext *C, wmOperator *op) if (data.is_init) { data.vert_visit = BLI_BITMAP_NEW(mesh->verts_num, __func__); - BKE_mesh_foreach_mapped_vert( - mesh_eval, true, gradientVertInit__mapFunc, &data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(mesh_eval, gradientVertInit__mapFunc, &data, MESH_FOREACH_NOP); MEM_freeN(data.vert_visit); data.vert_visit = nullptr; } else { - BKE_mesh_foreach_mapped_vert( - mesh_eval, true, gradientVertUpdate__mapFunc, &data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(mesh_eval, gradientVertUpdate__mapFunc, &data, MESH_FOREACH_NOP); } DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); diff --git a/source/blender/editors/space_view3d/view3d_iterators.cc b/source/blender/editors/space_view3d/view3d_iterators.cc index d802da22617..0ef40c41e57 100644 --- a/source/blender/editors/space_view3d/view3d_iterators.cc +++ b/source/blender/editors/space_view3d/view3d_iterators.cc @@ -312,7 +312,7 @@ void meshobject_foreachScreenVert(const ViewContext *vc, } BKE_mesh_foreach_mapped_vert( - mesh, true, meshobject_foreachScreenVert__mapFunc, &data, MESH_FOREACH_NOP); + mesh, meshobject_foreachScreenVert__mapFunc, &data, MESH_FOREACH_NOP); } static void mesh_foreachScreenVert__mapFunc(void *user_data, @@ -361,8 +361,7 @@ void mesh_foreachScreenVert( } BM_mesh_elem_table_ensure(vc->em->bm, BM_VERT); - BKE_mesh_foreach_mapped_vert( - mesh, true, mesh_foreachScreenVert__mapFunc, &data, MESH_FOREACH_NOP); + BKE_mesh_foreach_mapped_vert(mesh, mesh_foreachScreenVert__mapFunc, &data, MESH_FOREACH_NOP); } /** \} */ @@ -441,8 +440,7 @@ void mesh_foreachScreenEdge(const ViewContext *vc, } BM_mesh_elem_table_ensure(vc->em->bm, BM_EDGE); - BKE_mesh_foreach_mapped_edge( - mesh, true, vc->em->bm->totedge, mesh_foreachScreenEdge__mapFunc, &data); + BKE_mesh_foreach_mapped_edge(mesh, vc->em->bm->totedge, mesh_foreachScreenEdge__mapFunc, &data); } /** \} */ @@ -532,11 +530,11 @@ void mesh_foreachScreenEdge_clip_bb_segment(const ViewContext *vc, ED_view3d_clipping_local( vc->rv3d, vc->obedit->object_to_world().ptr()); /* for local clipping lookups. */ BKE_mesh_foreach_mapped_edge( - mesh, true, vc->em->bm->totedge, mesh_foreachScreenEdge_clip_bb_segment__mapFunc, &data); + mesh, vc->em->bm->totedge, mesh_foreachScreenEdge_clip_bb_segment__mapFunc, &data); } else { BKE_mesh_foreach_mapped_edge( - mesh, true, vc->em->bm->totedge, mesh_foreachScreenEdge__mapFunc, &data); + mesh, vc->em->bm->totedge, mesh_foreachScreenEdge__mapFunc, &data); } } @@ -591,11 +589,11 @@ void mesh_foreachScreenFace( const int face_dot_tags_num = mesh->runtime->subsurf_face_dot_tags.size(); if (face_dot_tags_num && (face_dot_tags_num != mesh->verts_num)) { BKE_mesh_foreach_mapped_subdiv_face_center( - mesh, true, mesh_foreachScreenFace__mapFunc, &data, MESH_FOREACH_NOP); + mesh, mesh_foreachScreenFace__mapFunc, &data, MESH_FOREACH_NOP); } else { BKE_mesh_foreach_mapped_face_center( - mesh, true, mesh_foreachScreenFace__mapFunc, &data, MESH_FOREACH_NOP); + mesh, mesh_foreachScreenFace__mapFunc, &data, MESH_FOREACH_NOP); } } diff --git a/source/blender/editors/util/ed_transverts.cc b/source/blender/editors/util/ed_transverts.cc index f12c6590bc5..f570040d611 100644 --- a/source/blender/editors/util/ed_transverts.cc +++ b/source/blender/editors/util/ed_transverts.cc @@ -310,7 +310,7 @@ void ED_transverts_create_from_obedit(TransVertStore *tvs, const Object *obedit, if (tvs->transverts && editmesh_eval_cage) { BM_mesh_elem_table_ensure(bm, BM_VERT); BKE_mesh_foreach_mapped_vert( - editmesh_eval_cage, true, set_mapped_co, userdata, MESH_FOREACH_NOP); + editmesh_eval_cage, set_mapped_co, userdata, MESH_FOREACH_NOP); } } } -- 2.30.2 From b327abce76881dfb520ab7464264e7e20bd37339 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Mon, 15 Apr 2024 12:10:23 -0300 Subject: [PATCH 3/4] Fix sculpted mesh being force generated | Avoid const bool | Split functions | Use static_cast --- source/blender/draw/DRW_select_buffer.hh | 2 +- .../blender/draw/intern/draw_select_buffer.cc | 49 ++++++++++++++----- 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/source/blender/draw/DRW_select_buffer.hh b/source/blender/draw/DRW_select_buffer.hh index 827f558e6f1..303b89e416e 100644 --- a/source/blender/draw/DRW_select_buffer.hh +++ b/source/blender/draw/DRW_select_buffer.hh @@ -69,7 +69,7 @@ struct SELECTID_Context { /* `draw_select_buffer.cc` */ bool DRW_select_buffer_elem_get( - uint sel_id, uint *r_elem, uint *r_base_index, char *r_elem_type, const bool use_orig_index); + uint sel_id, uint *r_elem, uint *r_base_index, char *r_elem_type, bool use_orig_index); uint DRW_select_buffer_context_offset_for_object_elem(Depsgraph *depsgraph, Object *object, char elem_type); diff --git a/source/blender/draw/intern/draw_select_buffer.cc b/source/blender/draw/intern/draw_select_buffer.cc index 1557c5a6acc..36a9ece7259 100644 --- a/source/blender/draw/intern/draw_select_buffer.cc +++ b/source/blender/draw/intern/draw_select_buffer.cc @@ -393,11 +393,40 @@ uint DRW_select_buffer_find_nearest_to_point(Depsgraph *depsgraph, /** \name Object Utils * \{ */ -bool DRW_select_buffer_elem_get(const uint sel_id, - uint *r_elem, - uint *r_base_index, - char *r_elem_type, - const bool use_orig_index) +static const CustomData *mesh_customdata_of_type(const Mesh *mesh_eval, char elem_type) +{ + switch (elem_type) { + case SCE_SELECT_FACE: + return &mesh_eval->face_data; + case SCE_SELECT_EDGE: + return &mesh_eval->edge_data; + case SCE_SELECT_VERTEX: + default: + return &mesh_eval->vert_data; + } +} + +static const int *orig_index_from_object_get(const Object *object_eval, char elem_type) +{ + if (object_eval->type != OB_MESH) { + return nullptr; + } + + /* Keep in sync with the mesh used in #MeshRenderData::mesh. */ + const Mesh *mesh_eval = static_cast(object_eval->data); + const bool is_editmode = (mesh_eval->runtime->edit_mesh != nullptr) && + (BKE_object_get_editmesh_eval_final(object_eval) != nullptr) && + DRW_object_is_in_edit_mode(object_eval); + if (is_editmode) { + mesh_eval = BKE_object_get_editmesh_eval_cage(object_eval); + } + + const CustomData *data = mesh_customdata_of_type(mesh_eval, elem_type); + return static_cast(CustomData_get_layer(data, CD_ORIGINDEX)); +} + +bool DRW_select_buffer_elem_get( + const uint sel_id, uint *r_elem, uint *r_base_index, char *r_elem_type, bool use_orig_index) { SELECTID_Context *select_ctx = DRW_select_engine_context_get(); @@ -438,14 +467,8 @@ bool DRW_select_buffer_elem_get(const uint sel_id, } if (use_orig_index) { - Object *object = select_ctx->objects[base_index]; - Mesh *mesh_eval = BKE_object_get_evaluated_mesh(object); - const int *orig_index = reinterpret_cast( - CustomData_get_layer(elem_type == SCE_SELECT_FACE ? &mesh_eval->face_data : - elem_type == SCE_SELECT_EDGE ? &mesh_eval->edge_data : - &mesh_eval->vert_data, - CD_ORIGINDEX)); - + const Object *object_eval = select_ctx->objects[base_index]; + const int *orig_index = orig_index_from_object_get(object_eval, elem_type); if (orig_index) { elem_id = orig_index[elem_id]; } -- 2.30.2 From 70f2891190f2754064fbf70fd0dfdde5b48b9394 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Mon, 15 Apr 2024 17:43:56 -0300 Subject: [PATCH 4/4] Silence warnings | BLI_assert_unreachable --- source/blender/draw/intern/draw_select_buffer.cc | 3 ++- .../mesh_extractors/extract_mesh_vbo_select_idx.cc | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/source/blender/draw/intern/draw_select_buffer.cc b/source/blender/draw/intern/draw_select_buffer.cc index 36a9ece7259..725f84527ee 100644 --- a/source/blender/draw/intern/draw_select_buffer.cc +++ b/source/blender/draw/intern/draw_select_buffer.cc @@ -401,9 +401,10 @@ static const CustomData *mesh_customdata_of_type(const Mesh *mesh_eval, char ele case SCE_SELECT_EDGE: return &mesh_eval->edge_data; case SCE_SELECT_VERTEX: - default: return &mesh_eval->vert_data; } + BLI_assert_unreachable(); + return nullptr; } static const int *orig_index_from_object_get(const Object *object_eval, char elem_type) diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_select_idx.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_select_idx.cc index 756cc8de620..3d593b0628a 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_select_idx.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_select_idx.cc @@ -166,7 +166,7 @@ static void extract_vert_idx_iter_loose_vert_mesh(const MeshRenderData &mr, } static void extract_vert_idx_init_subdiv(const DRWSubdivCache &subdiv_cache, - const MeshRenderData &mr, + const MeshRenderData & /*mr*/, MeshBatchCache & /*cache*/, void *buf, void * /*data*/) @@ -181,7 +181,7 @@ static void extract_vert_idx_init_subdiv(const DRWSubdivCache &subdiv_cache, } static void extract_vert_idx_loose_geom_subdiv(const DRWSubdivCache &subdiv_cache, - const MeshRenderData &mr, + const MeshRenderData & /*mr*/, void *buffer, void * /*data*/) { @@ -235,7 +235,7 @@ static void extract_edge_idx_init_subdiv(const DRWSubdivCache &subdiv_cache, } static void extract_edge_idx_loose_geom_subdiv(const DRWSubdivCache &subdiv_cache, - const MeshRenderData &mr, + const MeshRenderData & /*mr*/, void *buffer, void * /*data*/) { @@ -258,7 +258,7 @@ static void extract_edge_idx_loose_geom_subdiv(const DRWSubdivCache &subdiv_cach } static void extract_face_idx_init_subdiv(const DRWSubdivCache &subdiv_cache, - const MeshRenderData &mr, + const MeshRenderData & /*mr*/, MeshBatchCache & /*cache*/, void *buf, void * /*data*/) @@ -334,7 +334,7 @@ static void extract_fdot_idx_iter_face_bm(const MeshRenderData & /*mr*/, (*(int32_t **)data)[f_index] = f_index; } -static void extract_fdot_idx_iter_face_mesh(const MeshRenderData &mr, +static void extract_fdot_idx_iter_face_mesh(const MeshRenderData & /*mr*/, const int face_index, void *data) { -- 2.30.2