bmesh utility functions for storing an editselection after another in the list.

This commit is contained in:
Campbell Barton
2013-08-14 09:13:11 +00:00
parent 723eaa36ce
commit 731672fc9b
2 changed files with 29 additions and 9 deletions

View File

@@ -816,6 +816,13 @@ void BM_editselection_plane(BMEditSelection *ese, float r_plane[3])
} }
} }
static BMEditSelection *bm_select_history_create(BMHeader *ele)
{
BMEditSelection *ese = (BMEditSelection *) MEM_callocN(sizeof(BMEditSelection), "BMEdit Selection");
ese->htype = ele->htype;
ese->ele = (BMElem *)ele;
return ese;
}
/* --- macro wrapped funcs --- */ /* --- macro wrapped funcs --- */
bool _bm_select_history_check(BMesh *bm, const BMHeader *ele) bool _bm_select_history_check(BMesh *bm, const BMHeader *ele)
@@ -837,9 +844,7 @@ bool _bm_select_history_remove(BMesh *bm, BMHeader *ele)
void _bm_select_history_store_notest(BMesh *bm, BMHeader *ele) void _bm_select_history_store_notest(BMesh *bm, BMHeader *ele)
{ {
BMEditSelection *ese = (BMEditSelection *) MEM_callocN(sizeof(BMEditSelection), "BMEdit Selection"); BMEditSelection *ese = bm_select_history_create(ele);
ese->htype = ele->htype;
ese->ele = (BMElem *)ele;
BLI_addtail(&(bm->selected), ese); BLI_addtail(&(bm->selected), ese);
} }
@@ -849,6 +854,20 @@ void _bm_select_history_store(BMesh *bm, BMHeader *ele)
BM_select_history_store_notest(bm, (BMElem *)ele); BM_select_history_store_notest(bm, (BMElem *)ele);
} }
} }
void _bm_select_history_store_after_notest(BMesh *bm, BMEditSelection *ese_ref, BMHeader *ele)
{
BMEditSelection *ese = bm_select_history_create(ele);
BLI_insertlinkafter(&(bm->selected), ese_ref, ese);
}
void _bm_select_history_store_after(BMesh *bm, BMEditSelection *ese_ref, BMHeader *ele)
{
if (!BM_select_history_check(bm, (BMElem *)ele)) {
BM_select_history_store_after_notest(bm, ese_ref, (BMElem *)ele);
}
}
/* --- end macro wrapped funcs --- */ /* --- end macro wrapped funcs --- */
@@ -861,16 +880,13 @@ void BM_select_history_clear(BMesh *bm)
void BM_select_history_validate(BMesh *bm) void BM_select_history_validate(BMesh *bm)
{ {
BMEditSelection *ese, *nextese; BMEditSelection *ese, *ese_next;
ese = bm->selected.first; for (ese = bm->selected.first; ese; ese = ese_next) {
ese_next = ese->next;
while (ese) {
nextese = ese->next;
if (!BM_elem_flag_test(ese->ele, BM_ELEM_SELECT)) { if (!BM_elem_flag_test(ese->ele, BM_ELEM_SELECT)) {
BLI_freelinkN(&(bm->selected), ese); BLI_freelinkN(&(bm->selected), ese);
} }
ese = nextese;
} }
} }

View File

@@ -87,11 +87,15 @@ void BM_editselection_plane(BMEditSelection *ese, float r_plane[3]);
#define BM_select_history_remove(bm, ele) _bm_select_history_remove(bm, &(ele)->head) #define BM_select_history_remove(bm, ele) _bm_select_history_remove(bm, &(ele)->head)
#define BM_select_history_store_notest(bm, ele) _bm_select_history_store_notest(bm, &(ele)->head) #define BM_select_history_store_notest(bm, ele) _bm_select_history_store_notest(bm, &(ele)->head)
#define BM_select_history_store(bm, ele) _bm_select_history_store(bm, &(ele)->head) #define BM_select_history_store(bm, ele) _bm_select_history_store(bm, &(ele)->head)
#define BM_select_history_store_after_notest(bm, ese_ref, ele) _bm_select_history_store_after_notest(bm, ese_ref, &(ele)->head)
#define BM_select_history_store_after(bm, ese, ese_ref) _bm_select_history_store_after(bm, ese_ref, &(ele)->head)
bool _bm_select_history_check(BMesh *bm, const BMHeader *ele); bool _bm_select_history_check(BMesh *bm, const BMHeader *ele);
bool _bm_select_history_remove(BMesh *bm, BMHeader *ele); bool _bm_select_history_remove(BMesh *bm, BMHeader *ele);
void _bm_select_history_store_notest(BMesh *bm, BMHeader *ele); void _bm_select_history_store_notest(BMesh *bm, BMHeader *ele);
void _bm_select_history_store(BMesh *bm, BMHeader *ele); void _bm_select_history_store(BMesh *bm, BMHeader *ele);
void _bm_select_history_store_after(BMesh *bm, BMEditSelection *ese_ref, BMHeader *ele);
void _bm_select_history_store_after_notest(BMesh *bm, BMEditSelection *ese_ref, BMHeader *ele);
void BM_select_history_validate(BMesh *bm); void BM_select_history_validate(BMesh *bm);
void BM_select_history_clear(BMesh *em); void BM_select_history_clear(BMesh *em);