[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57025] trunk/blender/source/blender/ editors/mesh/editmesh_select.c: bmesh: replace array reallocation with a single face array and use STACK macros.

Campbell Barton ideasman42 at gmail.com
Sat May 25 23:24:09 CEST 2013


Revision: 57025
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57025
Author:   campbellbarton
Date:     2013-05-25 21:24:09 +0000 (Sat, 25 May 2013)
Log Message:
-----------
bmesh: replace array reallocation with a single face array and use STACK macros.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/mesh/editmesh_select.c

Modified: trunk/blender/source/blender/editors/mesh/editmesh_select.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_select.c	2013-05-25 20:47:06 UTC (rev 57024)
+++ trunk/blender/source/blender/editors/mesh/editmesh_select.c	2013-05-25 21:24:09 UTC (rev 57025)
@@ -3108,58 +3108,58 @@
 {
 	Object *obedit = CTX_data_edit_object(C);
 	BMEditMesh *em = BKE_editmesh_from_object(obedit);
+	BMesh *bm = em->bm;
+
+	BMFace **stack = MEM_mallocN(sizeof(BMFace *) * bm->totface, __func__);
+	STACK_DECLARE(stack);
+
 	BMIter iter, liter, liter2;
-	BMFace *f, **stack = NULL;
-	BLI_array_declare(stack);
+	BMFace *f;
 	BMLoop *l, *l2;
-	const float sharp = RNA_float_get(op->ptr, "sharpness");
-	int i;
+	const float angle_limit = RNA_float_get(op->ptr, "sharpness");
 
-	BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) {
-		BM_elem_flag_disable(f, BM_ELEM_TAG);
-	}
+	BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_TAG, false);
 
-	BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) {
-		if (BM_elem_flag_test(f, BM_ELEM_HIDDEN) || !BM_elem_flag_test(f, BM_ELEM_SELECT) || BM_elem_flag_test(f, BM_ELEM_TAG))
+
+	BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
+		if ((BM_elem_flag_test(f, BM_ELEM_HIDDEN) != 0) ||
+		    (BM_elem_flag_test(f, BM_ELEM_TAG)    != 0) ||
+		    (BM_elem_flag_test(f, BM_ELEM_SELECT) == 0))
+		{
 			continue;
+		}
 
-		BLI_array_empty(stack);
-		i = 1;
+		STACK_INIT(stack);
 
-		BLI_array_grow_one(stack);
-		stack[i - 1] = f;
+		do {
+			BM_face_select_set(bm, f, true);
 
-		while (i) {
-			f = stack[i - 1];
-			i--;
-
-			BM_face_select_set(em->bm, f, true);
-
 			BM_elem_flag_enable(f, BM_ELEM_TAG);
 
 			BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
 				BM_ITER_ELEM (l2, &liter2, l, BM_LOOPS_OF_LOOP) {
 					float angle;
 
-					if (BM_elem_flag_test(l2->f, BM_ELEM_TAG) || BM_elem_flag_test(l2->f, BM_ELEM_HIDDEN))
+					if (BM_elem_flag_test(l2->f, BM_ELEM_TAG) ||
+					    BM_elem_flag_test(l2->f, BM_ELEM_HIDDEN))
+					{
 						continue;
+					}
 
-					/* edge has exactly two neighboring faces, check angle */
 					angle = angle_normalized_v3v3(f->no, l2->f->no);
 
-					/* invalidate: edge too sharp */
-					if (angle < sharp) {
-						BLI_array_grow_one(stack);
-						stack[i] = l2->f;
-						i++;
+					if (angle < angle_limit) {
+						STACK_PUSH(stack, l2->f);
 					}
 				}
 			}
-		}
+		} while ((f = STACK_POP(stack)));
 	}
 
-	BLI_array_free(stack);
+	STACK_FREE(stack);
 
+	MEM_freeN(stack);
+
 	WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
 
 	return OPERATOR_FINISHED;




More information about the Bf-blender-cvs mailing list