[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57402] trunk/blender/source/blender/ modifiers/intern/MOD_solidify.c: optimize solidify, no need to do edgehash lookups, the edges are known.

Campbell Barton ideasman42 at gmail.com
Wed Jun 12 09:16:14 CEST 2013


Revision: 57402
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57402
Author:   campbellbarton
Date:     2013-06-12 07:16:13 +0000 (Wed, 12 Jun 2013)
Log Message:
-----------
optimize solidify, no need to do edgehash lookups, the edges are known.

Modified Paths:
--------------
    trunk/blender/source/blender/modifiers/intern/MOD_solidify.c

Modified: trunk/blender/source/blender/modifiers/intern/MOD_solidify.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_solidify.c	2013-06-12 07:02:52 UTC (rev 57401)
+++ trunk/blender/source/blender/modifiers/intern/MOD_solidify.c	2013-06-12 07:16:13 UTC (rev 57402)
@@ -36,7 +36,6 @@
 
 #include "BLI_utildefines.h"
 #include "BLI_math.h"
-#include "BLI_edgehash.h"
 #include "BLI_string.h"
 
 #include "BKE_cdderivedmesh.h"
@@ -64,6 +63,7 @@
 	int i, numVerts, numEdges, numFaces;
 	MPoly *mpoly, *mp;
 	MLoop *mloop, *ml;
+	MEdge *medge, *ed;
 	MVert *mvert, *mv;
 
 	float (*face_nors)[3];
@@ -74,6 +74,7 @@
 	numEdges = dm->getNumEdges(dm);
 	numFaces = dm->getNumPolys(dm);
 	mpoly = dm->getPolyArray(dm);
+	medge = dm->getEdgeArray(dm);
 	mvert = dm->getVertArray(dm);
 	mloop = dm->getLoopArray(dm);
 
@@ -95,18 +96,12 @@
 	mp = mpoly;
 
 	{
-		EdgeHash *edge_hash = BLI_edgehash_new();
-		EdgeHashIterator *edge_iter;
-		int edge_ref_count = 0;
-		unsigned int ed_v1, ed_v2; /* use when getting the key */
 		EdgeFaceRef *edge_ref_array = MEM_callocN(sizeof(EdgeFaceRef) * (size_t)numEdges, "Edge Connectivity");
 		EdgeFaceRef *edge_ref;
 		float edge_normal[3];
 
 		/* This loop adds an edge hash if its not there, and adds the face index */
 		for (i = 0; i < numFaces; i++, mp++) {
-			unsigned int ml_v1;
-			unsigned int ml_v2;
 			int j;
 
 			f_no = face_nors[i];
@@ -115,18 +110,12 @@
 
 			ml = mloop + mp->loopstart;
 
-			for (j = 0, ml_v2 = ml[mp->totloop - 1].v;
-			     j < mp->totloop;
-			     j++, ml++, ml_v2 = ml_v1)
-			{
-				ml_v1 = ml->v;
+			for (j = 0; j < mp->totloop; j++, ml++) {
 				/* --- add edge ref to face --- */
-				edge_ref = (EdgeFaceRef *)BLI_edgehash_lookup(edge_hash, ml_v1, ml_v2);
-				if (!edge_ref) {
-					edge_ref = &edge_ref_array[edge_ref_count++];
+				edge_ref = &edge_ref_array[ml->e];
+				if ((edge_ref->f1 == 0) && (edge_ref->f2 == 0)) {
 					edge_ref->f1 =  i;
 					edge_ref->f2 = -1;
-					BLI_edgehash_insert(edge_hash, ml_v1, ml_v2, edge_ref);
 				}
 				else {
 					edge_ref->f2 = i;
@@ -135,13 +124,8 @@
 			}
 		}
 
-		for (edge_iter = BLI_edgehashIterator_new(edge_hash);
-		     !BLI_edgehashIterator_isDone(edge_iter);
-		     BLI_edgehashIterator_step(edge_iter))
-		{
-			/* Get the edge vert indices, and edge value (the face indices that use it)*/
-			BLI_edgehashIterator_getKey(edge_iter, &ed_v1, &ed_v2);
-			edge_ref = BLI_edgehashIterator_getValue(edge_iter);
+		for (i = 0, ed = medge, edge_ref = edge_ref_array; i < numEdges; i++, ed++, edge_ref++) {
+			/* Get the edge vert indices, and edge value (the face indices that use it) */
 
 			if (edge_ref->f2 != -1) {
 				/* We have 2 faces using this edge, calculate the edges normal
@@ -160,11 +144,9 @@
 				/* an edge without another attached- the weight on this is undefined */
 				copy_v3_v3(edge_normal, face_nors[edge_ref->f1]);
 			}
-			add_v3_v3(temp_nors[ed_v1], edge_normal);
-			add_v3_v3(temp_nors[ed_v2], edge_normal);
+			add_v3_v3(temp_nors[ed->v1], edge_normal);
+			add_v3_v3(temp_nors[ed->v2], edge_normal);
 		}
-		BLI_edgehashIterator_free(edge_iter);
-		BLI_edgehash_free(edge_hash, NULL);
 		MEM_freeN(edge_ref_array);
 	}
 
@@ -286,9 +268,6 @@
 	STACK_INIT(new_edge_arr);
 
 	if (smd->flag & MOD_SOLIDIFY_RIM) {
-		EdgeHash *edgehash = BLI_edgehash_new();
-		EdgeHashIterator *ehi;
-		unsigned int v1, v2;
 		unsigned int eidx;
 
 #define INVALID_UNUSED ((unsigned int)-1)
@@ -309,9 +288,8 @@
 		fill_vn_i(edge_users, numEdges, INVALID_UNUSED);
 #endif
 
-		for (i = 0, ed = orig_medge; i < numEdges; i++, ed++) {
-			BLI_edgehash_insert(edgehash, ed->v1, ed->v2, SET_UINT_IN_POINTER(i));
-			edge_users[i] = INVALID_UNUSED;
+		for (eidx = 0, ed = orig_medge; eidx < numEdges; eidx++, ed++) {
+			edge_users[eidx] = INVALID_UNUSED;
 		}
 
 		for (i = 0, mp = orig_mpoly; i < numFaces; i++, mp++) {
@@ -327,7 +305,7 @@
 			{
 				ml_v1 = ml->v;
 				/* add edge user */
-				eidx = GET_UINT_FROM_POINTER(BLI_edgehash_lookup(edgehash, ml_v1, ml_v2));
+				eidx = ml->e;
 				if (edge_users[eidx] == INVALID_UNUSED) {
 					ed = orig_medge + eidx;
 					edge_users[eidx] = (ml_v1 < ml_v2) == (ed->v1 < ed->v2) ? i : (i + numFaces);
@@ -339,19 +317,15 @@
 			}
 		}
 
-		ehi = BLI_edgehashIterator_new(edgehash);
-		for (; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
-			eidx = GET_UINT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
+		for (eidx = 0, ed = orig_medge; eidx < numEdges; eidx++, ed++) {
 			if (!ELEM(edge_users[eidx], INVALID_UNUSED, INVALID_PAIR)) {
-				BLI_edgehashIterator_getKey(ehi, &v1, &v2);
-				orig_mvert[v1].flag |= ME_VERT_TMP_TAG;
-				orig_mvert[v2].flag |= ME_VERT_TMP_TAG;
+				orig_mvert[ed->v1].flag |= ME_VERT_TMP_TAG;
+				orig_mvert[ed->v2].flag |= ME_VERT_TMP_TAG;
 				STACK_PUSH(new_edge_arr, eidx);
 				newFaces++;
 				newLoops += 4;
 			}
 		}
-		BLI_edgehashIterator_free(ehi);
 
 #undef INVALID_UNUSED
 #undef INVALID_PAIR
@@ -365,8 +339,6 @@
 				mv->flag &= ~ME_VERT_TMP_TAG;
 			}
 		}
-
-		BLI_edgehash_free(edgehash, NULL);
 	}
 
 	if (smd->flag & MOD_SOLIDIFY_NORMAL_CALC) {




More information about the Bf-blender-cvs mailing list