[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