[Bf-blender-cvs] [de29ddebfc9] refactor-mesh-remove-pointers: Merge branch 'master' into refactor-mesh-remove-pointers
Hans Goudey
noreply at git.blender.org
Wed Aug 24 19:19:24 CEST 2022
Commit: de29ddebfc972cbf4b5a63eb9b39b2d4a4ff6abe
Author: Hans Goudey
Date: Wed Aug 24 11:39:52 2022 -0400
Branches: refactor-mesh-remove-pointers
https://developer.blender.org/rBde29ddebfc972cbf4b5a63eb9b39b2d4a4ff6abe
Merge branch 'master' into refactor-mesh-remove-pointers
===================================================================
===================================================================
diff --cc source/blender/blenkernel/intern/bvhutils.cc
index e70fd8bd577,d0b57b45d35..ca20ca678b1
--- a/source/blender/blenkernel/intern/bvhutils.cc
+++ b/source/blender/blenkernel/intern/bvhutils.cc
@@@ -1322,8 -1284,8 +1322,8 @@@ BVHTree *BKE_bvhtree_from_mesh_get(stru
case BVHTREE_FROM_LOOPTRI_NO_HIDDEN: {
blender::bke::AttributeAccessor attributes = blender::bke::mesh_attributes(*mesh);
mask = looptri_no_hidden_map_get(
- polygons.data(),
- attributes.lookup_or_default(".hide_face", ATTR_DOMAIN_FACE, false),
- mesh->mpoly,
++ blender::bke::mesh_polygons(*mesh).data(),
+ attributes.lookup_or_default(".hide_poly", ATTR_DOMAIN_FACE, false),
looptri_len,
&mask_bits_act_len);
ATTR_FALLTHROUGH;
diff --cc source/blender/blenkernel/intern/mball_tessellate.c
index 54def0189b1,61f5a5f315f..5e1f5ffb0d2
--- a/source/blender/blenkernel/intern/mball_tessellate.c
+++ b/source/blender/blenkernel/intern/mball_tessellate.c
@@@ -1436,34 -1436,57 +1436,55 @@@ Mesh *BKE_mball_polygonize(Depsgraph *d
polygonize(&process);
if (process.curindex == 0) {
freepolygonize(&process);
- return;
+ return NULL;
}
- /* add resulting surface to displist */
+ freepolygonize(&process);
- /* Avoid over-allocation since this is stored in the displist. */
- if (process.curindex != process.totindex) {
- process.indices = MEM_reallocN(process.indices, sizeof(int[4]) * process.curindex);
- }
- if (process.curvertex != process.totvertex) {
- process.co = MEM_reallocN(process.co, process.curvertex * sizeof(float[3]));
- process.no = MEM_reallocN(process.no, process.curvertex * sizeof(float[3]));
- }
+ Mesh *mesh = (Mesh *)BKE_id_new_nomain(ID_ME, ((ID *)ob->data)->name + 2);
- DispList *dl = MEM_callocN(sizeof(DispList), "mballdisp");
- BLI_addtail(dispbase, dl);
- dl->type = DL_INDEX4;
- dl->nr = (int)process.curvertex;
- dl->parts = (int)process.curindex;
+ mesh->totvert = (int)process.curvertex;
+ MVert *mvert = CustomData_add_layer(&mesh->vdata, CD_MVERT, CD_DEFAULT, NULL, mesh->totvert);
+ for (int i = 0; i < mesh->totvert; i++) {
+ copy_v3_v3(mvert[i].co, process.co[i]);
+ mvert->bweight = 0;
+ mvert->flag = 0;
+ }
+ MEM_freeN(process.co);
+
+ mesh->totpoly = (int)process.curindex;
+ MPoly *mpoly = CustomData_add_layer(&mesh->pdata, CD_MPOLY, CD_DEFAULT, NULL, mesh->totpoly);
+ MLoop *mloop = CustomData_add_layer(&mesh->ldata, CD_MLOOP, CD_DEFAULT, NULL, mesh->totpoly * 4);
+
+ int loop_offset = 0;
+ for (int i = 0; i < mesh->totpoly; i++) {
+ const int *indices = process.indices[i];
+
+ const int count = indices[2] != indices[3] ? 4 : 3;
+ mpoly[i].loopstart = loop_offset;
+ mpoly[i].totloop = count;
+ mpoly[i].flag = ME_SMOOTH;
+
+ mloop[loop_offset].v = (uint32_t)indices[0];
+ mloop[loop_offset + 1].v = (uint32_t)indices[1];
+ mloop[loop_offset + 2].v = (uint32_t)indices[2];
+ if (count == 4) {
+ mloop[loop_offset + 3].v = (uint32_t)indices[3];
+ }
- dl->index = (int *)process.indices;
+ loop_offset += count;
+ }
+ MEM_freeN(process.indices);
- for (uint a = 0; a < process.curvertex; a++) {
- normalize_v3(process.no[a]);
+ for (int i = 0; i < mesh->totvert; i++) {
+ normalize_v3(process.no[i]);
}
+ mesh->runtime.vert_normals = process.no;
+ BKE_mesh_vertex_normals_clear_dirty(mesh);
- dl->verts = (float *)process.co;
- dl->nors = (float *)process.no;
+ mesh->totloop = loop_offset;
- freepolygonize(&process);
- BKE_mesh_update_customdata_pointers(mesh, false);
-
+ BKE_mesh_calc_edges(mesh, false, false);
+
+ return mesh;
}
diff --cc source/blender/blenkernel/intern/mesh.cc
index 976ffc6ee7e,7f2c09f049b..b349770b1e2
--- a/source/blender/blenkernel/intern/mesh.cc
+++ b/source/blender/blenkernel/intern/mesh.cc
@@@ -241,16 -246,19 +242,23 @@@ static void mesh_blend_write(BlendWrite
memset(&mesh->pdata, 0, sizeof(mesh->pdata));
}
else {
- CustomData_blend_write_prepare(mesh->vdata, vert_layers);
- CustomData_blend_write_prepare(mesh->edata, edge_layers);
- CustomData_blend_write_prepare(mesh->ldata, loop_layers);
- CustomData_blend_write_prepare(mesh->pdata, poly_layers);
+ Set<std::string> names_to_skip;
+ if (!BLO_write_is_undo(writer)) {
+ BKE_mesh_legacy_convert_hide_layers_to_flags(mesh);
+ /* When converting to the old mesh format, don't save redunant attributes. */
+ names_to_skip.add_multiple_new({".hide_vert", ".hide_edge", ".hide_poly"});
+ }
+
+ CustomData_blend_write_prepare(mesh->vdata, vert_layers, names_to_skip);
+ CustomData_blend_write_prepare(mesh->edata, edge_layers, names_to_skip);
+ CustomData_blend_write_prepare(mesh->ldata, loop_layers, names_to_skip);
+ CustomData_blend_write_prepare(mesh->pdata, poly_layers, names_to_skip);
}
+ if (!BLO_write_is_undo(writer)) {
+ BKE_mesh_legacy_convert_hide_layers_to_flags(mesh);
+ }
+
BLO_write_id_struct(writer, Mesh, id_address, &mesh->id);
BKE_id_blend_write(writer, &mesh->id);
diff --cc source/blender/blenkernel/intern/mesh_convert.cc
index 6b866be328f,3806ea76cfe..6af41b5dfff
--- a/source/blender/blenkernel/intern/mesh_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_convert.cc
@@@ -135,14 -81,17 +81,17 @@@ static void make_edges_mdata_extend(Mes
const MPoly *mp;
int i;
- eh_reserve = max_ii(totedge, BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(totpoly));
- eh = BLI_edgehash_new_ex(__func__, eh_reserve);
- Span<MPoly> polys(mesh.mpoly, mesh.totpoly);
- MutableSpan<MLoop> loops(mesh.mloop, mesh.totloop);
++ Span<MPoly> polys = blender::bke::mesh_polygons(mesh);
++ MutableSpan<MLoop> loops = blender::bke::mesh_loops_for_write(mesh);
+
+ const int eh_reserve = max_ii(totedge, BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(mesh.totpoly));
+ EdgeHash *eh = BLI_edgehash_new_ex(__func__, eh_reserve);
- for (i = 0, mp = mpoly; i < totpoly; i++, mp++) {
- BKE_mesh_poly_edgehash_insert(eh, mp, mloop + mp->loopstart);
+ for (const MPoly &poly : polys) {
+ BKE_mesh_poly_edgehash_insert(eh, &poly, &loops[poly.loopstart]);
}
- totedge_new = BLI_edgehash_len(eh);
+ const int totedge_new = BLI_edgehash_len(eh);
#ifdef DEBUG
/* ensure that there's no overlap! */
@@@ -155,19 -104,15 +104,14 @@@
#endif
if (totedge_new) {
- EdgeHashIterator *ehi;
- MEdge *medge;
- uint e_index = totedge;
+ CustomData_realloc(&mesh.edata, totedge + totedge_new);
- BKE_mesh_update_customdata_pointers(&mesh, false);
- *r_alledge = medge = (MEdge *)(*r_alledge ?
- MEM_reallocN(*r_alledge,
- sizeof(MEdge) * (totedge + totedge_new)) :
- MEM_calloc_arrayN(totedge_new, sizeof(MEdge), __func__));
- medge += totedge;
- MEdge *medge = mesh.medge + totedge;
++ MEdge *medge = &blender::bke::mesh_edges_for_write(mesh)[totedge];
- totedge += totedge_new;
+ mesh.totedge += totedge_new;
- /* --- */
+ EdgeHashIterator *ehi;
+ uint e_index = totedge;
for (ehi = BLI_edgehashIterator_new(eh); BLI_edgehashIterator_isDone(ehi) == false;
BLI_edgehashIterator_step(ehi), ++medge, e_index++) {
BLI_edgehashIterator_getKey(ehi, &medge->v1, &medge->v2);
@@@ -178,10 -123,8 +122,8 @@@
}
BLI_edgehashIterator_free(ehi);
- *r_totedge = totedge;
-
- for (i = 0, mp = mpoly; i < totpoly; i++, mp++) {
- MLoop *l = &mloop[mp->loopstart];
- for (i = 0, mp = mesh.mpoly; i < mesh.totpoly; i++, mp++) {
++ for (i = 0, mp = polys.data(); i < mesh.totpoly; i++, mp++) {
+ MLoop *l = &loops[mp->loopstart];
MLoop *l_prev = (l + (mp->totloop - 1));
int j;
for (j = 0; j < mp->totloop; j++, l++) {
@@@ -255,21 -181,21 +180,21 @@@ static Mesh *mesh_nurbs_displist_to_mes
}
if (totvert == 0) {
- /* Make Sure you check ob->data is a curve. */
- // error("can't convert");
- return -1;
+ return BKE_mesh_new_nomain(0, 0, 0, 0, 0);
}
- *r_allvert = mvert = (MVert *)MEM_calloc_arrayN(totvert, sizeof(MVert), "nurbs_init mvert");
- *r_alledge = medge = (MEdge *)MEM_calloc_arrayN(totedge, sizeof(MEdge), "nurbs_init medge");
- *r_allloop = mloop = (MLoop *)MEM_calloc_arrayN(
- totpoly, sizeof(MLoop[4]), "nurbs_init mloop"); /* totloop */
- *r_allpoly = mpoly = (MPoly *)MEM_calloc_arrayN(totpoly, sizeof(MPoly), "nurbs_init mloop");
+ Mesh *mesh = BKE_mesh_new_nomain(totvert, totedge, 0, totloop, totpoly);
- MutableSpan<MVert> verts(mesh->mvert, mesh->totvert);
- MutableSpan<MEdge> edges(mesh->medge, mesh->totedge);
- MutableSpan<MPoly> polys(mesh->mpoly, mesh->totpoly);
- MutableSpan<MLoop> loops(mesh->mloop, mesh->totloop);
++ MutableSpan<MVert> verts = blender::bke::mesh_vertices_for_write(*mesh);
++ MutableSpan<MEdge> edges = blender::bke::mesh_edges_for_write(*mesh);
++ MutableSpan<MPoly> polys = blender::bke::mesh_polygons_for_write(*mesh);
++ MutableSpan<MLoop> loops = blender::bke::mesh_loops_for_write(*mesh);
- if (r_alluv) {
- *r_alluv = mloopuv = (MLoopUV *)MEM_calloc_arrayN(
- totpoly, sizeof(MLoopUV[4]), "nurbs_init mloopuv");
- }
+ MVert *mvert = verts.data();
+ MEdge *medge = edges.data();
+ MPoly *mpoly = polys.data();
+ MLoop *mloop = loops.data();
+ MLoopUV *mloopuv = static_cast<MLoopUV *>(CustomData_add_layer_named(
+ &mesh->ldata, CD_MLOOPUV, CD_CALLOC, nullptr, mesh->totloop, "UVMap"));
/* verts and faces */
vertcount = 0;
diff --cc source/blender/blenkernel/intern/mesh_evaluate.cc
index 38ffae55f54,9dba8eab340..6583436905f
--- a/source/blender/blenkernel/intern/mesh_evaluate.cc
+++ b/source/blender/blenkernel/intern/mesh_evaluate.cc
@@@ -746,8 -748,9 +746,9 @@@ void BKE_mesh_flush_hidden_from_verts(M
return;
}
const VArraySpan<bool> hide_vert_span{hide_vert};
- const Span<MEdge> edges(me->medge, me->totedge);
- const Span<MPoly>
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list