From 0709fac41ef0a20955069fcd6609577189e96d5c Mon Sep 17 00:00:00 2001 From: Alexander Gavrilov Date: Sat, 20 Oct 2018 21:02:52 +0300 Subject: 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. --- source/blender/blenkernel/intern/mesh.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'source/blender/blenkernel/intern/mesh.c') 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]) { -- cgit v1.2.3