Revision: 18945
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18945
Author:   joeedh
Date:     2009-02-12 19:05:34 +0100 (Thu, 12 Feb 2009)

Log Message:
-----------
made extrude properly delete unneeded geometry

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenlib/intern/BLI_ghash.c
    branches/bmesh/blender/source/blender/blenlib/intern/BLI_mempool.c
    branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
    branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c
    branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c

Modified: branches/bmesh/blender/source/blender/blenlib/intern/BLI_ghash.c
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/intern/BLI_ghash.c    
2009-02-12 16:59:51 UTC (rev 18944)
+++ branches/bmesh/blender/source/blender/blenlib/intern/BLI_ghash.c    
2009-02-12 18:05:34 UTC (rev 18945)
@@ -33,6 +33,7 @@
 
 #include "MEM_guardedalloc.h"
 #include "BLI_ghash.h"
+#include "BLI_mempool.h"
 
 #include "BLO_sys_types.h" // for intptr_t support
 
@@ -63,6 +64,7 @@
        GHashCmpFP      cmpfp;
        
        Entry **buckets;
+       struct BLI_mempool *entrypool;
        int nbuckets, nentries, cursize;
 };
 
@@ -72,7 +74,8 @@
        GHash *gh= MEM_mallocN(sizeof(*gh), "GHash");
        gh->hashfp= hashfp;
        gh->cmpfp= cmpfp;
-       
+       gh->entrypool = BLI_mempool_create(sizeof(Entry), 1, 32);
+
        gh->cursize= 0;
        gh->nentries= 0;
        gh->nbuckets= hashsizes[gh->cursize];
@@ -85,7 +88,7 @@
 
 void BLI_ghash_insert(GHash *gh, void *key, void *val) {
        unsigned int hash= gh->hashfp(key)%gh->nbuckets;
-       Entry *e= malloc(sizeof(*e));
+       Entry *e= BLI_mempool_alloc(gh->entrypool);
 
        e->key= key;
        e->val= val;
@@ -141,7 +144,7 @@
 
                        if (keyfreefp) keyfreefp(e->key);
                        if (valfreefp) valfreefp(e->val);
-                       free(e);
+                       BLI_mempool_free(gh->entrypool, e);
 
 
                        e= n;
@@ -185,13 +188,14 @@
                        
                        if (keyfreefp) keyfreefp(e->key);
                        if (valfreefp) valfreefp(e->val);
-                       free(e);
+                       BLI_mempool_free(gh->entrypool, e);
                        
                        e= n;
                }
        }
        
        free(gh->buckets);
+       BLI_mempool_destroy(gh->entrypool);
        gh->buckets = 0;
        gh->nentries = 0;
        gh->nbuckets = 0;

Modified: branches/bmesh/blender/source/blender/blenlib/intern/BLI_mempool.c
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/intern/BLI_mempool.c  
2009-02-12 16:59:51 UTC (rev 18944)
+++ branches/bmesh/blender/source/blender/blenlib/intern/BLI_mempool.c  
2009-02-12 18:05:34 UTC (rev 18945)
@@ -65,7 +65,8 @@
        pool->chunks.first = pool->chunks.last = NULL;
        
        maxchunks = tote / pchunk;
-       
+       if (maxchunks==0) maxchunks = 1;
+
        /*allocate the actual chunks*/
        for(i=0; i < maxchunks; i++){
                BLI_mempool_chunk *mpchunk = 
MEM_mallocN(sizeof(BLI_mempool_chunk), "BLI_Mempool Chunk");
@@ -85,6 +86,7 @@
                /*set the end of this chunks memoryy to the new tail for next 
iteration*/
                lasttail = curnode;
        }
+       
        /*terminate the list*/
        curnode->next = NULL;
        return pool;

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h       
2009-02-12 16:59:51 UTC (rev 18944)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h       
2009-02-12 18:05:34 UTC (rev 18945)
@@ -180,6 +180,7 @@
 #define DEL_EDGESFACES 4
 #define DEL_FACES              5
 #define DEL_ALL                        6
+#define DEL_ONLYTAGGED         7
 
 /*BMOP_DEL_CONTEXT*/
 enum {

Modified: branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c       
2009-02-12 16:59:51 UTC (rev 18944)
+++ branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c       
2009-02-12 18:05:34 UTC (rev 18945)
@@ -339,22 +339,53 @@
        BMOperator *splitop = op;
        BMOperator dupeop;
        BMOperator delop;
+       BMVert *v;
+       BMEdge *e;
+       BMFace *f;
+       BMIter iter, iter2;
+       int found;
 
        /*initialize our sub-operators*/
        BMO_Init_Op(&dupeop, BMOP_DUPE);
        BMO_Init_Op(&delop, BMOP_DEL);
        
-       BMO_Set_Int(&delop, BMOP_DEL_CONTEXT, DEL_FACES);
-
        BMO_CopySlot(splitop, &dupeop, BMOP_SPLIT_MULTIN, BMOP_DUPE_MULTIN);
        BMO_Exec_Op(bm, &dupeop);
+       
+       BMO_Flag_Buffer(bm, splitop, BMOP_SPLIT_MULTIN, SPLIT_INPUT);
 
+       /*make sure to remove edges and verts we don't need.*/
+       for (e= BMIter_New(&iter, bm, BM_EDGES, NULL);e;e=BMIter_Step(&iter)) {
+               found = 0;
+               f = BMIter_New(&iter2, bm, BM_FACES_OF_EDGE, e);
+               for (; f; f=BMIter_Step(&iter2)) {
+                       if (!BMO_TestFlag(bm, f, SPLIT_INPUT)) {
+                               found = 1;
+                               break;
+                       }
+               }
+               if (!found) BMO_SetFlag(bm, e, SPLIT_INPUT);
+       }
+       
+       for (v= BMIter_New(&iter, bm, BM_VERTS, NULL);v;v=BMIter_Step(&iter)) {
+               found = 0;
+               e = BMIter_New(&iter2, bm, BM_EDGES_OF_VERT, v);
+               for (; e; e=BMIter_Step(&iter2)) {
+                       if (!BMO_TestFlag(bm, e, SPLIT_INPUT)) {
+                               found = 1;
+                               break;
+                       }
+               }
+               if (!found) BMO_SetFlag(bm, v, SPLIT_INPUT);
+
+       }
+
        /*connect outputs of dupe to delete, exluding keep geometry*/
-       BMO_Flag_Buffer(bm, splitop, BMOP_SPLIT_MULTIN, SPLIT_INPUT);
+       BMO_Set_Int(&delop, BMOP_DEL_CONTEXT, DEL_ONLYTAGGED);
        BMO_Unflag_Buffer(bm, splitop, BMOP_SPLIT_KEEPIN, SPLIT_INPUT);
        BMO_Flag_To_Slot(bm, &delop, BMOP_DEL_MULTIN, SPLIT_INPUT, BM_ALL);
        
-       //BMO_Exec_Op(bm, &delop);
+       BMO_Exec_Op(bm, &delop);
 
        /*now we make our outputs by copying the dupe outputs*/
        BMO_CopySlot(&dupeop, splitop, BMOP_DUPE_NEW, BMOP_SPLIT_MULTOUT);
@@ -464,7 +495,11 @@
        }
        else if(type == DEL_EDGESFACES) delete_edges(bm);
        else if(type == DEL_ONLYFACES) BM_remove_tagged_faces(bm, DEL_INPUT);
-       else if(type == DEL_FACES){
+       else if (type == DEL_ONLYTAGGED) {
+               BM_remove_tagged_faces(bm, DEL_INPUT);
+               BM_remove_tagged_edges(bm, DEL_INPUT);
+               BM_remove_tagged_verts(bm, DEL_INPUT);
+       } else if(type == DEL_FACES){
                /*go through and mark all edges and all verts of all faces for 
delete*/
                for(f = BMIter_New(&faces, bm, BM_FACES, bm); f; f = 
BMIter_Step(&faces)){
                        if(BMO_TestFlag(bm, (BMHeader*)f, DEL_INPUT)){

Modified: branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c  
2009-02-12 16:59:51 UTC (rev 18944)
+++ branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c  
2009-02-12 18:05:34 UTC (rev 18945)
@@ -26,7 +26,7 @@
        /*initialize our sub-operators*/
        BMO_Init_Op(&splitop, BMOP_SPLIT);
        
-       BMO_Flag_To_Slot(bm, op, BMOP_EXFACE_EDGEFACEIN, EXT_INPUT, BM_ALL);
+       BMO_Flag_Buffer(bm, op, BMOP_EXFACE_EDGEFACEIN, EXT_INPUT);
 
        /*calculate geometry to keep*/
        for (edge = BMIter_New(&iter, bm, BM_EDGES, NULL); edge; 
edge=BMIter_Step(&iter)) {
@@ -36,7 +36,11 @@
                        if (BMO_TestFlag(bm, f, EXT_INPUT)) rlen++;
                }
 
-               if (rlen < 2) BMO_SetFlag(bm, edge, EXT_KEEP);
+               if (rlen < 2) {
+                       BMO_SetFlag(bm, edge, EXT_KEEP);
+                       BMO_SetFlag(bm, edge->v1, EXT_KEEP);
+                       BMO_SetFlag(bm, edge->v2, EXT_KEEP);
+               }
        }
 
        BMO_CopySlot(op, &splitop, BMOP_EXFACE_EDGEFACEIN, BMOP_SPLIT_MULTIN);
@@ -50,7 +54,10 @@
        for (; edge; edge=BMO_IterStep(&siter)) {
                if (BMO_InMap(bm, op, BMOP_EXFACE_EXCLUDEMAP, edge)) continue;
 
-               newedge = *(BMEdge**)BMO_IterMapVal(&siter);
+               newedge = BMO_IterMapVal(&siter);
+               if (!newedge) continue;
+               newedge = *(BMEdge**)newedge;
+
                verts[0] = edge->v1;
                verts[1] = edge->v2;
                verts[2] = newedge->v2;


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

Reply via email to