Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/mesh/editmesh_utils.c
| Show First 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | |||||
| #include "BKE_object.h" /* XXX. only for EDBM_mesh_load(). */ | #include "BKE_object.h" /* XXX. only for EDBM_mesh_load(). */ | ||||
| #include "WM_api.h" | #include "WM_api.h" | ||||
| #include "WM_types.h" | #include "WM_types.h" | ||||
| #include "ED_mesh.h" | #include "ED_mesh.h" | ||||
| #include "ED_screen.h" | #include "ED_screen.h" | ||||
| #include "ED_uvedit.h" | |||||
| #include "ED_view3d.h" | #include "ED_view3d.h" | ||||
| #include "mesh_intern.h" /* own include */ | #include "mesh_intern.h" /* own include */ | ||||
| /* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
| /** \name Redo API | /** \name Redo API | ||||
| * \{ */ | * \{ */ | ||||
| ▲ Show 20 Lines • Show All 595 Lines • ▼ Show 20 Lines | |||||
| UvMapVert *BM_uv_vert_map_at_index(UvVertMap *vmap, unsigned int v) | UvMapVert *BM_uv_vert_map_at_index(UvVertMap *vmap, unsigned int v) | ||||
| { | { | ||||
| return vmap->vert[v]; | return vmap->vert[v]; | ||||
| } | } | ||||
| /* A specialized vert map used by stitch operator */ | /* A specialized vert map used by stitch operator */ | ||||
| UvElementMap *BM_uv_element_map_create(BMesh *bm, | UvElementMap *BM_uv_element_map_create(BMesh *bm, | ||||
| const bool selected, | const Scene *scene, | ||||
| const bool face_selected, | |||||
| const bool uv_selected, | |||||
| const bool use_winding, | const bool use_winding, | ||||
| const bool do_islands) | const bool do_islands) | ||||
| { | { | ||||
| BMVert *ev; | BMVert *ev; | ||||
| BMFace *efa; | BMFace *efa; | ||||
| BMLoop *l; | BMLoop *l; | ||||
| BMIter iter, liter; | BMIter iter, liter; | ||||
| /* vars from original func */ | /* vars from original func */ | ||||
| Show All 10 Lines | UvElementMap *BM_uv_element_map_create(BMesh *bm, | ||||
| BM_mesh_elem_index_ensure(bm, BM_VERT | BM_FACE); | BM_mesh_elem_index_ensure(bm, BM_VERT | BM_FACE); | ||||
| totfaces = bm->totface; | totfaces = bm->totface; | ||||
| totverts = bm->totvert; | totverts = bm->totvert; | ||||
| totuv = 0; | totuv = 0; | ||||
| /* generate UvElement array */ | /* generate UvElement array */ | ||||
| BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) { | BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) { | ||||
| if (!selected || BM_elem_flag_test(efa, BM_ELEM_SELECT)) { | if (!face_selected || BM_elem_flag_test(efa, BM_ELEM_SELECT)) { | ||||
| if (!uv_selected) { | |||||
| totuv += efa->len; | totuv += efa->len; | ||||
| } | } | ||||
| else { | |||||
| BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { | |||||
| if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) { | |||||
| totuv++; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | } | ||||
| if (totuv == 0) { | if (totuv == 0) { | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| element_map = (UvElementMap *)MEM_callocN(sizeof(*element_map), "UvElementMap"); | element_map = (UvElementMap *)MEM_callocN(sizeof(*element_map), "UvElementMap"); | ||||
| element_map->totalUVs = totuv; | element_map->totalUVs = totuv; | ||||
| element_map->vert = (UvElement **)MEM_callocN(sizeof(*element_map->vert) * totverts, | element_map->vert = (UvElement **)MEM_callocN(sizeof(*element_map->vert) * totverts, | ||||
| "UvElementVerts"); | "UvElementVerts"); | ||||
| buf = element_map->buf = (UvElement *)MEM_callocN(sizeof(*element_map->buf) * totuv, | buf = element_map->buf = (UvElement *)MEM_callocN(sizeof(*element_map->buf) * totuv, | ||||
| "UvElement"); | "UvElement"); | ||||
| if (use_winding) { | if (use_winding) { | ||||
| winding = MEM_mallocN(sizeof(*winding) * totfaces, "winding"); | winding = MEM_mallocN(sizeof(*winding) * totfaces, "winding"); | ||||
| } | } | ||||
| BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, j) { | BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, j) { | ||||
| if (use_winding) { | if (use_winding) { | ||||
| winding[j] = false; | winding[j] = false; | ||||
| } | } | ||||
| if (!selected || BM_elem_flag_test(efa, BM_ELEM_SELECT)) { | if (!face_selected || BM_elem_flag_test(efa, BM_ELEM_SELECT)) { | ||||
| float(*tf_uv)[2] = NULL; | float(*tf_uv)[2] = NULL; | ||||
| if (use_winding) { | if (use_winding) { | ||||
| tf_uv = (float(*)[2])BLI_buffer_reinit_data(&tf_uv_buf, vec2f, efa->len); | tf_uv = (float(*)[2])BLI_buffer_reinit_data(&tf_uv_buf, vec2f, efa->len); | ||||
| } | } | ||||
| BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) { | BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) { | ||||
| if (uv_selected && !uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) { | |||||
| continue; | |||||
| } | |||||
| buf->l = l; | buf->l = l; | ||||
| buf->separate = 0; | buf->separate = 0; | ||||
| buf->island = INVALID_ISLAND; | buf->island = INVALID_ISLAND; | ||||
| buf->loop_of_poly_index = i; | buf->loop_of_poly_index = i; | ||||
| buf->next = element_map->vert[BM_elem_index_get(l->v)]; | buf->next = element_map->vert[BM_elem_index_get(l->v)]; | ||||
| element_map->vert[BM_elem_index_get(l->v)] = buf; | element_map->vert[BM_elem_index_get(l->v)] = buf; | ||||
| ▲ Show 20 Lines • Show All 93 Lines • ▼ Show 20 Lines | for (i = 0; i < totuv; i++) { | ||||
| stack[0] = element_map->buf[i].l->f; | stack[0] = element_map->buf[i].l->f; | ||||
| island_number[BM_elem_index_get(stack[0])] = nislands; | island_number[BM_elem_index_get(stack[0])] = nislands; | ||||
| stacksize = 1; | stacksize = 1; | ||||
| while (stacksize > 0) { | while (stacksize > 0) { | ||||
| efa = stack[--stacksize]; | efa = stack[--stacksize]; | ||||
| BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { | BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { | ||||
| if (uv_selected && !uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) { | |||||
| continue; | |||||
| } | |||||
| UvElement *element, *initelement = element_map->vert[BM_elem_index_get(l->v)]; | UvElement *element, *initelement = element_map->vert[BM_elem_index_get(l->v)]; | ||||
| for (element = initelement; element; element = element->next) { | for (element = initelement; element; element = element->next) { | ||||
| if (element->separate) { | if (element->separate) { | ||||
| initelement = element; | initelement = element; | ||||
| } | } | ||||
| if (element->l->f == efa) { | if (element->l->f == efa) { | ||||
| ▲ Show 20 Lines • Show All 767 Lines • Show Last 20 Lines | |||||