From f04f9cc3d02168ce6ef779954f9db39c8c734775 Mon Sep 17 00:00:00 2001 From: Chris Blackbourn Date: Wed, 9 Nov 2022 11:42:30 +1300 Subject: Cleanup: add unique_index_table to UvElementMap In anticipation of UV Copy+Paste, we need fast access to indices of unique UvElements. Can also be used to improve performance and simplify code for UV Sculpt tools and UV Stitch. No user visible changes expected. Maniphest Tasks: T77911 See also: D16278 --- source/blender/editors/mesh/editmesh_utils.c | 39 ++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'source/blender/editors/mesh/editmesh_utils.c') diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c index f6ffbec094e..33162cd2256 100644 --- a/source/blender/editors/mesh/editmesh_utils.c +++ b/source/blender/editors/mesh/editmesh_utils.c @@ -619,6 +619,44 @@ struct UvElement **BM_uv_element_map_ensure_head_table(struct UvElementMap *elem return element_map->head_table; } +int **BM_uv_element_map_ensure_unique_index(struct UvElementMap *element_map) +{ + if (!element_map->unique_index_table) { + element_map->unique_index_table = MEM_callocN( + element_map->total_uvs * sizeof(*element_map->unique_index_table), __func__); + + int j = 0; + for (int i = 0; i < element_map->total_uvs; i++) { + UvElement *element = element_map->storage + i; + if (!element->separate) { + continue; + } + BLI_assert(0 <= j); + BLI_assert(j < element_map->total_unique_uvs); + while (element) { + element_map->unique_index_table[element - element_map->storage] = j; + element = element->next; + if (!element || element->separate) { + break; + } + } + j++; + } + BLI_assert(j == element_map->total_unique_uvs); + } + + return element_map->unique_index_table; +} + +int BM_uv_element_get_unique_index(struct UvElementMap *element_map, struct UvElement *child) +{ + int **unique_index = BM_uv_element_map_ensure_unique_index(element_map); + int index = child - element_map->storage; + BLI_assert(0 <= index); + BLI_assert(index < element_map->total_uvs); + return unique_index[index]; +} + #define INVALID_ISLAND ((uint)-1) static void bm_uv_assign_island(UvElementMap *element_map, @@ -1163,6 +1201,7 @@ void BM_uv_element_map_free(UvElementMap *element_map) MEM_SAFE_FREE(element_map->storage); MEM_SAFE_FREE(element_map->vertex); MEM_SAFE_FREE(element_map->head_table); + MEM_SAFE_FREE(element_map->unique_index_table); MEM_SAFE_FREE(element_map->island_indices); MEM_SAFE_FREE(element_map->island_total_uvs); MEM_SAFE_FREE(element_map->island_total_unique_uvs); -- cgit v1.2.3 From 2d9d08677ecfa2684a67c39ab1d632865716ccb4 Mon Sep 17 00:00:00 2001 From: Chris Blackbourn Date: Wed, 9 Nov 2022 14:54:37 +1300 Subject: Cleanup: fix types from f04f9cc3d021 --- source/blender/editors/mesh/editmesh_utils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source/blender/editors/mesh/editmesh_utils.c') diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c index 33162cd2256..bbc092d0a99 100644 --- a/source/blender/editors/mesh/editmesh_utils.c +++ b/source/blender/editors/mesh/editmesh_utils.c @@ -619,7 +619,7 @@ struct UvElement **BM_uv_element_map_ensure_head_table(struct UvElementMap *elem return element_map->head_table; } -int **BM_uv_element_map_ensure_unique_index(struct UvElementMap *element_map) +int *BM_uv_element_map_ensure_unique_index(struct UvElementMap *element_map) { if (!element_map->unique_index_table) { element_map->unique_index_table = MEM_callocN( @@ -650,7 +650,7 @@ int **BM_uv_element_map_ensure_unique_index(struct UvElementMap *element_map) int BM_uv_element_get_unique_index(struct UvElementMap *element_map, struct UvElement *child) { - int **unique_index = BM_uv_element_map_ensure_unique_index(element_map); + int *unique_index = BM_uv_element_map_ensure_unique_index(element_map); int index = child - element_map->storage; BLI_assert(0 <= index); BLI_assert(index < element_map->total_uvs); -- cgit v1.2.3