Revision: 43631
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43631
Author:   campbellbarton
Date:     2012-01-23 13:25:06 +0000 (Mon, 23 Jan 2012)
Log Message:
-----------
improve editmode triangulation by re-using the loop array when
possiblem, this has to guess when the size is too big so as to re-
well.

If this isnt done, then the number of faces is used to allocate the
initial array to at least avoid many small allocs.

added BLI_array_reserve() to reserve elements and avoid reallocing many
small arrays when the loop starts.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/editderivedmesh.c
    branches/bmesh/blender/source/blender/blenlib/BLI_array.h

Modified: 
branches/bmesh/blender/source/blender/blenkernel/intern/editderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/editderivedmesh.c   
2012-01-23 13:15:40 UTC (rev 43630)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/editderivedmesh.c   
2012-01-23 13:25:06 UTC (rev 43631)
@@ -121,8 +121,34 @@
        BMLoop *l;
        int i = 0, j;
 
+#if 0
+       /* note, we could be clever and re-use this array but would need to 
ensure
+        * its realloced at some point, for now just free it */
        if (tm->looptris) MEM_freeN(tm->looptris);
 
+       /* Use tm->tottri when set, this means no reallocs while transforming,
+        * (unless scanfill fails), otherwise... */
+       /* allocate the length of totfaces, avoid many small reallocs,
+        * if all faces are tri's it will be correct, quads == 2x allocs */
+       BLI_array_reserve(looptris, (tm->tottri && tm->tottri < bm->totface * 
3) ? tm->tottri : bm->totface);
+#else
+
+       /* this means no reallocs for quad dominant models, for */
+       if ( (tm->looptris != NULL) &&
+            (tm->tottri != 0) &&
+            /* (totrti <= bm->totface * 2) would be fine for all quads,
+                 * but incase there are some ngons, still re-use the array */
+            (tm->tottri <= bm->totface * 3))
+       {
+               looptris = tm->looptris;
+       }
+       else {
+               if (tm->looptris) MEM_freeN(tm->looptris);
+               BLI_array_reserve(looptris, bm->totface);
+       }
+
+#endif
+
        f = BMIter_New(&iter, bm, BM_FACES_OF_MESH, NULL);
        for ( ; f; f=BMIter_Step(&iter)) {
                /*don't consider two-edged faces*/
@@ -168,6 +194,7 @@
                        EditVert *v, *lastv=NULL, *firstv=NULL;
                        EditEdge *e;
                        EditFace *efa;
+                       int totfilltri;
 
                        BLI_begin_edgefill();
                        /*scanfill time*/
@@ -190,15 +217,14 @@
                        /*complete the loop*/
                        BLI_addfilledge(firstv, v);
 
-                       BLI_edgefill(2);
+                       totfilltri = BLI_edgefill(2);
+                       BLI_array_growitems(looptris, totfilltri);
 
                        for (efa = fillfacebase.first; efa; efa=efa->next) {
                                BMLoop *l1= efa->v1->tmp.p;
                                BMLoop *l2= efa->v2->tmp.p;
                                BMLoop *l3= efa->v3->tmp.p;
 
-                               BLI_array_growone(looptris);
-
                                if (BM_GetIndex(l1) > BM_GetIndex(l2)) { 
SWAP(BMLoop*, l1, l2); }
                                if (BM_GetIndex(l2) > BM_GetIndex(l3)) { 
SWAP(BMLoop*, l2, l3); }
                                if (BM_GetIndex(l1) > BM_GetIndex(l2)) { 
SWAP(BMLoop*, l1, l2); }

Modified: branches/bmesh/blender/source/blender/blenlib/BLI_array.h
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/BLI_array.h   2012-01-23 
13:15:40 UTC (rev 43630)
+++ branches/bmesh/blender/source/blender/blenlib/BLI_array.h   2012-01-23 
13:25:06 UTC (rev 43631)
@@ -140,6 +140,10 @@
        (&arr[_##arr##_count - 1])                                              
  \
 )
 
+#define BLI_array_reserve(arr, num)                                           \
+       BLI_array_growitems(arr, num), (void)(_##arr##_count -= num)
+
+
 #define BLI_array_free(arr)                                                   \
        if (arr && (char *)arr != _##arr##_static) {                            
  \
            BLI_array_fake_user(arr);                                           
  \

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

Reply via email to