[Bf-blender-cvs] [0709fac41ef] blender2.8: BKE_mesh: add a utility to get edge indices from looptri.

Alexander Gavrilov noreply at git.blender.org
Tue Nov 6 19:23:01 CET 2018


Commit: 0709fac41ef0a20955069fcd6609577189e96d5c
Author: Alexander Gavrilov
Date:   Sat Oct 20 21:02:52 2018 +0300
Branches: blender2.8
https://developer.blender.org/rB0709fac41ef0a20955069fcd6609577189e96d5c

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.

===================================================================

M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/intern/mesh.c
M	source/blender/makesdna/DNA_meshdata_types.h

===================================================================

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 {



More information about the Bf-blender-cvs mailing list