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 /source/blender/blenkernel | |
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.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_mesh.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 15 |
2 files changed, 16 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]) { |