[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32177] trunk/blender/source/blender: bugfix [#24040] loop select -> delete edge loop crashes blender

Campbell Barton ideasman42 at gmail.com
Tue Sep 28 21:53:45 CEST 2010


Revision: 32177
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32177
Author:   campbellbarton
Date:     2010-09-28 21:53:45 +0200 (Tue, 28 Sep 2010)

Log Message:
-----------
bugfix [#24040] loop select -> delete edge loop crashes blender

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_editVert.h
    trunk/blender/source/blender/editors/mesh/meshtools.c

Modified: trunk/blender/source/blender/blenlib/BLI_editVert.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_editVert.h	2010-09-28 12:38:49 UTC (rev 32176)
+++ trunk/blender/source/blender/blenlib/BLI_editVert.h	2010-09-28 19:53:45 UTC (rev 32177)
@@ -68,7 +68,7 @@
 	unsigned char f, h, f1, f2; 
 	float bweight;
 	short fast;	/* only 0 or 1, for editmesh_fastmalloc, do not store temp data here! */
-	int hash;
+	int hash;     /* internal editmesh.c use only, don't touch! */
 	int keyindex; /* original index #, for restoring  key information */
 
 	void *data;		/* custom vertex data */

Modified: trunk/blender/source/blender/editors/mesh/meshtools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/meshtools.c	2010-09-28 12:38:49 UTC (rev 32176)
+++ trunk/blender/source/blender/editors/mesh/meshtools.c	2010-09-28 19:53:45 UTC (rev 32177)
@@ -867,6 +867,7 @@
 		Mesh *me= ob->data;
 		MEdge *medge;
 		EditMesh *em= me->edit_mesh;
+		void **eve_tmp_back= NULL; /* some of the callers are using eve->tmp so restore after */
 
 
 		/* editmode*/
@@ -889,10 +890,13 @@
 		if(em) {
 			EditVert *eve;
 			totvert= 0;
+			eve_tmp_back=  MEM_callocN( em->totvert * sizeof(void *), "TopoMirr" );
 			for(eve= em->verts.first; eve; eve= eve->next) {
-				eve->hash = totvert++;
+				eve_tmp_back[totvert]= eve->tmp.p;
+				eve->tmp.l = totvert++;
 			}
-		} else {
+		}
+		else {
 			totvert = me->totvert;
 		}
 
@@ -901,8 +905,8 @@
 		/* Initialize the vert-edge-user counts used to detect unique topology */
 		if(em) {
 			for(eed=em->edges.first; eed; eed= eed->next) {
-				MirrTopoHash[eed->v1->hash]++;
-				MirrTopoHash[eed->v2->hash]++;
+				MirrTopoHash[eed->v1->tmp.l]++;
+				MirrTopoHash[eed->v2->tmp.l]++;
 			}
 		} else {
 			for(a=0, medge=me->medge; a<me->totedge; a++, medge++) {
@@ -919,8 +923,8 @@
 
 			if(em) {
 				for(eed=em->edges.first; eed; eed= eed->next) {
-					MirrTopoHash[eed->v1->hash] += MirrTopoHash_Prev[eed->v2->hash];
-					MirrTopoHash[eed->v2->hash] += MirrTopoHash_Prev[eed->v1->hash];
+					MirrTopoHash[eed->v1->tmp.l] += MirrTopoHash_Prev[eed->v2->tmp.l];
+					MirrTopoHash[eed->v2->tmp.l] += MirrTopoHash_Prev[eed->v1->tmp.l];
 				}
 			} else {
 				for(a=0, medge=me->medge; a<me->totedge; a++, medge++) {
@@ -952,6 +956,19 @@
 			memcpy(MirrTopoHash_Prev, MirrTopoHash, sizeof(MIRRHASH_TYPE) * totvert);
 		}
 
+		/* restore eve->tmp.* */
+		if(eve_tmp_back) {
+			EditVert *eve;
+			totvert= 0;
+			for(eve= em->verts.first; eve; eve= eve->next) {
+				eve->tmp.p= eve_tmp_back[totvert++];
+			}
+
+			MEM_freeN(eve_tmp_back);
+			eve_tmp_back= NULL;
+		}
+		
+		
 		/* Hash/Index pairs are needed for sorting to find index pairs */
 		MirrTopoPairs= MEM_callocN( sizeof(MirrTopoPair) * totvert, "MirrTopoPairs");
 
@@ -1074,13 +1091,14 @@
 	if (mesh_mirrtopo_table(ob, 'u')==-1)
 		return NULL;
 
-	if (index!=-1) {
+	if (index == -1) {
 		index = BLI_findindex(&em->verts, eve);
+
+		if (index == -1) {
+			return NULL;
+		}
 	}
 
-	if (index==-1)
-		return NULL;
-
 	poinval= mesh_topo_lookup[ index ];
 
 	if(poinval != -1)





More information about the Bf-blender-cvs mailing list