[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53067] trunk/blender/source/blender/ blenkernel/intern/modifiers_bmesh.c: fix [#33551] End Caps on a curve array with subsurf crashes blender when entering Edit Mode

Campbell Barton ideasman42 at gmail.com
Mon Dec 17 01:39:06 CET 2012


Revision: 53067
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53067
Author:   campbellbarton
Date:     2012-12-17 00:39:03 +0000 (Mon, 17 Dec 2012)
Log Message:
-----------
fix [#33551] End Caps on a curve array with subsurf crashes blender when entering Edit Mode

DM_to_bmesh_ex could merge a 'dm' into an existing BMesh, in that case CD_ORIGINDEX values needed to be set to ORIGINDEX_NONE.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c

Modified: trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c	2012-12-17 00:31:59 UTC (rev 53066)
+++ trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c	2012-12-17 00:39:03 UTC (rev 53067)
@@ -40,7 +40,11 @@
 #include "BKE_bmesh.h"
 #include "BKE_tessmesh.h"
 
-/* main function for copying DerivedMesh data into BMesh */
+/**
+ * The main function for copying DerivedMesh data into BMesh.
+ *
+ * \note The mesh may already have geometry. see 'is_init'
+ */
 void DM_to_bmesh_ex(DerivedMesh *dm, BMesh *bm)
 {
 	MVert *mv, *mvert;
@@ -56,7 +60,15 @@
 	BLI_array_declare(edges);
 	int i, j, k, totvert, totedge /* , totface */ /* UNUSED */ ;
 	int is_init = (bm->totvert == 0) && (bm->totedge == 0) && (bm->totface == 0);
+	char has_orig_hflag = 0;
 
+	if (is_init == FALSE) {
+		/* check if we have an origflag */
+		has_orig_hflag |= CustomData_has_layer(&bm->vdata, CD_ORIGINDEX) ? BM_VERT : 0;
+		has_orig_hflag |= CustomData_has_layer(&bm->edata, CD_ORIGINDEX) ? BM_EDGE : 0;
+		has_orig_hflag |= CustomData_has_layer(&bm->pdata, CD_ORIGINDEX) ? BM_FACE : 0;
+	}
+
 	/*merge custom data layout*/
 	CustomData_bmesh_merge(&dm->vertData, &bm->vdata, CD_MASK_DERIVEDMESH, CD_CALLOC, bm, BM_VERT);
 	CustomData_bmesh_merge(&dm->edgeData, &bm->edata, CD_MASK_DERIVEDMESH, CD_CALLOC, bm, BM_EDGE);
@@ -85,10 +97,15 @@
 		BM_elem_index_set(v, i); /* set_inline */
 
 		CustomData_to_bmesh_block(&dm->vertData, &bm->vdata, i, &v->head.data);
+		vtable[i] = v;
 
 		/* add bevel weight */
 		BM_elem_float_data_set(&bm->vdata, v, CD_BWEIGHT, (float)mv->bweight / 255.0f);
-		vtable[i] = v;
+
+		if (UNLIKELY(has_orig_hflag & BM_VERT)) {
+			int *orig_index = CustomData_bmesh_get(&bm->vdata, v->head.data, CD_ORIGINDEX);
+			*orig_index = ORIGINDEX_NONE;
+		}
 	}
 	MEM_freeN(mvert);
 	if (is_init) bm->elem_index_dirty &= ~BM_VERT;
@@ -109,6 +126,11 @@
 		BM_elem_float_data_set(&bm->edata, e, CD_CREASE, (float)me->crease / 255.0f);
 		/* add bevel weight */
 		BM_elem_float_data_set(&bm->edata, e, CD_BWEIGHT, (float)me->bweight / 255.0f);
+
+		if (UNLIKELY(has_orig_hflag & BM_EDGE)) {
+			int *orig_index = CustomData_bmesh_get(&bm->edata, e->head.data, CD_ORIGINDEX);
+			*orig_index = ORIGINDEX_NONE;
+		}
 	}
 	MEM_freeN(medge);
 	if (is_init) bm->elem_index_dirty &= ~BM_EDGE;
@@ -158,6 +180,11 @@
 		else {
 			BM_face_normal_update(f);
 		}
+
+		if (UNLIKELY(has_orig_hflag & BM_FACE)) {
+			int *orig_index = CustomData_bmesh_get(&bm->pdata, f->head.data, CD_ORIGINDEX);
+			*orig_index = ORIGINDEX_NONE;
+		}
 	}
 	if (is_init) bm->elem_index_dirty &= ~BM_FACE;
 




More information about the Bf-blender-cvs mailing list