[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43634] branches/bmesh/blender/source/ blender/bmesh/intern/bmesh_interp.c: replace BLI_array_staticdeclare with BLI_array_fixedstack_declare()

Campbell Barton ideasman42 at gmail.com
Mon Jan 23 14:41:29 CET 2012


Revision: 43634
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43634
Author:   campbellbarton
Date:     2012-01-23 13:41:28 +0000 (Mon, 23 Jan 2012)
Log Message:
-----------
replace BLI_array_staticdeclare with BLI_array_fixedstack_declare()

This has the advantage that it only does 1 alloc at the beginning if the stack variable is too small.
(rather then constantly check to grow one, which is a really huge macro too).

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c	2012-01-23 13:36:11 UTC (rev 43633)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c	2012-01-23 13:41:28 UTC (rev 43634)
@@ -187,33 +187,36 @@
 void BM_face_interp_from_face(BMesh *bm, BMFace *target, BMFace *source)
 {
 	BMLoop *l1, *l2;
+	BMLoop *l_first;
+
 	void **blocks=NULL;
 	float (*cos)[3]=NULL, *w=NULL;
-	BLI_array_staticdeclare(cos,     BM_NGON_STACK_SIZE);
-	BLI_array_staticdeclare(w,       BM_NGON_STACK_SIZE);
-	BLI_array_staticdeclare(blocks,  BM_NGON_STACK_SIZE);
+	BLI_array_fixedstack_declare(cos,     BM_NGON_STACK_SIZE, source->len, __func__);
+	BLI_array_fixedstack_declare(w,       BM_NGON_STACK_SIZE, source->len, __func__);
+	BLI_array_fixedstack_declare(blocks,  BM_NGON_STACK_SIZE, source->len, __func__);
+	int i;
 	
 	BM_Copy_Attributes(bm, bm, source, target);
-	
-	l2 = bm_firstfaceloop(source);
+
+	i = 0;
+	l2 = l_first = bm_firstfaceloop(source);
 	do {
-		BLI_array_growone(cos);
-		copy_v3_v3(cos[BLI_array_count(cos)-1], l2->v->co);
-		BLI_array_growone(w);
-		BLI_array_append(blocks, l2->head.data);
-		l2 = l2->next;
-	} while (l2 != bm_firstfaceloop(source));
+		copy_v3_v3(cos[i], l2->v->co);
+		blocks[i] = l2->head.data;
+		i++;
+	} while ((l2 = l2->next) != l_first);
 
-	l1 = bm_firstfaceloop(target);
+	i = 0;
+	l1 = l_first = bm_firstfaceloop(target);
 	do {
 		interp_weights_poly_v3(w, cos, source->len, l1->v->co);
-		CustomData_bmesh_interp(&bm->ldata, blocks, w, NULL, BLI_array_count(blocks), l1->head.data);
-		l1 = l1->next;
-	} while (l1 != bm_firstfaceloop(target));
+		CustomData_bmesh_interp(&bm->ldata, blocks, w, NULL, source->len, l1->head.data);
+		i++;
+	} while ((l1 = l1->next) != l_first);
 
-	BLI_array_free(cos);
-	BLI_array_free(w);
-	BLI_array_free(blocks);
+	BLI_array_fixedstack_free(cos);
+	BLI_array_fixedstack_free(w);
+	BLI_array_fixedstack_free(blocks);
 }
 
 /****some math stuff for dealing with doubles, put here to
@@ -696,31 +699,33 @@
                               int do_vertex, int do_multires)
 {
 	BMLoop *l;
+	BMLoop *l_first;
 	void **blocks=NULL;
 	void **vblocks=NULL;
 	float (*cos)[3]=NULL, co[3], *w=NULL, cent[3] = {0.0f, 0.0f, 0.0f};
-	BLI_array_staticdeclare(cos,      BM_NGON_STACK_SIZE);
-	BLI_array_staticdeclare(w,        BM_NGON_STACK_SIZE);
-	BLI_array_staticdeclare(blocks,   BM_NGON_STACK_SIZE);
-	BLI_array_staticdeclare(vblocks,  BM_NGON_STACK_SIZE);
+	BLI_array_fixedstack_declare(cos,      BM_NGON_STACK_SIZE, source->len, __func__);
+	BLI_array_fixedstack_declare(w,        BM_NGON_STACK_SIZE, source->len, __func__);
+	BLI_array_fixedstack_declare(blocks,   BM_NGON_STACK_SIZE, source->len, __func__);
+	BLI_array_fixedstack_declare(vblocks,  BM_NGON_STACK_SIZE, do_vertex ? source->len : 0, __func__);
 	int i, ax, ay;
 	
 	BM_Copy_Attributes(bm, bm, source, target->f);
-	
-	l = bm_firstfaceloop(source);
+
+	i = 0;
+	l = l_first = bm_firstfaceloop(source);
 	do {
-		BLI_array_growone(cos);
-		copy_v3_v3(cos[BLI_array_count(cos)-1], l->v->co);
-		add_v3_v3(cent, cos[BLI_array_count(cos)-1]);
+		copy_v3_v3(cos[i], l->v->co);
+		add_v3_v3(cent, cos[i]);
 		
-		BLI_array_append(w, 0.0f);
-		BLI_array_append(blocks, l->head.data);
+		w[i] = 0.0f;
+		blocks[i] = l->head.data;
 	
-		if (do_vertex)
-			BLI_array_append(vblocks, l->v->head.data);
+		if (do_vertex) {
+			vblocks[i] = l->v->head.data;
+		}
+		i++;
 	
-		l = l->next;
-	} while (l != bm_firstfaceloop(source));
+	} while ((l = l->next) != l_first);
 
 	/* find best projection of face XY, XZ or YZ: barycentric weights of
 	 * the 2d projected coords are the same and faster to compute */
@@ -733,7 +738,7 @@
 	for (i=0; i<source->len; i++) {
 		float vec[3], tmp[3];
 		sub_v3_v3v3(vec, cent, cos[i]);
-		mul_v3_fl(vec, 0.001);
+		mul_v3_fl(vec, 0.001f);
 		add_v3_v3(cos[i], vec);
 		
 		copy_v3_v3(tmp, cos[i]);
@@ -752,13 +757,13 @@
 	CustomData_bmesh_interp(&bm->ldata, blocks, w, NULL, source->len, target->head.data);
 	if (do_vertex) {
 		CustomData_bmesh_interp(&bm->vdata, vblocks, w, NULL, source->len, target->v->head.data);
-		BLI_array_free(vblocks);
+		BLI_array_fixedstack_free(vblocks);
 	}
+
+	BLI_array_fixedstack_free(cos);
+	BLI_array_fixedstack_free(w);
+	BLI_array_fixedstack_free(blocks);
 	
-	BLI_array_free(cos);
-	BLI_array_free(w);
-	BLI_array_free(blocks);
-	
 	if (do_multires) {
 		if (CustomData_has_layer(&bm->ldata, CD_MDISPS)) {
 			bmesh_loop_interp_mdisps(bm, target, source);
@@ -770,28 +775,29 @@
 void BM_vert_interp_from_face(BMesh *bm, BMVert *v, BMFace *source)
 {
 	BMLoop *l;
+	BMLoop *l_first;
 	void **blocks=NULL;
 	float (*cos)[3]=NULL, *w=NULL, cent[3] = {0.0f, 0.0f, 0.0f};
-	BLI_array_staticdeclare(cos,     BM_NGON_STACK_SIZE);
-	BLI_array_staticdeclare(w,       BM_NGON_STACK_SIZE);
-	BLI_array_staticdeclare(blocks,  BM_NGON_STACK_SIZE);
+	BLI_array_fixedstack_declare(cos,      BM_NGON_STACK_SIZE, source->len, __func__);
+	BLI_array_fixedstack_declare(w,        BM_NGON_STACK_SIZE, source->len, __func__);
+	BLI_array_fixedstack_declare(blocks,   BM_NGON_STACK_SIZE, source->len, __func__);
 	int i;
-	
-	l = bm_firstfaceloop(source);
+
+	i = 0;
+	l = l_first = bm_firstfaceloop(source);
 	do {
-		BLI_array_growone(cos);
-		copy_v3_v3(cos[BLI_array_count(cos)-1], l->v->co);
-		add_v3_v3(cent, cos[BLI_array_count(cos)-1]);
-		
-		BLI_array_append(w, 0.0f);
-		BLI_array_append(blocks, l->v->head.data);
-		l = l->next;
-	} while (l != bm_firstfaceloop(source));
+		copy_v3_v3(cos[i], l->v->co);
+		add_v3_v3(cent, cos[i]);
 
-	/*scale source face coordinates a bit, so points sitting directonly on an
-      edge will work.*/
+		w[i] = 0.0f;
+		blocks[i] = l->v->head.data;
+		i++;
+	} while ((l = l->next) != l_first);
+
+	/* scale source face coordinates a bit, so points sitting directonly on an
+     * edge will work.*/
 	mul_v3_fl(cent, 1.0f/(float)source->len);
-	for (i=0; i<source->len; i++) {
+	for (i = 0; i < source->len; i++) {
 		float vec[3];
 		sub_v3_v3v3(vec, cent, cos[i]);
 		mul_v3_fl(vec, 0.01);
@@ -802,9 +808,9 @@
 	interp_weights_poly_v3(w, cos, source->len, v->co);
 	CustomData_bmesh_interp(&bm->vdata, blocks, w, NULL, source->len, v->head.data);
 	
-	BLI_array_free(cos);
-	BLI_array_free(w);
-	BLI_array_free(blocks);
+	BLI_array_fixedstack_free(cos);
+	BLI_array_fixedstack_free(w);
+	BLI_array_fixedstack_free(blocks);
 }
 
 static void update_data_blocks(BMesh *bm, CustomData *olddata, CustomData *data)



More information about the Bf-blender-cvs mailing list