diff options
author | Alexander Gavrilov <angavrilov@gmail.com> | 2018-10-20 21:02:52 +0300 |
---|---|---|
committer | Alexander Gavrilov <angavrilov@gmail.com> | 2018-11-06 21:20:17 +0300 |
commit | 0709fac41ef0a20955069fcd6609577189e96d5c (patch) | |
tree | c7f6f7e993ccf7bf1fda3ec37f42dc5b2650f045 | |
parent | 84fa806491cd6485847140424a87d14ea135d2e7 (diff) |
BKE_mesh: add a utility to get edge indices from looptri.
Not all three sides of a tesselated mesh triangle are guaranteed
to be original mesh edges, so a somewhat complicated check is
required to detect which ones are real. It seems that until now
there was no utility function for that, only some example code.
-rw-r--r-- | source/blender/blenkernel/BKE_mesh.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 15 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_meshdata_types.h | 2 |
3 files changed, 18 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index 56241a19221..3d5a33f9972 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -105,6 +105,7 @@ int poly_get_adj_loops_from_vert( unsigned int r_adj[2]); int BKE_mesh_edge_other_vert(const struct MEdge *e, int v); +void BKE_mesh_looptri_get_real_edges(const struct Mesh *mesh, const struct MLoopTri *looptri, int r_edges[3]); void BKE_mesh_free(struct Mesh *me); void BKE_mesh_init(struct Mesh *me); diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 8e1ea219ee3..ed01889d200 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -1270,6 +1270,21 @@ int BKE_mesh_edge_other_vert(const MEdge *e, int v) return -1; } +/** + * Sets each output array element to the edge index if it is a real edge, or -1. + */ +void BKE_mesh_looptri_get_real_edges(const Mesh *mesh, const MLoopTri *looptri, int r_edges[3]) +{ + for (int i = 2, i_next = 0; i_next < 3; i = i_next++) { + const MLoop *l1 = &mesh->mloop[looptri->tri[i]], *l2 = &mesh->mloop[looptri->tri[i_next]]; + const MEdge *e = &mesh->medge[l1->e]; + + bool is_real = (l1->v == e->v1 && l2->v == e->v2) || (l1->v == e->v2 && l2->v == e->v1); + + r_edges[i] = is_real ? l1->e : -1; + } +} + /* basic vertex data functions */ bool BKE_mesh_minmax(const Mesh *me, float r_min[3], float r_max[3]) { diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h index 636377ffd36..8525f9d0334 100644 --- a/source/blender/makesdna/DNA_meshdata_types.h +++ b/source/blender/makesdna/DNA_meshdata_types.h @@ -172,6 +172,8 @@ typedef struct MLoop { * } * \endcode * + * See #BKE_mesh_looptri_get_real_edges for a utility that does this. + * * \note A #MLoopTri may be in the middle of an ngon and not reference **any** edges. */ typedef struct MLoopTri { |