Utility function to get poly -> looptri mapping
authorCampbell Barton <ideasman42@gmail.com>
Thu, 23 Jul 2015 05:08:27 +0000 (15:08 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 23 Jul 2015 05:08:27 +0000 (15:08 +1000)
source/blender/blenkernel/BKE_mesh_mapping.h
source/blender/blenkernel/intern/mesh_mapping.c

index 633bd8a..c8a1700 100644 (file)
@@ -36,6 +36,7 @@ struct MEdge;
 struct MPoly;
 struct MLoop;
 struct MLoopUV;
+struct MLoopTri;
 
 /* map from uv vertex to face (for select linked, stitch, uv suburf) */
 
@@ -127,7 +128,10 @@ void BKE_mesh_origindex_map_create(
         MeshElemMap **r_map, int **r_mem,
         const int totorig,
         const int *final_origindex, const int totfinal);
-
+void BKE_mesh_origindex_map_create_looptri(
+        MeshElemMap **r_map, int **r_mem,
+        const struct MPoly *mpoly, const int mpoly_num,
+        const struct MLoopTri *looptri, const int looptri_num);
 
 /* islands */
 
index 1d89785..c03f1fe 100644 (file)
@@ -406,6 +406,37 @@ void BKE_mesh_origindex_map_create(MeshElemMap **r_map, int **r_mem,
        *r_mem = indices;
 }
 
+/**
+ * A version of #BKE_mesh_origindex_map_create that takes a looptri array.
+ * Making a poly -> looptri map.
+ */
+void BKE_mesh_origindex_map_create_looptri(
+        MeshElemMap **r_map, int **r_mem,
+        const MPoly *mpoly, const int mpoly_num,
+        const MLoopTri *looptri, const int looptri_num)
+{
+       MeshElemMap *map = MEM_callocN(sizeof(MeshElemMap) * (size_t)mpoly_num, "poly-tessface map");
+       int *indices = MEM_mallocN(sizeof(int) * (size_t)looptri_num, "poly-tessface map mem");
+       int *index_step;
+       int i;
+
+       /* create offsets */
+       index_step = indices;
+       for (i = 0; i < mpoly_num; i++) {
+               map[i].indices = index_step;
+               index_step += ME_POLY_TRI_TOT(&mpoly[i]);
+       }
+
+       /* assign poly-tessface users */
+       for (i = 0; i < looptri_num; i++) {
+               MeshElemMap *map_ele = &map[looptri[i].poly];
+               map_ele->indices[map_ele->count++] = i;
+       }
+
+       *r_map = map;
+       *r_mem = indices;
+}
+
 /** \} */