[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48488] trunk/blender/source/blender/ blenkernel/intern/mesh_validate.c: Validate mesh selection stack in mesh_validate function
Sergey Sharybin
sergey.vfx at gmail.com
Mon Jul 2 11:57:48 CEST 2012
Revision: 48488
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48488
Author: nazgul
Date: 2012-07-02 09:57:31 +0000 (Mon, 02 Jul 2012)
Log Message:
-----------
Validate mesh selection stack in mesh_validate function
Related on #31944: Blender crashes on switching to mesh edit mode
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/mesh_validate.c
Modified: trunk/blender/source/blender/blenkernel/intern/mesh_validate.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh_validate.c 2012-07-02 09:34:13 UTC (rev 48487)
+++ trunk/blender/source/blender/blenkernel/intern/mesh_validate.c 2012-07-02 09:57:31 UTC (rev 48488)
@@ -211,6 +211,7 @@
short verts_fixed = FALSE;
short vert_weights_fixed = FALSE;
+ int msel_fixed = FALSE;
int do_edge_recalc = FALSE;
@@ -754,8 +755,6 @@
}
}
- PRINT("BKE_mesh_validate: finished\n\n");
-
# undef REMOVE_EDGE_TAG
# undef IS_REMOVED_EDGE
# undef REMOVE_LOOP_TAG
@@ -779,7 +778,51 @@
}
}
- return (verts_fixed || vert_weights_fixed || do_polyloop_free || do_edge_free || do_edge_recalc);
+ if (mesh && mesh->mselect) {
+ MSelect *msel;
+ int free_msel = FALSE;
+
+ for (i = 0, msel = mesh->mselect; i < mesh->totselect; i++, msel++) {
+ int tot_elem;
+
+ if (msel->index < 0) {
+ PRINT("Mesh select element %d type %d index is negative, "
+ "resetting selection stack.\n", i, msel->type);
+ free_msel = TRUE;
+ break;
+ }
+
+ switch (msel->type) {
+ case ME_VSEL:
+ tot_elem = mesh->totvert;
+ break;
+ case ME_ESEL:
+ tot_elem = mesh->totedge;
+ break;
+ case ME_FSEL:
+ tot_elem = mesh->totface;
+ break;
+ }
+
+ if (msel->index > tot_elem) {
+ PRINT("Mesh select element %d type %d index %d is larger than data array size %d, "
+ "resetting selection stack.\n", i, msel->type, msel->index, tot_elem);
+
+ free_msel = TRUE;
+ break;
+ }
+ }
+
+ if (free_msel) {
+ MEM_freeN(mesh->mselect);
+ mesh->mselect = NULL;
+ mesh->totselect = 0;
+ }
+ }
+
+ PRINT("BKE_mesh_validate: finished\n\n");
+
+ return (verts_fixed || vert_weights_fixed || do_polyloop_free || do_edge_free || do_edge_recalc || msel_fixed);
}
static int mesh_validate_customdata(CustomData *data, short do_verbose, const short do_fixes)
More information about the Bf-blender-cvs
mailing list