[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53234] trunk/blender/source/blender: speedup for face tessellation:

Campbell Barton ideasman42 at gmail.com
Fri Dec 21 08:24:36 CET 2012


Revision: 53234
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53234
Author:   campbellbarton
Date:     2012-12-21 07:24:31 +0000 (Fri, 21 Dec 2012)
Log Message:
-----------
speedup for face tessellation:
- quads, tris now use direct pointer access rather then iterators.
- for ngons also avoid iterator, just loop over the loops.

also minor change, use floorf rather then floor for ED_view3d_project_short_ex, ED_view3d_project_int_ex

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
    trunk/blender/source/blender/editors/space_view3d/view3d_project.c

Modified: trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c	2012-12-21 06:17:20 UTC (rev 53233)
+++ trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c	2012-12-21 07:24:31 UTC (rev 53234)
@@ -115,10 +115,10 @@
 	BMesh *bm = em->bm;
 	BMLoop *(*looptris)[3] = NULL;
 	BLI_array_declare(looptris);
-	BMIter iter, liter;
+	BMIter iter;
 	BMFace *efa;
 	BMLoop *l;
-	int i = 0, j;
+	int i = 0;
 
 	ScanFillContext sf_ctx;
 
@@ -161,16 +161,29 @@
 		/* no need to ensure the loop order, we know its ok */
 
 		else if (efa->len == 3) {
+#if 0
+			int j;
 			BLI_array_grow_one(looptris);
 			BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, j) {
 				looptris[i][j] = l;
 			}
 			i += 1;
+#else
+			/* more cryptic but faster */
+			BLI_array_grow_one(looptris);
+			{
+				BMLoop **l_ptr = looptris[i++];
+				l_ptr[0] = l = BM_FACE_FIRST_LOOP(efa);
+				l_ptr[1] = l = l->next;
+				l_ptr[2] = l->next;
+			}
+#endif
 		}
 		else if (efa->len == 4) {
+#if 0
 			BMLoop *ltmp[4];
+			int j;
 			BLI_array_grow_items(looptris, 2);
-
 			BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, j) {
 				ltmp[j] = l;
 			}
@@ -184,11 +197,27 @@
 			looptris[i][1] = ltmp[2];
 			looptris[i][2] = ltmp[3];
 			i += 1;
+#else
+			/* more cryptic but faster */
+			BLI_array_grow_items(looptris, 2);
+			{
+				BMLoop **l_ptr_a = looptris[i++];
+				BMLoop **l_ptr_b = looptris[i++];
+				(l_ptr_a[0] = l_ptr_b[0] = l = BM_FACE_FIRST_LOOP(efa));
+				(l_ptr_a[1]              = l = l->next);
+				(l_ptr_a[2] = l_ptr_b[1] = l = l->next);
+				(             l_ptr_b[2] = l->next);
+			}
+#endif
 		}
 
 #endif /* USE_TESSFACE_SPEEDUP */
 
 		else {
+			int j;
+			BMLoop *l_iter;
+			BMLoop *l_first;
+
 			ScanFillVert *sf_vert, *sf_vert_last = NULL, *sf_vert_first = NULL;
 			/* ScanFillEdge *e; */ /* UNUSED */
 			ScanFillFace *sf_tri;
@@ -197,21 +226,26 @@
 			BLI_scanfill_begin(&sf_ctx);
 
 			/* scanfill time */
-			BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, j) {
-				/*mark order */
-				BM_elem_index_set(l, j); /* set_loop */
+			j = 0;
+			l_iter = l_first = BM_FACE_FIRST_LOOP(efa);
+			do {
+				sf_vert = BLI_scanfill_vert_add(&sf_ctx, l_iter->v->co);
+				sf_vert->tmp.p = l_iter;
 
-				sf_vert = BLI_scanfill_vert_add(&sf_ctx, l->v->co);
-				sf_vert->tmp.p = l;
-
 				if (sf_vert_last) {
 					/* e = */ BLI_scanfill_edge_add(&sf_ctx, sf_vert_last, sf_vert);
 				}
 
 				sf_vert_last = sf_vert;
-				if (sf_vert_first == NULL) sf_vert_first = sf_vert;
-			}
+				if (sf_vert_first == NULL) {
+					sf_vert_first = sf_vert;
+				}
 
+				/*mark order */
+				BM_elem_index_set(l_iter, j++); /* set_loop */
+
+			} while ((l_iter = l_iter->next) != l_first);
+
 			/* complete the loop */
 			BLI_scanfill_edge_add(&sf_ctx, sf_vert_first, sf_vert);
 

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_project.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_project.c	2012-12-21 06:17:20 UTC (rev 53233)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_project.c	2012-12-21 07:24:31 UTC (rev 53234)
@@ -172,8 +172,8 @@
 		if ((tvec[0] > -32700.0f && tvec[0] < 32700.0f) &&
 		    (tvec[1] > -32700.0f && tvec[1] < 32700.0f))
 		{
-			r_co[0] = (short)floor(tvec[0]);
-			r_co[1] = (short)floor(tvec[1]);
+			r_co[0] = (short)floorf(tvec[0]);
+			r_co[1] = (short)floorf(tvec[1]);
 		}
 		else {
 			ret = V3D_PROJ_RET_OVERFLOW;
@@ -191,8 +191,8 @@
 		if ((tvec[0] > -2140000000.0f && tvec[0] < 2140000000.0f) &&
 		    (tvec[1] > -2140000000.0f && tvec[1] < 2140000000.0f))
 		{
-			r_co[0] = (int)floor(tvec[0]);
-			r_co[1] = (int)floor(tvec[1]);
+			r_co[0] = (int)floorf(tvec[0]);
+			r_co[1] = (int)floorf(tvec[1]);
 		}
 		else {
 			ret = V3D_PROJ_RET_OVERFLOW;




More information about the Bf-blender-cvs mailing list