[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56704] trunk/blender/source/blender: bmesh recalculate normals - remove BLI_array reallocation, the max size of the array is known.

Campbell Barton ideasman42 at gmail.com
Sun May 12 14:23:45 CEST 2013


Revision: 56704
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56704
Author:   campbellbarton
Date:     2013-05-12 12:23:44 +0000 (Sun, 12 May 2013)
Log Message:
-----------
bmesh recalculate normals - remove BLI_array reallocation, the max size of the array is known.
replace with STACK_* macros (moved to BLI_utildefines.h).

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_utildefines.h
    trunk/blender/source/blender/bmesh/intern/bmesh_core.c
    trunk/blender/source/blender/bmesh/operators/bmo_utils.c

Modified: trunk/blender/source/blender/blenlib/BLI_utildefines.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_utildefines.h	2013-05-12 12:06:08 UTC (rev 56703)
+++ trunk/blender/source/blender/blenlib/BLI_utildefines.h	2013-05-12 12:23:44 UTC (rev 56704)
@@ -290,6 +290,14 @@
 #define UNPACK3OP(op, a)  op((a)[0]), op((a)[1]), op((a)[2])
 #define UNPACK4OP(op, a)  op((a)[0]), op((a)[1]), op((a)[2]), op((a)[3])
 
+/* simple stack */
+#define STACK_DECLARE(stack)   unsigned int _##stack##_index
+#define STACK_INIT(stack)      ((void)stack, (void)((_##stack##_index) = 0))
+#define STACK_SIZE(stack)      ((void)stack, (void)(_##stack##_index))
+#define STACK_PUSH(stack, val)  (void)((stack)[(_##stack##_index)++] = val)
+#define STACK_POP(stack)       ((_##stack##_index) ? ((stack)[--(_##stack##_index)]) : NULL)
+#define STACK_FREE(stack)      ((void)stack)
+
 /* array helpers */
 #define ARRAY_LAST_ITEM(arr_start, arr_dtype, elem_size, tot) \
 	(arr_dtype *)((char *)arr_start + (elem_size * (tot - 1)))

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_core.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_core.c	2013-05-12 12:06:08 UTC (rev 56703)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_core.c	2013-05-12 12:23:44 UTC (rev 56704)
@@ -1893,14 +1893,8 @@
 {
 	const int v_edgetot = BM_vert_face_count(v);
 	BMEdge **stack = BLI_array_alloca(stack, v_edgetot);
-	unsigned int _stack_i;
+	STACK_DECLARE(stack);
 
-	/* */
-#define STACK_INIT(stack)     ((void)stack, (void)(_stack_i = 0))
-#define STACK_PUSH(stack, val)  (void)((stack)[_stack_i++] = val)
-#define STACK_POP(stack)       ((void)0, (_stack_i ? ((stack)[--_stack_i]) : NULL))
-#define STACK_FREE(stack)      ((void)stack)
-
 	SmallHash visithash;
 	BMVert **verts = NULL;
 	BMIter eiter, liter;
@@ -2020,11 +2014,6 @@
 		*r_vout = verts;
 	}
 
-#undef STACK_INIT
-#undef STACK_PUSH
-#undef STACK_POP
-#undef STACK_FREE
-
 	return true;
 }
 

Modified: trunk/blender/source/blender/bmesh/operators/bmo_utils.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_utils.c	2013-05-12 12:06:08 UTC (rev 56703)
+++ trunk/blender/source/blender/bmesh/operators/bmo_utils.c	2013-05-12 12:23:44 UTC (rev 56704)
@@ -310,11 +310,11 @@
 {
 	BMIter liter, liter2;
 	BMOIter siter;
-	BMFace *f, *startf, **fstack = NULL;
-	BLI_array_declare(fstack);
+	BMFace *f, *startf;
+	BMFace **fstack = MEM_mallocN(sizeof(*fstack) * BMO_slot_buffer_count(op->slots_in, "faces"), __func__);
+	STACK_DECLARE(fstack);
 	BMLoop *l, *l2;
 	float maxx, maxx_test, cent[3];
-	int i, i_max;
 	const bool use_flip = BMO_slot_bool_get(op->slots_in, "use_face_tag");
 
 	startf = NULL;
@@ -359,16 +359,10 @@
 	 * stack (if we use simple function recursion, we'd end up overloading
 	 * the stack on large meshes). */
 
-	BLI_array_grow_one(fstack);
-	fstack[0] = startf;
+	STACK_PUSH(fstack, startf);
 	BMO_elem_flag_enable(bm, startf, FACE_VIS);
 
-	i = 0;
-	i_max = 1;
-	while (i >= 0) {
-		f = fstack[i];
-		i--;
-
+	while ((f = STACK_POP(fstack))) {
 		BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
 			BM_ITER_ELEM (l2, &liter2, l, BM_LOOPS_OF_LOOP) {
 				if (!BMO_elem_flag_test(bm, l2->f, FACE_FLAG) || l2 == l)
@@ -376,8 +370,7 @@
 
 				if (!BMO_elem_flag_test(bm, l2->f, FACE_VIS)) {
 					BMO_elem_flag_enable(bm, l2->f, FACE_VIS);
-					i++;
-					
+
 					if (l2->v == l->v) {
 						BM_face_normal_flip(bm, l2->f);
 						
@@ -392,18 +385,13 @@
 						}
 					}
 					
-					if (i == i_max) {
-						BLI_array_grow_one(fstack);
-						i_max++;
-					}
-
-					fstack[i] = l2->f;
+					STACK_PUSH(fstack, l2->f);
 				}
 			}
 		}
 	}
 
-	BLI_array_free(fstack);
+	MEM_freeN(fstack);
 
 	/* check if we have faces yet to do.  if so, recurse */
 	BMO_ITER (f, &siter, op->slots_in, "faces", BM_FACE) {




More information about the Bf-blender-cvs mailing list