[Bf-blender-cvs] [38c51e1ce97] refactor-mesh-corners-generic: All uses of MLoop besides BKE_mesh_merge_verts removed
Hans Goudey
noreply at git.blender.org
Tue Dec 6 23:29:22 CET 2022
Commit: 38c51e1ce97b760ee57c16f76f50988d82f9367c
Author: Hans Goudey
Date: Tue Dec 6 16:23:54 2022 -0600
Branches: refactor-mesh-corners-generic
https://developer.blender.org/rB38c51e1ce97b760ee57c16f76f50988d82f9367c
All uses of MLoop besides BKE_mesh_merge_verts removed
===================================================================
M source/blender/blenkernel/BKE_DerivedMesh.h
M source/blender/blenkernel/intern/DerivedMesh.cc
M source/blender/blenkernel/intern/cdderivedmesh.c
M source/blender/blenkernel/intern/customdata.cc
M source/blender/blenkernel/intern/mesh_legacy_convert.cc
M source/blender/blenkernel/intern/subsurf_ccg.c
M source/blender/render/intern/texture_margin.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 75b51552bb6..667a3ab4612 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -138,7 +138,8 @@ struct DerivedMesh {
*/
void (*copyVertArray)(DerivedMesh *dm, float (*r_positions)[3]);
void (*copyEdgeArray)(DerivedMesh *dm, struct MEdge *r_edge);
- void (*copyLoopArray)(DerivedMesh *dm, struct MLoop *r_loop);
+ void (*copyCornerVertArray)(DerivedMesh *dm, int *r_corner_verts);
+ void (*copyCornerEdgeArray)(DerivedMesh *dm, int *r_corner_edges);
void (*copyPolyArray)(DerivedMesh *dm, struct MPoly *r_poly);
/** Return a pointer to the entire array of vert/edge/face custom data
diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc
index ccc69d33235..a779c0b5f07 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.cc
+++ b/source/blender/blenkernel/intern/DerivedMesh.cc
@@ -121,18 +121,32 @@ static MEdge *dm_getEdgeArray(DerivedMesh *dm)
return medge;
}
-static MLoop *dm_getLoopArray(DerivedMesh *dm)
+static int *dm_getCornerVertArray(DerivedMesh *dm)
{
- MLoop *mloop = (MLoop *)CustomData_get_layer(&dm->loopData, CD_MLOOP);
+ int *corner_verts = (int *)CustomData_get_layer(&dm->loopData, CD_MLOOP);
- if (!mloop) {
- mloop = (MLoop *)CustomData_add_layer(
+ if (!corner_verts) {
+ corner_verts = (int *)CustomData_add_layer(
&dm->loopData, CD_MLOOP, CD_SET_DEFAULT, nullptr, dm->getNumLoops(dm));
CustomData_set_layer_flag(&dm->loopData, CD_MLOOP, CD_FLAG_TEMPORARY);
- dm->copyLoopArray(dm, mloop);
+ dm->copyCornerVertArray(dm, corner_verts);
}
- return mloop;
+ return corner_verts;
+}
+
+static int *dm_getCornerEdgeArray(DerivedMesh *dm)
+{
+ int *corner_edges = (int *)CustomData_get_layer(&dm->loopData, CD_MLOOP);
+
+ if (!corner_edges) {
+ corner_edges = (int *)CustomData_add_layer(
+ &dm->loopData, CD_MLOOP, CD_SET_DEFAULT, nullptr, dm->getNumLoops(dm));
+ CustomData_set_layer_flag(&dm->loopData, CD_MLOOP, CD_FLAG_TEMPORARY);
+ dm->copyCornerEdgeArray(dm, corner_edges);
+ }
+
+ return corner_edges;
}
static MPoly *dm_getPolyArray(DerivedMesh *dm)
@@ -185,7 +199,8 @@ void DM_init_funcs(DerivedMesh *dm)
/* default function implementations */
dm->getVertArray = dm_getVertArray;
dm->getEdgeArray = dm_getEdgeArray;
- dm->getLoopArray = dm_getLoopArray;
+ dm->getCornerVertArray = dm_getCornerVertArray;
+ dm->getCornerEdgeArray = dm_getCornerEdgeArray;
dm->getPolyArray = dm_getPolyArray;
dm->getLoopTriArray = dm_getLoopTriArray;
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 8ca9044eec4..0d57d117d8d 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -88,10 +88,16 @@ static void cdDM_copyEdgeArray(DerivedMesh *dm, MEdge *r_edge)
memcpy(r_edge, cddm->medge, sizeof(*r_edge) * dm->numEdgeData);
}
-static void cdDM_copyLoopArray(DerivedMesh *dm, MLoop *r_loop)
+static void cdDM_copyCornerVertArray(DerivedMesh *dm, int *r_corner_verts)
{
CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
- memcpy(r_loop, cddm->mloop, sizeof(*r_loop) * dm->numLoopData);
+ memcpy(r_corner_verts, cddm->corner_verts, sizeof(*r_corner_verts) * dm->numLoopData);
+}
+
+static void cdDM_copyCornerEdgeArray(DerivedMesh *dm, int *r_corner_edges)
+{
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ memcpy(r_corner_edges, cddm->corner_edges, sizeof(*r_corner_edges) * dm->numLoopData);
}
static void cdDM_copyPolyArray(DerivedMesh *dm, MPoly *r_poly)
@@ -122,8 +128,12 @@ static void cdDM_recalc_looptri(DerivedMesh *dm)
DM_ensure_looptri_data(dm);
BLI_assert(totpoly == 0 || cddm->dm.looptris.array_wip != NULL);
- BKE_mesh_recalc_looptri(
- cddm->mloop, cddm->mpoly, cddm->positions, totloop, totpoly, cddm->dm.looptris.array_wip);
+ BKE_mesh_recalc_looptri(cddm->corner_verts,
+ cddm->mpoly,
+ cddm->positions,
+ totloop,
+ totpoly,
+ cddm->dm.looptris.array_wip);
BLI_assert(cddm->dm.looptris.array == NULL);
atomic_cas_ptr(
@@ -167,7 +177,8 @@ static CDDerivedMesh *cdDM_create(const char *desc)
dm->copyVertArray = cdDM_copyVertArray;
dm->copyEdgeArray = cdDM_copyEdgeArray;
- dm->copyLoopArray = cdDM_copyLoopArray;
+ dm->copyCornerVertArray = cdDM_copyCornerVertArray;
+ dm->copyCornerEdgeArray = cdDM_copyCornerEdgeArray;
dm->copyPolyArray = cdDM_copyPolyArray;
dm->getVertDataArray = DM_get_vert_data_layer;
@@ -223,7 +234,8 @@ static DerivedMesh *cdDM_from_mesh_ex(Mesh *mesh,
* or dirty normals. */
cddm->vert_normals = BKE_mesh_vertex_normals_ensure(mesh);
cddm->medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
- cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
+ cddm->corner_verts = CustomData_get_layer(&dm->loopData, CD_MLOOP);
+ cddm->corner_edges = CustomData_get_layer(&dm->loopData, CD_MLOOP);
cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
#if 0
cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc
index 18a81c2e732..beb54ef64a7 100644
--- a/source/blender/blenkernel/intern/customdata.cc
+++ b/source/blender/blenkernel/intern/customdata.cc
@@ -1852,7 +1852,7 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
{sizeof(MRecast), "MRecast", 1, N_("Recast"), nullptr, nullptr, nullptr, nullptr},
/* 25: CD_MPOLY */
{sizeof(MPoly), "MPoly", 1, N_("NGon Face"), nullptr, nullptr, nullptr, nullptr, nullptr},
- /* 26: CD_MLOOP */
+ /* 26: CD_MLOOP */ /* DEPRECATED*/
{sizeof(MLoop),
"MLoop",
1,
diff --git a/source/blender/blenkernel/intern/mesh_legacy_convert.cc b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
index d3e93484784..c59ab9527ab 100644
--- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
@@ -214,15 +214,14 @@ void BKE_mesh_calc_edges_legacy(Mesh *me, const bool use_old)
const Span<MVert> verts(static_cast<const MVert *>(CustomData_get_layer(&me->vdata, CD_MVERT)),
me->totvert);
const Span<MPoly> polys = me->polys();
- MutableSpan<MLoop> loops = me->loops_for_write();
mesh_calc_edges_mdata(verts.data(),
(MFace *)CustomData_get_layer(&me->fdata, CD_MFACE),
- loops.data(),
+ static_cast<MLoop *>(CustomData_get_layer(&me->ldata, CD_MLOOP)),
polys.data(),
verts.size(),
me->totface,
- loops.size(),
+ me->totloop,
polys.size(),
use_old,
&medge,
@@ -938,7 +937,8 @@ int BKE_mesh_mface_index_validate(MFace *mface, CustomData *fdata, int mfindex,
return nr;
}
-static int mesh_tessface_calc(CustomData *fdata,
+static int mesh_tessface_calc(Mesh *mesh,
+ CustomData *fdata,
CustomData *ldata,
CustomData *pdata,
float (*positions)[3],
@@ -955,7 +955,6 @@ static int mesh_tessface_calc(CustomData *fdata,
const int looptri_num = poly_to_tri_count(totpoly, totloop);
const MPoly *mp, *mpoly;
- const MLoop *ml, *mloop;
MFace *mface, *mf;
MemArena *arena = nullptr;
int *mface_to_poly_map;
@@ -964,7 +963,7 @@ static int mesh_tessface_calc(CustomData *fdata,
uint j;
mpoly = (const MPoly *)CustomData_get_layer(pdata, CD_MPOLY);
- mloop = (const MLoop *)CustomData_get_layer(ldata, CD_MLOOP);
+ const Span<int> corner_verts = mesh->corner_verts();
const int *material_indices = static_cast<const int *>(
CustomData_get_layer_named(pdata, CD_PROP_INT32, "material_index"));
@@ -997,9 +996,9 @@ static int mesh_tessface_calc(CustomData *fdata,
l1 = mp_loopstart + i1; \
l2 = mp_loopstart + i2; \
l3 = mp_loopstart + i3; \
- mf->v1 = mloop[l1].v; \
- mf->v2 = mloop[l2].v; \
- mf->v3 = mloop[l3].v; \
+ mf->v1 = corner_verts[l1]; \
+ mf->v2 = corner_verts[l2]; \
+ mf->v3 = corner_verts[l3]; \
mf->v4 = 0; \
lidx[0] = l1; \
lidx[1] = l2; \
@@ -1020,10 +1019,10 @@ static int mesh_tessface_calc(CustomData *fdata,
l2 = mp_loopstart + 1; /* EXCEPTION */ \
l3 = mp_loopstart + 2; /* EXCEPTION */ \
l4 = mp_loopstart + 3; /* EXCEPTION */ \
- mf->v1 = mloop[l1].v; \
- mf->v2 = mloop[l2].v; \
- mf->v3 = mloop[l3].v; \
- mf->v4 = mloop[l4].v; \
+ mf->v1 = corner_verts[l1]; \
+ mf->v2 = corner_verts[l2]; \
+ mf->v3 = corner_verts[l3]; \
+ mf->v4 = corner_verts[l4]; \
lidx[0] = l1; \
lidx[1] = l2; \
lidx[2] = l3; \
@@ -1070,10 +1069,10 @@ static int mesh_tessface_calc(CustomData *fdata,
zero_v3(normal);
/* Calculate the normal, flipped: to get a positive 2D cross product. */
- ml = mloop + mp_loopstart;
- co_prev = positions[ml[mp_totloop - 1].v];
- for (j = 0; j < mp_totloop; j++, ml++) {
- co_curr = positions[ml->v];
+ co_prev = positions[corner_verts[mp_loopstart + mp_totloop - 1]];
+ for (j = 0; j < mp_totloop; j++) {
+ const int vert_i = corner_verts[mp_loopstart + j];
+ co_curr = positions[vert_i];
add_newell_cross_v3_v3v3(normal, co_prev, co_curr);
co_prev = co_curr;
}
@@ -1084,9 +1083,9 @@ static int mesh_tessface_calc(CustomData *fdata,
/* Project verts to 2D. */
axis_dominant_v3_to_m3_negate(axis_mat, normal);
- ml = mloop + mp_loopstart;
- for (j = 0; j < mp_totloop; j++, ml++) {
- mul_v2_m3v3(projverts[j], axis_mat, positions[ml->v]);
+ for (j = 0; j < mp_totloop; j++) {
+ const int vert_i = corner_verts[mp_loop
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list