[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59467] trunk/blender/source/blender: when the size of an edgehash is known or can be guessed,

Campbell Barton ideasman42 at gmail.com
Sat Aug 24 15:47:58 CEST 2013


Revision: 59467
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59467
Author:   campbellbarton
Date:     2013-08-24 13:47:57 +0000 (Sat, 24 Aug 2013)
Log Message:
-----------
when the size of an edgehash is known or can be guessed,
pass in the argument to reserve the size.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/blenkernel/intern/mesh_validate.c
    trunk/blender/source/blender/blenkernel/intern/particle_system.c
    trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    trunk/blender/source/blender/blenlib/BLI_edgehash.h
    trunk/blender/source/blender/editors/armature/meshlaplacian.c

Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2013-08-24 13:28:18 UTC (rev 59466)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2013-08-24 13:47:57 UTC (rev 59467)
@@ -2405,7 +2405,7 @@
 	STACK_DECLARE(mpoly);
 	STACK_DECLARE(oldp);
 
-	EdgeHash *ehash = BLI_edgehash_new(__func__);
+	EdgeHash *ehash = BLI_edgehash_new_ex(__func__, totedge);
 
 	int i, j, c;
 	
@@ -2607,10 +2607,12 @@
 	EdgeHashIterator *ehi;
 	MFace *mf = cddm->mface;
 	MEdge *med;
-	EdgeHash *eh = BLI_edgehash_new(__func__);
-	int i, *index, numEdges, maxFaces = dm->numTessFaceData;
+	EdgeHash *eh;
+	int i, *index, numEdges, numFaces = dm->numTessFaceData;
 
-	for (i = 0; i < maxFaces; i++, mf++) {
+	eh = BLI_edgehash_new_ex(__func__, BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(numFaces));
+
+	for (i = 0; i < numFaces; i++, mf++) {
 		if (!BLI_edgehash_haskey(eh, mf->v1, mf->v2))
 			BLI_edgehash_insert(eh, mf->v1, mf->v2, NULL);
 		if (!BLI_edgehash_haskey(eh, mf->v2, mf->v3))
@@ -2668,21 +2670,27 @@
 	MPoly *mp = cddm->mpoly;
 	MLoop *ml;
 	MEdge *med, *origmed;
-	EdgeHash *eh = BLI_edgehash_new(__func__);
+	EdgeHash *eh;
+	unsigned int eh_reserve;
 	int v1, v2;
 	int *eindex;
-	int i, j, *index, numEdges = cddm->dm.numEdgeData, maxFaces = dm->numPolyData;
+	int i, j, *index;
+	const int numFaces = dm->numPolyData;
+	const int numLoops = dm->numLoopData;
+	int numEdges = dm->numEdgeData;
 
 	eindex = DM_get_edge_data_layer(dm, CD_ORIGINDEX);
+	med = cddm->medge;
 
-	med = cddm->medge;
+	eh_reserve = max_ii(med ? numEdges : 0, BLI_EDGEHASH_SIZE_GUESS_FROM_LOOPS(numLoops));
+	eh = BLI_edgehash_new_ex(__func__, eh_reserve);
 	if (med) {
 		for (i = 0; i < numEdges; i++, med++) {
 			BLI_edgehash_insert(eh, med->v1, med->v2, SET_INT_IN_POINTER(i + 1));
 		}
 	}
 
-	for (i = 0; i < maxFaces; i++, mp++) {
+	for (i = 0; i < numFaces; i++, mp++) {
 		ml = cddm->mloop + mp->loopstart;
 		for (j = 0; j < mp->totloop; j++, ml++) {
 			v1 = ml->v;
@@ -2732,7 +2740,7 @@
 	cddm->medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
 
 	mp = cddm->mpoly;
-	for (i = 0; i < maxFaces; i++, mp++) {
+	for (i = 0; i < numFaces; i++, mp++) {
 		ml = cddm->mloop + mp->loopstart;
 		for (j = 0; j < mp->totloop; j++, ml++) {
 			v1 = ml->v;

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2013-08-24 13:28:18 UTC (rev 59466)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2013-08-24 13:47:57 UTC (rev 59467)
@@ -177,8 +177,8 @@
 		if (l1->type == CD_MEDGE) {
 			MEdge *e1 = l1->data;
 			MEdge *e2 = l2->data;
-			EdgeHash *eh = BLI_edgehash_new(__func__);
 			int etot = m1->totedge;
+			EdgeHash *eh = BLI_edgehash_new_ex(__func__, etot);
 		
 			for (j = 0; j < etot; j++, e1++) {
 				BLI_edgehash_insert(eh, e1->v1, e1->v2, e1);

Modified: trunk/blender/source/blender/blenkernel/intern/mesh_validate.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh_validate.c	2013-08-24 13:28:18 UTC (rev 59466)
+++ trunk/blender/source/blender/blenkernel/intern/mesh_validate.c	2013-08-24 13:47:57 UTC (rev 59467)
@@ -921,7 +921,8 @@
 	EdgeHashIterator *ehi;
 	MPoly *mp;
 	MEdge *med, *med_orig;
-	EdgeHash *eh = BLI_edgehash_new(__func__);
+	EdgeHash *eh;
+	unsigned int eh_reserve;
 	int i, totedge, totpoly = mesh->totpoly;
 	int med_index;
 	/* select for newly created meshes which are selected [#25595] */
@@ -930,6 +931,9 @@
 	if (mesh->totedge == 0)
 		update = false;
 
+	eh_reserve = max_ii(update ? mesh->totedge : 0, BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(totpoly));
+	eh = BLI_edgehash_new_ex(__func__, eh_reserve);
+
 	if (update) {
 		/* assume existing edges are valid
 		 * useful when adding more faces and generating edges from them */

Modified: trunk/blender/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle_system.c	2013-08-24 13:28:18 UTC (rev 59466)
+++ trunk/blender/source/blender/blenkernel/intern/particle_system.c	2013-08-24 13:47:57 UTC (rev 59467)
@@ -2484,7 +2484,7 @@
 	ParticleSpring *spring;
 	int i = 0;
 
-	springhash = BLI_edgehash_new(__func__);
+	springhash = BLI_edgehash_new_ex(__func__, psys->tot_fluidsprings);
 
 	for (i=0, spring=psys->fluid_springs; i<psys->tot_fluidsprings; i++, spring++)
 		BLI_edgehash_insert(springhash, spring->particle_index[0], spring->particle_index[1], SET_INT_IN_POINTER(i+1));

Modified: trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2013-08-24 13:28:18 UTC (rev 59466)
+++ trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2013-08-24 13:47:57 UTC (rev 59467)
@@ -334,7 +334,7 @@
 	}
 
 	/* create edges */
-	ehash = BLI_edgehash_new(__func__);
+	ehash = BLI_edgehash_new_ex(__func__, BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(totface));
 
 	for (i = 0; i < totface; i++) {
 		MPoly *mp = &((MPoly *) mpoly)[i];

Modified: trunk/blender/source/blender/blenlib/BLI_edgehash.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_edgehash.h	2013-08-24 13:28:18 UTC (rev 59466)
+++ trunk/blender/source/blender/blenlib/BLI_edgehash.h	2013-08-24 13:47:57 UTC (rev 59467)
@@ -62,4 +62,8 @@
 void                BLI_edgehashIterator_step(EdgeHashIterator *ehi);
 bool                BLI_edgehashIterator_isDone(EdgeHashIterator *ehi);
 
+#define BLI_EDGEHASH_SIZE_GUESS_FROM_LOOPS(totloop)  ((totloop) / 2)
+#define BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(totpoly)  ((totpoly) * 2)
+
+
 #endif

Modified: trunk/blender/source/blender/editors/armature/meshlaplacian.c
===================================================================
--- trunk/blender/source/blender/editors/armature/meshlaplacian.c	2013-08-24 13:28:18 UTC (rev 59466)
+++ trunk/blender/source/blender/editors/armature/meshlaplacian.c	2013-08-24 13:47:57 UTC (rev 59467)
@@ -281,7 +281,7 @@
 
 	sys->varea = MEM_callocN(sizeof(float) * totvert, "LaplacianSystemVarea");
 
-	sys->edgehash = BLI_edgehash_new(__func__);
+	sys->edgehash = BLI_edgehash_new_ex(__func__, BLI_EDGEHASH_SIZE_GUESS_FROM_POLYS(sys->totface));
 	for (a = 0, face = sys->faces; a < sys->totface; a++, face++) {
 		laplacian_increase_edge_count(sys->edgehash, (*face)[0], (*face)[1]);
 		laplacian_increase_edge_count(sys->edgehash, (*face)[1], (*face)[2]);




More information about the Bf-blender-cvs mailing list