[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53716] trunk/blender/source/blender/ blenkernel/intern/modifiers_bmesh.c: minor speedup for DM_to_bmesh_ex(), only duplicate the edge array when the derivedMesh type isn't a CDDM.

Campbell Barton ideasman42 at gmail.com
Thu Jan 10 19:31:15 CET 2013


Revision: 53716
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53716
Author:   campbellbarton
Date:     2013-01-10 18:31:14 +0000 (Thu, 10 Jan 2013)
Log Message:
-----------
minor speedup for DM_to_bmesh_ex(), only duplicate the edge array when the derivedMesh type isn't a CDDM.

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	2013-01-10 18:20:29 UTC (rev 53715)
+++ trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c	2013-01-10 18:31:14 UTC (rev 53716)
@@ -59,7 +59,8 @@
 	BLI_array_declare(verts);
 	BLI_array_declare(edges);
 	int i, j, k, totvert, totedge /* , totface */ /* UNUSED */ ;
-	int is_init = (bm->totvert == 0) && (bm->totedge == 0) && (bm->totface == 0);
+	bool is_init = (bm->totvert == 0) && (bm->totedge == 0) && (bm->totface == 0);
+	bool is_cddm = (dm->type == DM_TYPE_CDDM);  /* duplicate the arrays for non cddm */
 	char has_orig_hflag = 0;
 
 	int cd_vert_bweight_offset;
@@ -95,7 +96,7 @@
 	etable = MEM_callocN(sizeof(void **) * totedge, __func__);
 
 	/*do verts*/
-	mv = mvert = dm->getVertArray(dm);
+	mv = mvert = is_cddm ? dm->getVertArray(dm) : dm->dupVertArray(dm);
 	for (i = 0; i < totvert; i++, mv++) {
 		v = BM_vert_create(bm, mv->co, NULL, BM_CREATE_SKIP_CD);
 		normal_short_to_float_v3(v->no, mv->no);
@@ -113,10 +114,11 @@
 			*orig_index = ORIGINDEX_NONE;
 		}
 	}
+	if (!is_cddm) MEM_freeN(mvert);
 	if (is_init) bm->elem_index_dirty &= ~BM_VERT;
 
 	/*do edges*/
-	me = medge = dm->dupEdgeArray(dm);
+	me = medge = is_cddm ? dm->getEdgeArray(dm) : dm->dupEdgeArray(dm);
 	for (i = 0; i < totedge; i++, me++) {
 		//BLI_assert(BM_edge_exists(vtable[me->v1], vtable[me->v2]) == NULL);
 		e = BM_edge_create(bm, vtable[me->v1], vtable[me->v2], NULL, BM_CREATE_SKIP_CD);
@@ -135,7 +137,7 @@
 			*orig_index = ORIGINDEX_NONE;
 		}
 	}
-	MEM_freeN(medge);
+	if (!is_cddm) MEM_freeN(medge);
 	if (is_init) bm->elem_index_dirty &= ~BM_EDGE;
 
 	/* do faces */




More information about the Bf-blender-cvs mailing list