add function for rotating linked list so at item is last.

This commit is contained in:
Campbell Barton 2013-09-05 11:40:38 +00:00
parent 8f49054b77
commit 2e0422b17f
6 changed files with 29 additions and 13 deletions

View File

@ -74,7 +74,8 @@ void BLI_freelinkN(struct ListBase *listbase, void *vlink);
void BLI_movelisttolist(struct ListBase *dst, struct ListBase *src);
void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src);
void BLI_reverselist(struct ListBase *lb);
void BLI_rotatelist(struct ListBase *lb, void *vlink);
void BLI_rotatelist_first(struct ListBase *lb, void *vlink);
void BLI_rotatelist_last(struct ListBase *lb, void *vlink);
/* create a generic list node containing link to provided data */
struct LinkData *BLI_genericNodeN(void *data);

View File

@ -581,19 +581,34 @@ void BLI_reverselist(ListBase *lb)
/**
* \param vlink Link to make first.
*/
void BLI_rotatelist(ListBase *lb, void *vlink)
void BLI_rotatelist_first(ListBase *lb, void *vlink)
{
/* make circular */
((LinkData *)lb->first)->prev = lb->last;
((LinkData *)lb->last)->next = lb->first;
((Link *)lb->first)->prev = lb->last;
((Link *)lb->last)->next = lb->first;
lb->first = vlink;
lb->last = ((LinkData *)vlink)->prev;
lb->last = ((Link *)vlink)->prev;
((LinkData *)lb->first)->prev = NULL;
((LinkData *)lb->last)->next = NULL;
((Link *)lb->first)->prev = NULL;
((Link *)lb->last)->next = NULL;
}
/**
* \param vlink Link to make last.
*/
void BLI_rotatelist_last(ListBase *lb, void *vlink)
{
/* make circular */
((Link *)lb->first)->prev = lb->last;
((Link *)lb->last)->next = lb->first;
lb->first = ((Link *)vlink)->next;
lb->last = vlink;
((Link *)lb->first)->prev = NULL;
((Link *)lb->last)->next = NULL;
}
/* create a generic list node containing link to provided data */
LinkData *BLI_genericNodeN(void *data)

View File

@ -121,7 +121,7 @@ static void bm_bridge_best_rotation(struct BMEdgeLoopStore *el_store_a, struct B
}
if (el_b_best) {
BLI_rotatelist(lb_b, el_b_best);
BLI_rotatelist_first(lb_b, el_b_best);
}
}
@ -274,7 +274,7 @@ static void bridge_loop_pair(BMesh *bm,
const int len_b = BM_edgeloop_length_get(el_store_b);
ListBase *lb_b = BM_edgeloop_verts_get(el_store_b);
LinkData *el_b = BLI_rfindlink(lb_b, positive_mod(twist_offset, len_b));
BLI_rotatelist(lb_b, el_b);
BLI_rotatelist_first(lb_b, el_b);
}
}

View File

@ -919,13 +919,13 @@ static void bm_edgering_pair_order(BMesh *bm,
}
BLI_assert(node != NULL);
BLI_rotatelist(lb_b, node);
BLI_rotatelist_first(lb_b, node);
/* now check we are winding the same way */
if (bm_edgering_pair_order_is_flipped(bm, el_store_a, el_store_b)) {
BM_edgeloop_flip(bm, el_store_b);
/* re-ensure the first node */
BLI_rotatelist(lb_b, node);
BLI_rotatelist_first(lb_b, node);
}
/* sanity checks that we are aligned & winding now */

View File

@ -2913,7 +2913,7 @@ static void edbm_fill_grid_prepare(BMesh *bm, int span, int offset)
}
/* set this vertex first */
BLI_rotatelist(verts, v_act_link);
BLI_rotatelist_first(verts, v_act_link);
BM_edgeloop_edges_get(el_store, edges);
/* un-flag 'rails' */

View File

@ -785,7 +785,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op)
}
if (ctx_ob_act) {
BLI_rotatelist(&ctx_data_list, (LinkData *)ctx_ob_act);
BLI_rotatelist_first(&ctx_data_list, (LinkData *)ctx_ob_act);
}
for (tob = bmain->object.first; tob; tob = tob->id.next) {