From 7ca651d18274acacfe8e0ecb7bc6fdd3399ea01b Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 9 Feb 2023 15:56:05 +0100 Subject: [PATCH] Mesh: Remove unnecessary edge draw flag As described in #95966, replace the `ME_EDGEDRAW` flag with a bit vector in mesh runtime data. Currently the the flag is only ever set to false for the "optimal display" feature of the subdivision surface modifier. When creating an "original" mesh in the main data-base, the flag is always supposed to be true. The bit vector is now created by the modifier only as necessary, and is cleared for topology-changing operations. This fixes incorrect interpolation of the flag as noted in #104376. Generally it isn't possible to interpolate it through topology-changing operations. After this, only the seam status needs to be removed from edges before we can replace them with the generic `int2` type (or something similar) and reduce memory usage by 1/3. Related: - 10131a6f6238e259ce673249 - 145839aa42f775f161f5c6a0 In the future `BM_ELEM_DRAW` could be removed as well. Currently it is used and aliased by other defines in some non-obvious ways though. Pull Request #104417 --- source/blender/blenkernel/BKE_mesh.h | 4 ---- .../blenkernel/BKE_mesh_legacy_convert.h | 5 +---- source/blender/blenkernel/BKE_mesh_types.h | 7 +++++++ .../blenkernel/intern/curve_to_mesh_convert.cc | 2 -- source/blender/blenkernel/intern/mesh.cc | 8 +++++--- .../blenkernel/intern/mesh_calc_edges.cc | 1 - .../blender/blenkernel/intern/mesh_convert.cc | 12 +----------- .../blenkernel/intern/mesh_legacy_convert.cc | 8 +------- .../blender/blenkernel/intern/mesh_runtime.cc | 2 ++ .../blender/blenkernel/intern/mesh_validate.cc | 2 -- source/blender/blenkernel/intern/subdiv_mesh.cc | 17 +++++++++-------- source/blender/blenkernel/intern/subsurf_ccg.cc | 12 ++++-------- .../blender/blenloader/intern/versioning_300.cc | 9 --------- .../blenloader/intern/versioning_legacy.c | 2 +- .../blender/bmesh/intern/bmesh_mesh_convert.cc | 13 ++----------- .../blender/bmesh/intern/bmesh_mesh_convert.h | 1 - .../extract_mesh_vbo_edge_fac.cc | 15 ++++----------- source/blender/editors/mesh/mesh_data.cc | 5 ----- source/blender/editors/object/object_add.cc | 2 -- .../blender/editors/object/object_modifier.cc | 2 -- source/blender/io/collada/MeshImporter.cpp | 9 --------- source/blender/makesdna/DNA_meshdata_types.h | 1 - source/blender/modifiers/intern/MOD_mask.cc | 2 +- source/blender/modifiers/intern/MOD_screw.cc | 4 ++-- .../modifiers/intern/MOD_solidify_extrude.cc | 1 - .../intern/MOD_solidify_nonmanifold.cc | 6 +++--- .../blender/modifiers/intern/MOD_triangulate.cc | 10 ---------- .../geometry/nodes/node_geo_convex_hull.cc | 2 -- .../nodes/geometry/nodes/node_geo_curve_fill.cc | 1 - .../geometry/nodes/node_geo_extrude_mesh.cc | 2 +- .../nodes/node_geo_mesh_primitive_circle.cc | 2 -- .../nodes/node_geo_mesh_primitive_cone.cc | 4 ---- .../nodes/node_geo_mesh_primitive_grid.cc | 2 -- .../nodes/node_geo_mesh_primitive_uv_sphere.cc | 4 ---- 34 files changed, 44 insertions(+), 135 deletions(-) diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index c9928b9c4d6..6f9dc8be4a3 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -229,10 +229,6 @@ void BKE_mesh_material_remap(struct Mesh *me, const unsigned int *remap, unsigne void BKE_mesh_smooth_flag_set(struct Mesh *me, bool use_smooth); void BKE_mesh_auto_smooth_flag_set(struct Mesh *me, bool use_auto_smooth, float auto_smooth_angle); -/** - * Needed after converting a mesh with subsurf optimal display to mesh. - */ -void BKE_mesh_edges_set_draw_render(struct Mesh *me); /** * Used for unit testing; compares two meshes, checking only diff --git a/source/blender/blenkernel/BKE_mesh_legacy_convert.h b/source/blender/blenkernel/BKE_mesh_legacy_convert.h index 087716706e1..5be751c4a47 100644 --- a/source/blender/blenkernel/BKE_mesh_legacy_convert.h +++ b/source/blender/blenkernel/BKE_mesh_legacy_convert.h @@ -145,10 +145,7 @@ void BKE_mesh_convert_mfaces_to_mpolys(struct Mesh *mesh); */ void BKE_mesh_do_versions_convert_mfaces_to_mpolys(struct Mesh *mesh); -/** - * Convert legacy #MFace.edcode to edge #ME_EDGEDRAW. - */ -void BKE_mesh_calc_edges_legacy(struct Mesh *me, bool use_old); +void BKE_mesh_calc_edges_legacy(struct Mesh *me); void BKE_mesh_do_versions_cd_flag_init(struct Mesh *mesh); diff --git a/source/blender/blenkernel/BKE_mesh_types.h b/source/blender/blenkernel/BKE_mesh_types.h index c9992a5e3d7..edfea59badf 100644 --- a/source/blender/blenkernel/BKE_mesh_types.h +++ b/source/blender/blenkernel/BKE_mesh_types.h @@ -174,6 +174,13 @@ struct MeshRuntime { */ BitVector<> subsurf_face_dot_tags; + /** + * A bit vector the size of the number of edges, set to true for edges that should be drawn in + * the viewport. Created by the "Optimimal Display" feature of the subdivision surface modifier. + * Otherwise it will be empty. + */ + BitVector<> subsurf_optimal_display_edges; + MeshRuntime() = default; ~MeshRuntime(); diff --git a/source/blender/blenkernel/intern/curve_to_mesh_convert.cc b/source/blender/blenkernel/intern/curve_to_mesh_convert.cc index d3c57e5257d..d49bc043568 100644 --- a/source/blender/blenkernel/intern/curve_to_mesh_convert.cc +++ b/source/blender/blenkernel/intern/curve_to_mesh_convert.cc @@ -62,7 +62,6 @@ static void fill_mesh_topology(const int vert_offset, MEdge &edge = edges[profile_edge_offset + i_ring]; edge.v1 = ring_vert_offset + i_profile; edge.v2 = next_ring_vert_offset + i_profile; - edge.flag = ME_EDGEDRAW; } } @@ -78,7 +77,6 @@ static void fill_mesh_topology(const int vert_offset, MEdge &edge = edges[ring_edge_offset + i_profile]; edge.v1 = ring_vert_offset + i_profile; edge.v2 = ring_vert_offset + i_next_profile; - edge.flag = ME_EDGEDRAW; } } diff --git a/source/blender/blenkernel/intern/mesh.cc b/source/blender/blenkernel/intern/mesh.cc index f588bfb1326..ee1129f6b4b 100644 --- a/source/blender/blenkernel/intern/mesh.cc +++ b/source/blender/blenkernel/intern/mesh.cc @@ -107,10 +107,12 @@ static void mesh_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int mesh_dst->runtime->wrapper_type_finalize = mesh_src->runtime->wrapper_type_finalize; mesh_dst->runtime->subsurf_runtime_data = mesh_src->runtime->subsurf_runtime_data; mesh_dst->runtime->cd_mask_extra = mesh_src->runtime->cd_mask_extra; - /* Copy face dot tags, since meshes may be duplicated after a subsurf modifier or node, but we - * still need to be able to draw face center vertices. The tags may be cleared explicitly when - * the topology is changed. */ + /* Copy face dot tags and edge tags, since meshes may be duplicated after a subsurf modifier or + * node, but we still need to be able to draw face center vertices and "optimal edges" + * differently. The tags may be cleared explicitly when the topology is changed. */ mesh_dst->runtime->subsurf_face_dot_tags = mesh_src->runtime->subsurf_face_dot_tags; + mesh_dst->runtime->subsurf_optimal_display_edges = + mesh_src->runtime->subsurf_optimal_display_edges; if ((mesh_src->id.tag & LIB_TAG_NO_MAIN) == 0) { /* This is a direct copy of a main mesh, so for now it has the same topology. */ mesh_dst->runtime->deformed_only = true; diff --git a/source/blender/blenkernel/intern/mesh_calc_edges.cc b/source/blender/blenkernel/intern/mesh_calc_edges.cc index ddca932c648..033a52081ba 100644 --- a/source/blender/blenkernel/intern/mesh_calc_edges.cc +++ b/source/blender/blenkernel/intern/mesh_calc_edges.cc @@ -146,7 +146,6 @@ static void serialize_and_initialize_deduplicated_edges(MutableSpan edg /* Initialize new edge. */ new_edge.v1 = item.key.v_low; new_edge.v2 = item.key.v_high; - new_edge.flag = ME_EDGEDRAW; } item.value.index = new_edge_index; new_edge_index++; diff --git a/source/blender/blenkernel/intern/mesh_convert.cc b/source/blender/blenkernel/intern/mesh_convert.cc index 0a2c8a714e3..5c71ffea0fa 100644 --- a/source/blender/blenkernel/intern/mesh_convert.cc +++ b/source/blender/blenkernel/intern/mesh_convert.cc @@ -121,7 +121,7 @@ static void make_edges_mdata_extend(Mesh &mesh) BLI_edgehashIterator_getKey(ehi, &medge->v1, &medge->v2); BLI_edgehashIterator_setValue(ehi, POINTER_FROM_UINT(e_index)); - medge->flag = ME_EDGEDRAW; + medge->flag = 0; } BLI_edgehashIterator_free(ehi); @@ -223,7 +223,6 @@ static Mesh *mesh_nurbs_displist_to_mesh(const Curve *cu, const ListBase *dispba for (b = 1; b < dl->nr; b++) { edges[dst_edge].v1 = startvert + ofs + b - 1; edges[dst_edge].v2 = startvert + ofs + b; - edges[dst_edge].flag = ME_EDGEDRAW; dst_edge++; } @@ -250,7 +249,6 @@ static Mesh *mesh_nurbs_displist_to_mesh(const Curve *cu, const ListBase *dispba else { edges[dst_edge].v2 = startvert + ofs + b + 1; } - edges[dst_edge].flag = ME_EDGEDRAW; dst_edge++; } } @@ -662,14 +660,6 @@ void BKE_mesh_from_pointcloud(const PointCloud *pointcloud, Mesh *me) &pointcloud->pdata, &me->vdata, CD_MASK_PROP_ALL, CD_DUPLICATE, pointcloud->totpoint); } -void BKE_mesh_edges_set_draw_render(Mesh *mesh) -{ - MutableSpan edges = mesh->edges_for_write(); - for (int i = 0; i < mesh->totedge; i++) { - edges[i].flag |= ME_EDGEDRAW; - } -} - void BKE_pointcloud_to_mesh(Main *bmain, Depsgraph *depsgraph, Scene * /*scene*/, Object *ob) { BLI_assert(ob->type == OB_POINTCLOUD); diff --git a/source/blender/blenkernel/intern/mesh_legacy_convert.cc b/source/blender/blenkernel/intern/mesh_legacy_convert.cc index b789fbcc0a0..dee96b42e57 100644 --- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc +++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc @@ -89,7 +89,6 @@ static void mesh_calc_edges_mdata(const MVert * /*allvert*/, int totface, int /*totloop*/, int totpoly, - const bool use_old, MEdge **r_medge, int *r_totedge) { @@ -156,9 +155,6 @@ static void mesh_calc_edges_mdata(const MVert * /*allvert*/, if (ed->v1 != (ed + 1)->v1 || ed->v2 != (ed + 1)->v2) { med->v1 = ed->v1; med->v2 = ed->v2; - if (use_old == false || ed->is_draw) { - med->flag = ME_EDGEDRAW; - } /* order is swapped so extruding this edge as a surface won't flip face normals * with cyclic curves */ @@ -175,7 +171,6 @@ static void mesh_calc_edges_mdata(const MVert * /*allvert*/, /* last edge */ med->v1 = ed->v1; med->v2 = ed->v2; - med->flag = ME_EDGEDRAW; MEM_freeN(edsort); @@ -206,7 +201,7 @@ static void mesh_calc_edges_mdata(const MVert * /*allvert*/, *r_totedge = totedge_final; } -void BKE_mesh_calc_edges_legacy(Mesh *me, const bool use_old) +void BKE_mesh_calc_edges_legacy(Mesh *me) { using namespace blender; MEdge *medge; @@ -224,7 +219,6 @@ void BKE_mesh_calc_edges_legacy(Mesh *me, const bool use_old) me->totface, loops.size(), polys.size(), - use_old, &medge, &totedge); diff --git a/source/blender/blenkernel/intern/mesh_runtime.cc b/source/blender/blenkernel/intern/mesh_runtime.cc index 3c64d7f3742..d1e56278c07 100644 --- a/source/blender/blenkernel/intern/mesh_runtime.cc +++ b/source/blender/blenkernel/intern/mesh_runtime.cc @@ -230,6 +230,7 @@ void BKE_mesh_runtime_clear_geometry(Mesh *mesh) mesh->runtime->loose_edges_cache.tag_dirty(); mesh->runtime->looptris_cache.tag_dirty(); mesh->runtime->subsurf_face_dot_tags.clear_and_shrink(); + mesh->runtime->subsurf_optimal_display_edges.clear_and_shrink(); if (mesh->runtime->shrinkwrap_data) { BKE_shrinkwrap_boundary_data_free(mesh->runtime->shrinkwrap_data); } @@ -245,6 +246,7 @@ void BKE_mesh_tag_edges_split(struct Mesh *mesh) free_subdiv_ccg(*mesh->runtime); mesh->runtime->loose_edges_cache.tag_dirty(); mesh->runtime->subsurf_face_dot_tags.clear_and_shrink(); + mesh->runtime->subsurf_optimal_display_edges.clear_and_shrink(); if (mesh->runtime->shrinkwrap_data) { BKE_shrinkwrap_boundary_data_free(mesh->runtime->shrinkwrap_data); } diff --git a/source/blender/blenkernel/intern/mesh_validate.cc b/source/blender/blenkernel/intern/mesh_validate.cc index 478c429e7aa..0d6afdd4dd3 100644 --- a/source/blender/blenkernel/intern/mesh_validate.cc +++ b/source/blender/blenkernel/intern/mesh_validate.cc @@ -1356,8 +1356,6 @@ void BKE_mesh_calc_edges_tessface(Mesh *mesh) for (int i = 0; BLI_edgesetIterator_isDone(ehi) == false; BLI_edgesetIterator_step(ehi), i++, med++, index++) { BLI_edgesetIterator_getKey(ehi, &med->v1, &med->v2); - - med->flag = ME_EDGEDRAW; *index = ORIGINDEX_NONE; } BLI_edgesetIterator_free(ehi); diff --git a/source/blender/blenkernel/intern/subdiv_mesh.cc b/source/blender/blenkernel/intern/subdiv_mesh.cc index 0f735f06b42..ee9e02883c6 100644 --- a/source/blender/blenkernel/intern/subdiv_mesh.cc +++ b/source/blender/blenkernel/intern/subdiv_mesh.cc @@ -536,6 +536,10 @@ static bool subdiv_mesh_topology_info(const SubdivForeachContext *foreach_contex subdiv_mesh_prepare_accumulator(subdiv_context, num_vertices); subdiv_context->subdiv_mesh->runtime->subsurf_face_dot_tags.clear(); subdiv_context->subdiv_mesh->runtime->subsurf_face_dot_tags.resize(num_vertices); + if (subdiv_context->settings->use_optimal_display) { + subdiv_context->subdiv_mesh->runtime->subsurf_optimal_display_edges.clear(); + subdiv_context->subdiv_mesh->runtime->subsurf_optimal_display_edges.resize(num_edges); + } return true; } @@ -784,15 +788,10 @@ static void subdiv_mesh_vertex_inner(const SubdivForeachContext *foreach_context * \{ */ static void subdiv_copy_edge_data(SubdivMeshContext *ctx, - MEdge *subdiv_edge, + const int subdiv_edge_index, const int coarse_edge_index) { - const int subdiv_edge_index = subdiv_edge - ctx->subdiv_edges; if (coarse_edge_index == ORIGINDEX_NONE) { - subdiv_edge->flag = 0; - if (!ctx->settings->use_optimal_display) { - subdiv_edge->flag |= ME_EDGEDRAW; - } if (ctx->edge_origindex != nullptr) { ctx->edge_origindex[subdiv_edge_index] = ORIGINDEX_NONE; } @@ -800,7 +799,9 @@ static void subdiv_copy_edge_data(SubdivMeshContext *ctx, } CustomData_copy_data( &ctx->coarse_mesh->edata, &ctx->subdiv_mesh->edata, coarse_edge_index, subdiv_edge_index, 1); - subdiv_edge->flag |= ME_EDGEDRAW; + if (ctx->settings->use_optimal_display) { + ctx->subdiv_mesh->runtime->subsurf_optimal_display_edges[subdiv_edge_index].set(); + } } static void subdiv_mesh_edge(const SubdivForeachContext *foreach_context, @@ -814,7 +815,7 @@ static void subdiv_mesh_edge(const SubdivForeachContext *foreach_context, SubdivMeshContext *ctx = static_cast(foreach_context->user_data); MEdge *subdiv_medge = ctx->subdiv_edges; MEdge *subdiv_edge = &subdiv_medge[subdiv_edge_index]; - subdiv_copy_edge_data(ctx, subdiv_edge, coarse_edge_index); + subdiv_copy_edge_data(ctx, subdiv_edge_index, coarse_edge_index); subdiv_edge->v1 = subdiv_v1; subdiv_edge->v2 = subdiv_v2; } diff --git a/source/blender/blenkernel/intern/subsurf_ccg.cc b/source/blender/blenkernel/intern/subsurf_ccg.cc index 2d268d54daf..c674c94065c 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.cc +++ b/source/blender/blenkernel/intern/subsurf_ccg.cc @@ -928,7 +928,6 @@ static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge) int edgeSize = ccgSubSurf_getEdgeSize(ss); uint i = 0; short *edgeFlags = ccgdm->edgeFlags; - const short ed_interior_flag = ccgdm->drawInteriorEdges ? ME_EDGEDRAW : 0; totface = ccgSubSurf_getNumFaces(ss); for (index = 0; index < totface; index++) { @@ -940,7 +939,7 @@ static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge) ccgDM_to_MEdge(&medge[i++], getFaceIndex(ss, f, S, x, 0, edgeSize, gridSize), getFaceIndex(ss, f, S, x + 1, 0, edgeSize, gridSize), - ed_interior_flag); + 0); } for (x = 1; x < gridSize - 1; x++) { @@ -948,11 +947,11 @@ static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge) ccgDM_to_MEdge(&medge[i++], getFaceIndex(ss, f, S, x, y, edgeSize, gridSize), getFaceIndex(ss, f, S, x, y + 1, edgeSize, gridSize), - ed_interior_flag); + 0); ccgDM_to_MEdge(&medge[i++], getFaceIndex(ss, f, S, y, x, edgeSize, gridSize), getFaceIndex(ss, f, S, y + 1, x, edgeSize, gridSize), - ed_interior_flag); + 0); } } } @@ -967,12 +966,9 @@ static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge) if (edgeFlags) { if (edgeIdx != -1) { - ed_flag |= ((edgeFlags[index] & ME_SEAM) | ME_EDGEDRAW); + ed_flag |= (edgeFlags[index] & ME_SEAM); } } - else { - ed_flag |= ME_EDGEDRAW; - } for (x = 0; x < edgeSize - 1; x++) { ccgDM_to_MEdge(&medge[i++], diff --git a/source/blender/blenloader/intern/versioning_300.cc b/source/blender/blenloader/intern/versioning_300.cc index 31f69708711..4cadc4ff028 100644 --- a/source/blender/blenloader/intern/versioning_300.cc +++ b/source/blender/blenloader/intern/versioning_300.cc @@ -3779,15 +3779,6 @@ void blo_do_versions_300(FileData *fd, Library * /*lib*/, Main *bmain) } } - if (!MAIN_VERSION_ATLEAST(bmain, 305, 1)) { - /* Reset edge visibility flag, since the base is meant to be "true" for original meshes. */ - LISTBASE_FOREACH (Mesh *, mesh, &bmain->meshes) { - for (MEdge &edge : mesh->edges_for_write()) { - edge.flag |= ME_EDGEDRAW; - } - } - } - if (!MAIN_VERSION_ATLEAST(bmain, 305, 2)) { LISTBASE_FOREACH (MovieClip *, clip, &bmain->movieclips) { MovieTracking *tracking = &clip->tracking; diff --git a/source/blender/blenloader/intern/versioning_legacy.c b/source/blender/blenloader/intern/versioning_legacy.c index 8685db377d4..6916ab50e31 100644 --- a/source/blender/blenloader/intern/versioning_legacy.c +++ b/source/blender/blenloader/intern/versioning_legacy.c @@ -1467,7 +1467,7 @@ void blo_do_versions_pre250(FileData *fd, Library *lib, Main *bmain) for (me = bmain->meshes.first; me; me = me->id.next) { if (!me->medge) { - BKE_mesh_calc_edges_legacy(me, true); /* true = use #MFace.edcode. */ + BKE_mesh_calc_edges_legacy(me); } else { BKE_mesh_strip_loose_faces(me); diff --git a/source/blender/bmesh/intern/bmesh_mesh_convert.cc b/source/blender/bmesh/intern/bmesh_mesh_convert.cc index 55b7216d35d..f4c8ca10c42 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_convert.cc +++ b/source/blender/bmesh/intern/bmesh_mesh_convert.cc @@ -113,7 +113,7 @@ using blender::StringRef; static char bm_edge_flag_from_mflag(const short mflag) { - return ((mflag & ME_SEAM) ? BM_ELEM_SEAM : 0) | ((mflag & ME_EDGEDRAW) ? BM_ELEM_DRAW : 0); + return ((mflag & ME_SEAM) ? BM_ELEM_SEAM : 0) | BM_ELEM_DRAW; } static char bm_face_flag_from_mflag(const char mflag) { @@ -124,7 +124,7 @@ static short bm_edge_flag_to_mflag(const BMEdge *e) { const char hflag = e->head.hflag; - return ((hflag & BM_ELEM_SEAM) ? ME_SEAM : 0) | ((hflag & BM_ELEM_DRAW) ? ME_EDGEDRAW : 0); + return (hflag & BM_ELEM_SEAM) ? ME_SEAM : 0; } static char bm_face_flag_to_mflag(const BMFace *f) { @@ -1420,15 +1420,6 @@ static void bm_to_mesh_edges(const BMesh &bm, dst_edge.v1 = BM_elem_index_get(src_edge.v1); dst_edge.v2 = BM_elem_index_get(src_edge.v2); dst_edge.flag = bm_edge_flag_to_mflag(&src_edge); - - /* Handle this differently to editmode switching; only enable draw for single user - * edges rather than calculating angle. */ - if ((dst_edge.flag & ME_EDGEDRAW) == 0) { - if (src_edge.l && src_edge.l == src_edge.l->radial_next) { - dst_edge.flag |= ME_EDGEDRAW; - } - } - CustomData_from_bmesh_block(&bm.edata, &mesh.edata, src_edge.head.data, edge_i); } if (!select_edge.is_empty()) { diff --git a/source/blender/bmesh/intern/bmesh_mesh_convert.h b/source/blender/bmesh/intern/bmesh_mesh_convert.h index 82b6d41b19b..bae689b3af2 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_convert.h +++ b/source/blender/bmesh/intern/bmesh_mesh_convert.h @@ -82,7 +82,6 @@ void BM_mesh_bm_to_me(struct Main *bmain, * - Ignore shape-keys. * - Ignore vertex-parents. * - Ignore selection history. - * - Uses simpler method to calculate #ME_EDGEDRAW * - Uses #CD_MASK_DERIVEDMESH instead of #CD_MASK_MESH. * * \note Was `cddm_from_bmesh_ex` in 2.7x, removed `MFace` support. diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edge_fac.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edge_fac.cc index aea1aacf5ea..4360fd16b9d 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edge_fac.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edge_fac.cc @@ -60,15 +60,8 @@ static void extract_edge_fac_init(const MeshRenderData *mr, if (mr->extract_type == MR_EXTRACT_MESH) { data->edge_loop_count = MEM_cnew_array(mr->edge_len, __func__); - - /* HACK(@fclem): Detecting the need for edge render. - * We could have a flag in the mesh instead or check the modifier stack. */ - const MEdge *med = mr->medge; - for (int e_index = 0; e_index < mr->edge_len; e_index++, med++) { - if ((med->flag & ME_EDGEDRAW) == 0) { - data->use_edge_render = true; - break; - } + if (!mr->me->runtime->subsurf_optimal_display_edges.is_empty()) { + data->use_edge_render = true; } } else { @@ -109,6 +102,7 @@ static void extract_edge_fac_iter_poly_mesh(const MeshRenderData *mr, void *_data) { MeshExtract_EdgeFac_Data *data = static_cast(_data); + const BitVector<> &optimal_display_edges = mr->me->runtime->subsurf_optimal_display_edges; const MLoop *mloop = mr->mloop; const int ml_index_end = mp->loopstart + mp->totloop; @@ -116,8 +110,7 @@ static void extract_edge_fac_iter_poly_mesh(const MeshRenderData *mr, const MLoop *ml = &mloop[ml_index]; if (data->use_edge_render) { - const MEdge *med = &mr->medge[ml->e]; - data->vbo_data[ml_index] = (med->flag & ME_EDGEDRAW) ? 255 : 0; + data->vbo_data[ml_index] = optimal_display_edges[ml->e] ? 255 : 0; } else { diff --git a/source/blender/editors/mesh/mesh_data.cc b/source/blender/editors/mesh/mesh_data.cc index db60f253cb2..263f7164fe6 100644 --- a/source/blender/editors/mesh/mesh_data.cc +++ b/source/blender/editors/mesh/mesh_data.cc @@ -1260,11 +1260,6 @@ static void mesh_add_edges(Mesh *mesh, int len) mesh->totedge = totedge; - MutableSpan edges = mesh->edges_for_write(); - for (MEdge &edge : edges.take_back(len)) { - edge.flag = ME_EDGEDRAW; - } - bke::MutableAttributeAccessor attributes = mesh->attributes_for_write(); bke::SpanAttributeWriter select_edge = attributes.lookup_or_add_for_write_span( ".select_edge", ATTR_DOMAIN_EDGE); diff --git a/source/blender/editors/object/object_add.cc b/source/blender/editors/object/object_add.cc index 6832e9add2c..3035fdd381b 100644 --- a/source/blender/editors/object/object_add.cc +++ b/source/blender/editors/object/object_add.cc @@ -3154,8 +3154,6 @@ static int object_convert_exec(bContext *C, wmOperator *op) Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); Mesh *me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_eval, &CD_MASK_MESH); me_eval = BKE_mesh_copy_for_eval(me_eval, false); - /* Full (edge-angle based) draw calculation should ideally be performed. */ - BKE_mesh_edges_set_draw_render(me_eval); BKE_object_material_from_eval_data(bmain, newob, &me_eval->id); Mesh *new_mesh = (Mesh *)newob->data; BKE_mesh_nomain_to_mesh(me_eval, new_mesh, newob); diff --git a/source/blender/editors/object/object_modifier.cc b/source/blender/editors/object/object_modifier.cc index 5ac76b9a82c..15d90729e9f 100644 --- a/source/blender/editors/object/object_modifier.cc +++ b/source/blender/editors/object/object_modifier.cc @@ -675,7 +675,6 @@ bool ED_object_modifier_convert_psys_to_mesh(ReportList * /*reports*/, if (k) { medge->v1 = cvert - 1; medge->v2 = cvert; - medge->flag = ME_EDGEDRAW; medge++; } else { @@ -694,7 +693,6 @@ bool ED_object_modifier_convert_psys_to_mesh(ReportList * /*reports*/, if (k) { medge->v1 = cvert - 1; medge->v2 = cvert; - medge->flag = ME_EDGEDRAW; medge++; } else { diff --git a/source/blender/io/collada/MeshImporter.cpp b/source/blender/io/collada/MeshImporter.cpp index 52eb852e1ed..288e208fe6c 100644 --- a/source/blender/io/collada/MeshImporter.cpp +++ b/source/blender/io/collada/MeshImporter.cpp @@ -562,15 +562,6 @@ void MeshImporter::mesh_add_edges(Mesh *mesh, int len) CustomData_free(&mesh->edata, mesh->totedge); mesh->edata = edata; - - MutableSpan edges = mesh->edges_for_write(); - - /* set default flags */ - medge = &edges[mesh->totedge]; - for (int i = 0; i < len; i++, medge++) { - medge->flag = ME_EDGEDRAW; - } - mesh->totedge = totedge; } diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h index 3b4a52eb29a..4f748fe6828 100644 --- a/source/blender/makesdna/DNA_meshdata_types.h +++ b/source/blender/makesdna/DNA_meshdata_types.h @@ -39,7 +39,6 @@ typedef struct MEdge { enum { /** Deprecated selection status. Now stored in ".select_edge" attribute. */ /* SELECT = (1 << 0), */ - ME_EDGEDRAW = (1 << 1), ME_SEAM = (1 << 2), /** Deprecated hide status. Now stored in ".hide_edge" attribute. */ /* ME_HIDE = (1 << 4), */ diff --git a/source/blender/modifiers/intern/MOD_mask.cc b/source/blender/modifiers/intern/MOD_mask.cc index 1269907971c..30801136eb4 100644 --- a/source/blender/modifiers/intern/MOD_mask.cc +++ b/source/blender/modifiers/intern/MOD_mask.cc @@ -588,7 +588,7 @@ static void add_interpolated_polys_to_new_mesh(const Mesh &src_mesh, cut_edge.v1 = dst_loops[mp_dst.loopstart].v; cut_edge.v2 = cut_dst_loop.v; BLI_assert(cut_edge.v1 != cut_edge.v2); - cut_edge.flag = ME_EDGEDRAW; + cut_edge.flag = 0; edge_index++; /* Only handle one of the cuts per iteration. */ diff --git a/source/blender/modifiers/intern/MOD_screw.cc b/source/blender/modifiers/intern/MOD_screw.cc index 0b3514dcadd..0faf2da4f53 100644 --- a/source/blender/modifiers/intern/MOD_screw.cc +++ b/source/blender/modifiers/intern/MOD_screw.cc @@ -786,7 +786,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * /* add the new edge */ med_new->v1 = varray_stride + j; med_new->v2 = med_new->v1 - totvert; - med_new->flag = ME_EDGEDRAW; + med_new->flag = 0; med_new++; } } @@ -804,7 +804,7 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh * for (i = 0; i < totvert; i++) { med_new->v1 = i; med_new->v2 = varray_stride + i; - med_new->flag = ME_EDGEDRAW; + med_new->flag = 0; med_new++; } } diff --git a/source/blender/modifiers/intern/MOD_solidify_extrude.cc b/source/blender/modifiers/intern/MOD_solidify_extrude.cc index 509e39206af..eb5cacc8886 100644 --- a/source/blender/modifiers/intern/MOD_solidify_extrude.cc +++ b/source/blender/modifiers/intern/MOD_solidify_extrude.cc @@ -1054,7 +1054,6 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex for (i = 0; i < rimVerts; i++, ed++) { ed->v1 = new_vert_arr[i]; ed->v2 = (do_shell ? new_vert_arr[i] : i) + verts_num; - ed->flag |= ME_EDGEDRAW; if (orig_ed) { *orig_ed = ORIGINDEX_NONE; diff --git a/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc b/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc index 02d1119faaf..74a020d8a89 100644 --- a/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc +++ b/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc @@ -2073,7 +2073,7 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, BLI_assert(v2 != MOD_SOLIDIFY_EMPTY_TAG); medge[insert].v1 = v1; medge[insert].v2 = v2; - medge[insert].flag = orig_medge[(*l)->old_edge].flag | ME_EDGEDRAW; + medge[insert].flag = orig_medge[(*l)->old_edge].flag; if (result_edge_crease) { result_edge_crease[insert] = orig_edge_crease ? orig_edge_crease[(*l)->old_edge] : 0.0f; @@ -2236,7 +2236,7 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, } medge[edge_index].v1 = last_g->new_vert; medge[edge_index].v2 = g->new_vert; - medge[edge_index].flag = ME_EDGEDRAW | ((last_flag | flag) & ME_SEAM); + medge[edge_index].flag = ((last_flag | flag) & ME_SEAM); if (result_edge_crease) { result_edge_crease[edge_index] = max_ff(mv_crease, min_ff(last_max_crease, max_crease)); @@ -2269,7 +2269,7 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, last_g->open_face_edge = edge_index; medge[edge_index].v1 = last_g->new_vert; medge[edge_index].v2 = first_g->new_vert; - medge[edge_index].flag = ME_EDGEDRAW | ((last_flag | first_flag) & ME_SEAM); + medge[edge_index].flag = ((last_flag | first_flag) & ME_SEAM); if (result_edge_crease) { result_edge_crease[edge_index] = max_ff(mv_crease, min_ff(last_max_crease, first_max_crease)); diff --git a/source/blender/modifiers/intern/MOD_triangulate.cc b/source/blender/modifiers/intern/MOD_triangulate.cc index adcf76a949d..66ffce98c65 100644 --- a/source/blender/modifiers/intern/MOD_triangulate.cc +++ b/source/blender/modifiers/intern/MOD_triangulate.cc @@ -43,8 +43,6 @@ static Mesh *triangulate_mesh(Mesh *mesh, { Mesh *result; BMesh *bm; - int edges_num, i; - MEdge *me; CustomData_MeshMasks cd_mask_extra{}; cd_mask_extra.vmask = CD_MASK_ORIGINDEX; cd_mask_extra.emask = CD_MASK_ORIGINDEX; @@ -85,14 +83,6 @@ static Mesh *triangulate_mesh(Mesh *mesh, CustomData_set_layer_flag(&result->ldata, CD_NORMAL, CD_FLAG_TEMPORARY); } - edges_num = result->totedge; - me = BKE_mesh_edges_for_write(result); - - /* force drawing of all edges (seems to be omitted in CDDM_from_bmesh) */ - for (i = 0; i < edges_num; i++, me++) { - me->flag |= ME_EDGEDRAW; - } - return result; } diff --git a/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc b/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc index 9ec82d2666f..31d1bcb210c 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc @@ -84,7 +84,6 @@ static Mesh *hull_from_bullet(const Mesh *mesh, Span coords) MEdge &edge = edges[edge_index]; edge.v1 = v_from; edge.v2 = v_to; - edge.flag = ME_EDGEDRAW; /* Write edge index into both loops that have it. */ int reverse_index = plConvexHullGetReversedLoopIndex(hull, i); @@ -98,7 +97,6 @@ static Mesh *hull_from_bullet(const Mesh *mesh, Span coords) MEdge &edge = edges[0]; edge.v1 = 0; edge.v2 = 1; - edge.flag = ME_EDGEDRAW; edge_index++; } BLI_assert(edge_index == edges_num); diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc index 2f4ac6c878c..7657ded97ca 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc @@ -91,7 +91,6 @@ static Mesh *cdt_to_mesh(const meshintersect::CDT_result &result) for (const int i : IndexRange(result.edge.size())) { edges[i].v1 = result.edge[i].first; edges[i].v2 = result.edge[i].second; - edges[i].flag = ME_EDGEDRAW; } int i_loop = 0; for (const int i : IndexRange(result.face.size())) { diff --git a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc index 28691252729..d2ee46fb6c8 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc @@ -151,7 +151,7 @@ static MEdge new_edge(const int v1, const int v2) MEdge edge; edge.v1 = v1; edge.v2 = v2; - edge.flag = ME_EDGEDRAW; + edge.flag = 0; return edge; } diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc index 4b4d7ecb702..7d465b9147e 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc @@ -129,7 +129,6 @@ static Mesh *create_circle_mesh(const float radius, MEdge &edge = edges[i]; edge.v1 = i; edge.v2 = (i + 1) % verts_num; - edge.flag = ME_EDGEDRAW; } /* Create triangle fan edges. */ @@ -138,7 +137,6 @@ static Mesh *create_circle_mesh(const float radius, MEdge &edge = edges[verts_num + i]; edge.v1 = verts_num; edge.v2 = i; - edge.flag = ME_EDGEDRAW; } } diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc index 757fab12e82..173aa22b77d 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc @@ -329,7 +329,6 @@ static void calculate_cone_edges(const ConeConfig &config, MutableSpan ed MEdge &edge = edges[edge_index++]; edge.v1 = config.first_vert; edge.v2 = config.first_ring_verts_start + i; - edge.flag = ME_EDGEDRAW; } } @@ -342,7 +341,6 @@ static void calculate_cone_edges(const ConeConfig &config, MutableSpan ed MEdge &edge = edges[edge_index++]; edge.v1 = this_ring_vert_start + j; edge.v2 = this_ring_vert_start + ((j + 1) % config.circle_segments); - edge.flag = ME_EDGEDRAW; } if (i == config.tot_edge_rings - 1) { /* There is one fewer ring of connecting edges. */ @@ -353,7 +351,6 @@ static void calculate_cone_edges(const ConeConfig &config, MutableSpan ed MEdge &edge = edges[edge_index++]; edge.v1 = this_ring_vert_start + j; edge.v2 = next_ring_vert_start + j; - edge.flag = ME_EDGEDRAW; } } @@ -363,7 +360,6 @@ static void calculate_cone_edges(const ConeConfig &config, MutableSpan ed MEdge &edge = edges[edge_index++]; edge.v1 = config.last_ring_verts_start + i; edge.v2 = config.last_vert; - edge.flag = ME_EDGEDRAW; } } } diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc index 4e6cc590a7b..16821925e2a 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc @@ -93,7 +93,6 @@ Mesh *create_grid_mesh(const int verts_x, MEdge &edge = edges[y_edge_offset + y]; edge.v1 = vert_index; edge.v2 = vert_index + 1; - edge.flag = ME_EDGEDRAW; } }); } @@ -109,7 +108,6 @@ Mesh *create_grid_mesh(const int verts_x, MEdge &edge = edges[x_edge_offset + x]; edge.v1 = vert_index; edge.v2 = vert_index + verts_y; - edge.flag = ME_EDGEDRAW; } }); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc index a93fccb3f37..9d65d961f04 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc @@ -117,7 +117,6 @@ BLI_NOINLINE static void calculate_sphere_edge_indices(MutableSpan edges, MEdge &edge = edges[edge_index++]; edge.v1 = 0; edge.v2 = first_vert_ring_index_start + segment; - edge.flag = ME_EDGEDRAW; } int ring_vert_index_start = 1; @@ -129,7 +128,6 @@ BLI_NOINLINE static void calculate_sphere_edge_indices(MutableSpan edges, MEdge &edge = edges[edge_index++]; edge.v1 = ring_vert_index_start + segment; edge.v2 = ring_vert_index_start + ((segment + 1) % segments); - edge.flag = ME_EDGEDRAW; } /* Add the edges connecting to the next ring. */ @@ -138,7 +136,6 @@ BLI_NOINLINE static void calculate_sphere_edge_indices(MutableSpan edges, MEdge &edge = edges[edge_index++]; edge.v1 = ring_vert_index_start + segment; edge.v2 = next_ring_vert_index_start + segment; - edge.flag = ME_EDGEDRAW; } } ring_vert_index_start += segments; @@ -151,7 +148,6 @@ BLI_NOINLINE static void calculate_sphere_edge_indices(MutableSpan edges, MEdge &edge = edges[edge_index++]; edge.v1 = last_vert_index; edge.v2 = last_vert_ring_start + segment; - edge.flag = ME_EDGEDRAW; } }