Revision: 60499
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60499
Author:   campbellbarton
Date:     2013-10-02 04:12:06 +0000 (Wed, 02 Oct 2013)
Log Message:
-----------
fix [#36913] GHASH_FLAG_ALLOW_DUPES assert and crash in Edge Collapse

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/operators/bmo_removedoubles.c

Modified: trunk/blender/source/blender/bmesh/operators/bmo_removedoubles.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_removedoubles.c    
2013-10-01 18:23:39 UTC (rev 60498)
+++ trunk/blender/source/blender/bmesh/operators/bmo_removedoubles.c    
2013-10-02 04:12:06 UTC (rev 60499)
@@ -354,7 +354,7 @@
        BMEdge *e, **edges = NULL;
        BLI_array_declare(edges);
        float min[3], max[3], center[3];
-       int i, tot;
+       unsigned int i, tot;
        BMOpSlot *slot_targetmap;
        
        BMO_op_callf(bm, op->flag, "collapse_uvs edges=%s", op, "edges");
@@ -369,6 +369,8 @@
                 BMW_NIL_LAY);
 
        BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
+               BMVert *v_tar;
+
                if (!BMO_elem_flag_test(bm, e, EDGE_MARK))
                        continue;
 
@@ -381,19 +383,29 @@
 
                        minmax_v3v3_v3(min, max, e->v1->co);
                        minmax_v3v3_v3(min, max, e->v2->co);
+
+                       /* prevent adding to slot_targetmap multiple times */
+                       BM_elem_flag_disable(e->v1, BM_ELEM_TAG);
+                       BM_elem_flag_disable(e->v2, BM_ELEM_TAG);
                }
 
                mid_v3_v3v3(center, min, max);
 
                /* snap edges to a point.  for initial testing purposes anyway 
*/
+               v_tar = edges[0]->v1;
+
                for (i = 0; i < tot; i++) {
-                       copy_v3_v3(edges[i]->v1->co, center);
-                       copy_v3_v3(edges[i]->v2->co, center);
-                       
-                       if (edges[i]->v1 != edges[0]->v1)
-                               BMO_slot_map_elem_insert(&weldop, 
slot_targetmap, edges[i]->v1, edges[0]->v1);
-                       if (edges[i]->v2 != edges[0]->v1)
-                               BMO_slot_map_elem_insert(&weldop, 
slot_targetmap, edges[i]->v2, edges[0]->v1);
+                       unsigned int j;
+
+                       for (j = 0; j < 2; j++) {
+                               BMVert *v_src = *((&edges[i]->v1) + j);
+
+                               copy_v3_v3(v_src->co, center);
+                               if ((v_src != v_tar) && 
!BM_elem_flag_test(v_src, BM_ELEM_TAG)) {
+                                       BM_elem_flag_enable(v_src, BM_ELEM_TAG);
+                                       BMO_slot_map_elem_insert(&weldop, 
slot_targetmap, v_src, v_tar);
+                               }
+                       }
                }
        }
        

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to