Revision: 19313
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19313
Author:   joeedh
Date:     2009-03-16 15:52:30 +0100 (Mon, 16 Mar 2009)

Log Message:
-----------
made editmesh use mempools, though editmesh customdata does not.  this was a 
major slowdown in bmesh<-> editmesh conversion (even more so then the mf euler, 
which may not be that bad after all).

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenlib/BLI_editVert.h
    branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh.c

Modified: branches/bmesh/blender/source/blender/blenlib/BLI_editVert.h
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/BLI_editVert.h        
2009-03-16 14:15:18 UTC (rev 19312)
+++ branches/bmesh/blender/source/blender/blenlib/BLI_editVert.h        
2009-03-16 14:52:30 UTC (rev 19313)
@@ -42,6 +42,7 @@
 
 struct DerivedMesh;
 struct RetopoPaintData;
+struct BLI_mempool;
 
 /* note; changing this also might affect the undo copy in editmesh.c */
 typedef struct EditVert
@@ -153,6 +154,8 @@
        HashEdge *hashedgetab;
        
        /* this is for the editmesh_fastmalloc */
+       struct BLI_mempool *vertpool, *edgepool, *facepool;
+
        EditVert *allverts, *curvert;
        EditEdge *alledges, *curedge;
        EditFace *allfaces, *curface;

Modified: branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c      
2009-03-16 14:15:18 UTC (rev 19312)
+++ branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c      
2009-03-16 14:52:30 UTC (rev 19313)
@@ -382,11 +382,15 @@
 
        /*copy face corner data*/
        CustomData_to_bmeshpoly(&em->fdata, &bm->pdata, &bm->ldata);
-       /*initialize memory pools*/
+       
+       /*EVIL HACK WARNING: this uses a fixed size for the customdata
+         blocks, when it should be more smart about it.
+         initialize customdata memory pools*/
        CustomData_bmesh_init_pool(&bm->vdata, allocsize[0]);
        CustomData_bmesh_init_pool(&bm->edata, allocsize[1]);
        CustomData_bmesh_init_pool(&bm->ldata, allocsize[2]);
        CustomData_bmesh_init_pool(&bm->pdata, allocsize[3]);
+
        /*needed later*/
        numTex = CustomData_number_of_layers(&bm->pdata, CD_MTEXPOLY);
        numCol = CustomData_number_of_layers(&bm->ldata, CD_MLOOPCOL);

Modified: branches/bmesh/blender/source/blender/editors/mesh/editmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/editmesh.c       
2009-03-16 14:15:18 UTC (rev 19312)
+++ branches/bmesh/blender/source/blender/editors/mesh/editmesh.c       
2009-03-16 14:52:30 UTC (rev 19313)
@@ -53,6 +53,7 @@
 #include "BLI_editVert.h"
 #include "BLI_dynstr.h"
 #include "BLI_rand.h"
+#include "BLI_mempool.h"
 
 #include "BKE_cloth.h"
 #include "BKE_context.h"
@@ -112,22 +113,21 @@
 
 /* ************ ADD / REMOVE / FIND ****************** */
 
-static void *calloc_em(EditMesh *em, size_t size, size_t nr)
-{
-       return calloc(size, nr);
+static void init_editMesh(EditMesh *em) {
+       if (!em->vertpool) em->vertpool = BLI_mempool_create(sizeof(EditVert), 
1, 512);
+       if (!em->edgepool) em->edgepool = BLI_mempool_create(sizeof(EditEdge), 
1, 512);
+       if (!em->facepool) em->facepool = BLI_mempool_create(sizeof(EditFace), 
1, 512);
 }
 
-/* used to bypass normal calloc with fast one */
-static void *(*callocvert)(EditMesh *, size_t, size_t) = calloc_em;
-static void *(*callocedge)(EditMesh *, size_t, size_t) = calloc_em;
-static void *(*callocface)(EditMesh *, size_t, size_t) = calloc_em;
-
 EditVert *addvertlist(EditMesh *em, float *vec, EditVert *example)
 {
        EditVert *eve;
        static int hashnr= 0;
+       
+       if (!em->vertpool) init_editMesh(em);
 
-       eve= callocvert(em, sizeof(EditVert), 1);
+       eve= BLI_mempool_calloc(em->vertpool);
+
        BLI_addtail(&em->verts, eve);
        em->totvert++;
        
@@ -157,8 +157,7 @@
 
        EM_remove_selection(em, eve, EDITVERT);
        CustomData_em_free_block(&em->vdata, &eve->data);
-       if(eve->fast==0)
-               free(eve);
+       BLI_mempool_free(em->vertpool, eve);
        
        em->totvert--;
 }
@@ -256,11 +255,12 @@
        }
        
        /* find in hashlist */
+       if (!em->edgepool) init_editMesh(em);
        eed= findedgelist(em, v1, v2);
 
        if(eed==NULL) {
        
-               eed= (EditEdge *)callocedge(em, sizeof(EditEdge), 1);
+               eed= (EditEdge *)BLI_mempool_calloc(em->edgepool);
                eed->v1= v1;
                eed->v2= v2;
                BLI_addtail(&em->edges, eed);
@@ -293,9 +293,8 @@
 void free_editedge(EditMesh *em, EditEdge *eed)
 {
        EM_remove_selection(em, eed, EDITEDGE);
-       if(eed->fast==0){ 
-               free(eed);
-       }
+
+       BLI_mempool_free(em->edgepool, eed);
 }
 
 void free_editface(EditMesh *em, EditFace *efa)
@@ -307,8 +306,7 @@
        }
                
        CustomData_em_free_block(&em->fdata, &efa->data);
-       if(efa->fast==0)
-               free(efa);
+       BLI_mempool_free(em->facepool, efa);
        
        em->totface--;
 }
@@ -384,7 +382,9 @@
        if(v1==v2 || v2==v3 || v1==v3) return NULL;
        if(e2==0) return NULL;
 
-       efa= (EditFace *)callocface(em, sizeof(EditFace), 1);
+       if (!em->facepool) init_editMesh(em);
+       efa= (EditFace *)BLI_mempool_calloc(em->facepool);
+
        efa->v1= v1;
        efa->v2= v2;
        efa->v3= v3;
@@ -467,57 +467,6 @@
 
 /* ************************ stuct EditMesh manipulation 
***************************** */
 
-/* fake callocs for fastmalloc below */
-static void *calloc_fastvert(EditMesh *em, size_t size, size_t nr)
-{
-       EditVert *eve= em->curvert++;
-       eve->fast= 1;
-       return eve;
-}
-static void *calloc_fastedge(EditMesh *em, size_t size, size_t nr)
-{
-       EditEdge *eed= em->curedge++;
-       eed->fast= 1;
-       return eed;
-}
-static void *calloc_fastface(EditMesh *em, size_t size, size_t nr)
-{
-       EditFace *efa= em->curface++;
-       efa->fast= 1;
-       return efa;
-}
-
-/* allocate 1 chunk for all vertices, edges, faces. These get tagged to
-   prevent it from being freed
-*/
-static void init_editmesh_fastmalloc(EditMesh *em, int totvert, int totedge, 
int totface)
-{
-       if(totvert) em->allverts= MEM_callocN(totvert*sizeof(EditVert), 
"allverts");
-       else em->allverts= NULL;
-       em->curvert= em->allverts;
-       
-       if(totedge==0) totedge= 4*totface;      // max possible
-
-       if(totedge) em->alledges= MEM_callocN(totedge*sizeof(EditEdge), 
"alledges");
-       else em->alledges= NULL;
-       em->curedge= em->alledges;
-       
-       if(totface) em->allfaces= MEM_callocN(totface*sizeof(EditFace), 
"allfaces");
-       else em->allfaces= NULL;
-       em->curface= em->allfaces;
-
-       callocvert= calloc_fastvert;
-       callocedge= calloc_fastedge;
-       callocface= calloc_fastface;
-}
-
-static void end_editmesh_fastmalloc(void)
-{
-       callocvert= calloc_em;
-       callocedge= calloc_em;
-       callocface= calloc_em;
-}
-
 void set_editMesh(EditMesh *dst, EditMesh *src)
 {
        free_editMesh(dst);
@@ -533,7 +482,12 @@
        if(em->edges.first) free_edgelist(em, &em->edges);
        if(em->faces.first) free_facelist(em, &em->faces);
        if(em->selected.first) BLI_freelistN(&(em->selected));
-
+       
+       if (em->vertpool) BLI_mempool_destroy(em->vertpool);
+       if (em->edgepool) BLI_mempool_destroy(em->edgepool);
+       if (em->facepool) BLI_mempool_destroy(em->facepool);
+       em->vertpool = em->edgepool = em->facepool = NULL;
+       
        CustomData_free(&em->vdata, 0);
        CustomData_free(&em->fdata, 0);
 
@@ -857,9 +811,6 @@
                return;
        }
        
-       /* initialize fastmalloc for editmesh */
-       init_editmesh_fastmalloc(em, me->totvert, me->totedge, me->totface);
-
        actkey = ob_get_keyblock(ob);
        if(actkey) {
                tot= actkey->totelem;
@@ -985,8 +936,6 @@
                error("This Mesh has old style edgecodes, please put it in the 
bugtracker!");
        
        MEM_freeN(evlist);
-
-       end_editmesh_fastmalloc();      // resets global function pointers
        
        if(me->mselect){
                //restore editselections
@@ -1822,8 +1771,6 @@
        memset(em, 0, sizeof(EditMesh));
                
        em->selectmode = um->selectmode;
-       
-       init_editmesh_fastmalloc(em, um->totvert, um->totedge, um->totface);
 
        CustomData_free(&em->vdata, 0);
        CustomData_free(&em->edata, 0);
@@ -1881,7 +1828,6 @@
                CustomData_to_em_block(&um->fdata, &em->fdata, a, &efa->data);
        }
        
-       end_editmesh_fastmalloc();
        if(evar) MEM_freeN(evar);
        
        em->totvert = um->totvert;


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to