[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