From bd6e5d20c7f4d34709b99576dce9cfa92c95227e Mon Sep 17 00:00:00 2001 From: Geoffrey Bantle Date: Thu, 28 Sep 2006 02:37:35 +0000 Subject: -> Sanity Check for Selection History Some operations like edge loop deselect would cause selection history to become invalid. Added a sanity check to countall() to try and catch these when they happen. --- source/blender/include/BIF_editmesh.h | 1 + source/blender/src/edit.c | 2 +- source/blender/src/editmesh_lib.c | 16 +++++++++++++++- 3 files changed, 17 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/include/BIF_editmesh.h b/source/blender/include/BIF_editmesh.h index 7c5554de198..fc52405198b 100644 --- a/source/blender/include/BIF_editmesh.h +++ b/source/blender/include/BIF_editmesh.h @@ -93,6 +93,7 @@ extern void EM_selectmode_flush(void); // when selection changes extern void EM_convertsel(short oldmode, short selectmode); extern void EM_remove_selection(void *data, int type); extern void EM_store_selection(void *data, int type); +extern void EM_validate_selections(void); extern int EM_nfaces_selected(void); extern int EM_nvertices_selected(void); diff --git a/source/blender/src/edit.c b/source/blender/src/edit.c index 914ddffb528..576b9c665d4 100644 --- a/source/blender/src/edit.c +++ b/source/blender/src/edit.c @@ -612,7 +612,7 @@ void countall() if(efa->f & SELECT) G.totfacesel++; } - /*add code to strip editselections*/ + EM_validate_selections(); } else if (G.obedit->type==OB_ARMATURE){ for (ebo=G.edbo.first;ebo;ebo=ebo->next){ diff --git a/source/blender/src/editmesh_lib.c b/source/blender/src/editmesh_lib.c index 3234ddb7589..2f742d8e985 100644 --- a/source/blender/src/editmesh_lib.c +++ b/source/blender/src/editmesh_lib.c @@ -71,7 +71,7 @@ editmesh_lib: generic (no UI, no menus) operations/evaluators for editmesh data #include "editmesh.h" -/* ********* Selection ************ */ +/* ********* Selection History ************ */ static int EM_check_selection(void *data) { EditSelection *ese; @@ -105,6 +105,20 @@ void EM_store_selection(void *data, int type) } } +void EM_validate_selections(void) +{ + EditSelection *ese, *nextese; + EditMesh *em = G.editMesh; + ese = em->selected.first; + while(ese){ + nextese = ese->next; + if(ese->type == EDITVERT && !(((EditVert*)ese->data)->f & SELECT)) BLI_freelinkN(&(em->selected), ese); + else if(ese->type == EDITEDGE && !(((EditEdge*)ese->data)->f & SELECT)) BLI_freelinkN(&(em->selected), ese); + else if(ese->type == EDITFACE && !(((EditFace*)ese->data)->f & SELECT)) BLI_freelinkN(&(em->selected), ese); + ese = nextese; + } +} + static void EM_strip_selections(void) { EditSelection *ese, *nextese; -- cgit v1.2.3