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;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to