diff options
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_mesh_mapping.h | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_mapping.c | 31 |
2 files changed, 36 insertions, 1 deletions
diff --git a/source/blender/blenkernel/BKE_mesh_mapping.h b/source/blender/blenkernel/BKE_mesh_mapping.h index 633bd8a2dba..c8a17008f5d 100644 --- a/source/blender/blenkernel/BKE_mesh_mapping.h +++ b/source/blender/blenkernel/BKE_mesh_mapping.h @@ -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 */ diff --git a/source/blender/blenkernel/intern/mesh_mapping.c b/source/blender/blenkernel/intern/mesh_mapping.c index 1d8978586b6..c03f1feef9c 100644 --- a/source/blender/blenkernel/intern/mesh_mapping.c +++ b/source/blender/blenkernel/intern/mesh_mapping.c @@ -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; +} + /** \} */ |