[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18974] branches/bmesh/blender/source/ blender: extrude uses dupe/delete rather then split, and it detects when to not delete geometry ( though this could be smarter in the future).
Joseph Eagar
joeedh at gmail.com
Sun Feb 15 01:47:23 CET 2009
Revision: 18974
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18974
Author: joeedh
Date: 2009-02-15 01:47:19 +0100 (Sun, 15 Feb 2009)
Log Message:
-----------
extrude uses dupe/delete rather then split, and it detects when to not delete geometry (though this could be smarter in the future). also BMO_pop had two lines out of order, which was causing flags layer to not always be freed when they should.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/bmesh/bmesh.h
branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h
branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c
branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c
branches/bmesh/blender/source/blender/editors/mesh/editmesh_tools.c
Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h 2009-02-14 23:21:39 UTC (rev 18973)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h 2009-02-15 00:47:19 UTC (rev 18974)
@@ -79,10 +79,10 @@
typedef struct BMHeader {
struct BMHeader *next, *prev;
- int EID; /*Consider removing this/making it ifdeffed for debugging*/
+ int EID; /*Consider removing this/making it ifdeffed for debugging*/
int flag, type;
- int eflag1, eflag2; /*Flags used by eulers. Try and get rid of/minimize some of these*/
- struct BMFlagLayer *flags; /*Dynamically allocated block of flag layers for operators to use*/
+ int eflag1, eflag2; /*Flags used by eulers. Try and get rid of/minimize some of these*/
+ struct BMFlagLayer *flags; /*Dynamically allocated block of flag layers for operators to use*/
} BMHeader;
typedef struct BMFlagLayer {
Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h 2009-02-14 23:21:39 UTC (rev 18973)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h 2009-02-15 00:47:19 UTC (rev 18974)
@@ -25,12 +25,13 @@
#define BM_FACEVERTS_OF_FACE 9
#define BM_EDGES_OF_FACE 10
#define BM_LOOPS_OF_FACE 11
+#define BM_LOOPS_OF_VERT 12
/*Iterator Structure*/
typedef struct BMIter{
struct BMVert *firstvert, *nextvert, *vdata;
struct BMEdge *firstedge, *nextedge, *edata;
- struct BMLoop *firstloop, *nextloop, *ldata;
+ struct BMLoop *firstloop, *nextloop, *ldata, *l;
struct BMFace *firstpoly, *nextpoly, *pdata;
struct BMesh *bm;
void (*begin)(struct BMIter *iter);
Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h 2009-02-14 23:21:39 UTC (rev 18973)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h 2009-02-15 00:47:19 UTC (rev 18974)
@@ -146,7 +146,6 @@
enum {
BMOP_SPLIT_MULTIN,
- BMOP_SPLIT_KEEPIN, //input list of geometry to keep
BMOP_SPLIT_MULTOUT,
BMOP_SPLIT_BOUNDS_EDGEMAP, //bounding edges of split faces
BMOP_SPLIT_TOTSLOT,
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c 2009-02-14 23:21:39 UTC (rev 18973)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c 2009-02-15 00:47:19 UTC (rev 18974)
@@ -274,6 +274,51 @@
}
/*
+ * LOOPS OF VERT CALLBACKS
+ *
+ */
+/*
+ BMEdge *current = iter->nextedge;
+
+ if(iter->nextedge)
+ iter->nextedge = bmesh_disk_nextedge(iter->nextedge, iter->vdata);
+
+ if(iter->nextedge == iter->firstedge) iter->nextedge = NULL;
+
+ return current;
+*/
+
+
+static void loop_of_vert_begin(BMIter *iter)
+{
+ init_iterator(iter);
+ iter->firstedge = iter->vdata->edge;
+ if (!iter->vdata->edge) return NULL;
+
+ iter->firstloop = iter->nextloop = iter->vdata->edge->loop;
+ iter->l = iter->firstloop;
+}
+
+static void *loop_of_vert_step(BMIter *iter)
+{
+ BMLoop *current = iter->nextloop;
+
+ if(iter->nextloop) {
+ iter->nextloop = bmesh_radial_nextloop(iter->nextloop);
+ if (iter->nextloop == iter->l) {
+ iter->nextloop = bmesh_disk_nextedge(iter->nextloop->e,
+ iter->vdata)->loop;
+ iter->l = iter->nextloop;
+
+ if (iter->nextloop->e == iter->firstedge)
+ iter->nextloop = NULL;
+ }
+ }
+
+ return current;
+}
+
+/*
* BMESH ITERATOR INIT
*
* Takes a bmesh iterator structure and fills
@@ -333,6 +378,12 @@
iter->begin = loop_of_face_begin;
iter->step = loop_of_face_step;
iter->pdata = data;
+ break;
+ case BM_LOOPS_OF_VERT:
+ iter->begin = loop_of_vert_begin;
+ iter->step = loop_of_vert_step;
+ iter->vdata = data;
+ break;
default:
break;
}
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2009-02-14 23:21:39 UTC (rev 18973)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2009-02-15 00:47:19 UTC (rev 18974)
@@ -87,7 +87,7 @@
};
BMOpDefine def_splitop = {
- {BMOP_OPSLOT_PNT_BUF, BMOP_OPSLOT_PNT_BUF,
+ {BMOP_OPSLOT_PNT_BUF,
BMOP_OPSLOT_PNT_BUF, BMOP_OPSLOT_MAPPING},
splitop_exec,
BMOP_SPLIT_TOTSLOT,
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c 2009-02-14 23:21:39 UTC (rev 18973)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c 2009-02-15 00:47:19 UTC (rev 18974)
@@ -68,9 +68,10 @@
*/
void BMO_pop(BMesh *bm)
{
- bm->stackdepth--;
if(bm->stackdepth > 1)
free_flag_layer(bm);
+
+ bm->stackdepth--;
}
/*
@@ -699,17 +700,17 @@
/*now go through and memcpy all the flags*/
for(v = BMIter_New(&verts, bm, BM_VERTS, bm); v; v = BMIter_Step(&verts)){
oldflags = v->head.flags;
- v->head.flags = BLI_mempool_alloc(bm->flagpool);
+ v->head.flags = BLI_mempool_calloc(bm->flagpool);
memcpy(v->head.flags, oldflags, sizeof(BMFlagLayer)*bm->totflags); /*correct?*/
}
for(e = BMIter_New(&edges, bm, BM_EDGES, bm); e; e = BMIter_Step(&edges)){
oldflags = e->head.flags;
- e->head.flags = BLI_mempool_alloc(bm->flagpool);
+ e->head.flags = BLI_mempool_calloc(bm->flagpool);
memcpy(e->head.flags, oldflags, sizeof(BMFlagLayer)*bm->totflags);
}
for(f = BMIter_New(&faces, bm, BM_FACES, bm); f; f = BMIter_Step(&faces)){
oldflags = f->head.flags;
- f->head.flags = BLI_mempool_alloc(bm->flagpool);
+ f->head.flags = BLI_mempool_calloc(bm->flagpool);
memcpy(f->head.flags, oldflags, sizeof(BMFlagLayer)*bm->totflags);
}
@@ -728,13 +729,13 @@
/*now go through and memcpy all the flags*/
for(v = BMIter_New(&verts, bm, BM_VERTS, bm); v; v = BMIter_Step(&verts)){
- memset(v->head.flags, 0, sizeof(BMFlagLayer)*bm->totflags);
+ memset(v->head.flags+bm->totflags-1, 0, sizeof(BMFlagLayer));
}
for(e = BMIter_New(&edges, bm, BM_EDGES, bm); e; e = BMIter_Step(&edges)){
- memset(e->head.flags, 0, sizeof(BMFlagLayer)*bm->totflags);
+ memset(e->head.flags+bm->totflags-1, 0, sizeof(BMFlagLayer));
}
for(f = BMIter_New(&faces, bm, BM_FACES, bm); f; f = BMIter_Step(&faces)){
- memset(f->head.flags, 0, sizeof(BMFlagLayer)*bm->totflags);
+ memset(f->head.flags+bm->totflags-1, 0, sizeof(BMFlagLayer));
}
}
Modified: branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c 2009-02-14 23:21:39 UTC (rev 18973)
+++ branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c 2009-02-15 00:47:19 UTC (rev 18974)
@@ -381,8 +381,7 @@
}
/*connect outputs of dupe to delete, exluding keep geometry*/
- BMO_Set_Int(&delop, BMOP_DEL_CONTEXT, DEL_ONLYTAGGED);
- BMO_Unflag_Buffer(bm, splitop, BMOP_SPLIT_KEEPIN, SPLIT_INPUT);
+ BMO_Set_Int(&delop, BMOP_DEL_CONTEXT, DEL_FACES);
BMO_Flag_To_Slot(bm, &delop, BMOP_DEL_MULTIN, SPLIT_INPUT, BM_ALL);
BMO_Exec_Op(bm, &delop);
Modified: branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c 2009-02-14 23:21:39 UTC (rev 18973)
+++ branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c 2009-02-15 00:47:19 UTC (rev 18974)
@@ -12,55 +12,87 @@
#define EXT_INPUT 1
#define EXT_KEEP 2
+#define EXT_DEL 4
void extrude_edge_context_exec(BMesh *bm, BMOperator *op)
{
- BMOperator splitop;
+ BMOperator dupeop, delop;
BMOIter siter;
- BMIter iter, fiter;
- BMEdge *edge, *newedge;
+ BMIter iter, fiter, viter;
+ BMEdge *e, *newedge, *e2;
BMLoop *l, *l2;
- BMVert *verts[4];
+ BMVert *verts[4], *v;
BMFace *f;
- int totflagged, rlen;
+ int rlen, found, delorig=0, i;
/*initialize our sub-operators*/
- BMO_Init_Op(&splitop, BMOP_SPLIT);
+ BMO_Init_Op(&dupeop, BMOP_DUPE);
+ BMO_Init_Op(&delop, BMOP_DEL);
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)) {
- f = BMIter_New(&fiter, bm, BM_FACES_OF_EDGE, edge);
- rlen = 0;
- for (; f; f=BMIter_Step(&fiter)) {
- if (BMO_TestFlag(bm, f, EXT_INPUT)) rlen++;
+#if 1
+ for (e=BMIter_New(&iter, bm, BM_EDGES, NULL);e;e=BMIter_Step(&iter)) {
+ found = 0;
+ f = BMIter_New(&fiter, bm, BM_FACES_OF_EDGE, e);
+ for (rlen=0; f; f=BMIter_Step(&fiter), rlen++) {
+ if (!BMO_TestFlag(bm, f, EXT_INPUT)) {
+ found = 1;
+ delorig = 1;
+ break;
+ }
}
+
+ if (!found && (rlen > 1)) BMO_SetFlag(bm, e, EXT_DEL);
+ }
- if (rlen < 2) {
- BMO_SetFlag(bm, edge, EXT_KEEP);
- BMO_SetFlag(bm, edge->v1, EXT_KEEP);
- BMO_SetFlag(bm, edge->v2, EXT_KEEP);
+ /*calculate verts to delete*/
+ for (v = BMIter_New(&iter, bm, BM_VERTS, NULL); v; v=BMIter_Step(&iter)) {
+ found = 0;
+
+ l = BMIter_New(&viter, bm, BM_LOOPS_OF_VERT, v);
+ for (; l; l=BMIter_Step(&viter)) {
+ if (!BMO_TestFlag(bm, l->e, EXT_INPUT)) {
+ found = 1;
+ break;
+ }
+ if (!BMO_TestFlag(bm, l->f, EXT_INPUT)) {
+ found = 1;
+ break;
+ }
+
+ if (found) break;
}
+
+ if (!found) {
+ BMO_SetFlag(bm, v, EXT_DEL);
+ }
}
-
- BMO_CopySlot(op, &splitop, BMOP_EXFACE_EDGEFACEIN, BMOP_SPLIT_MULTIN);
- BMO_Flag_To_Slot(bm, &splitop, BMOP_SPLIT_KEEPIN, EXT_KEEP, BM_ALL);
- BMO_Exec_Op(bm, &splitop);
+ for (f=BMIter_New(&fiter, bm, BM_FACES, NULL); f; f=BMIter_Step(&fiter)) {
+ if (BMO_TestFlag(bm, f, EXT_INPUT))
+ BMO_SetFlag(bm, f, EXT_DEL);
+ }
+#endif
+ if (delorig) BMO_Flag_To_Slot(bm, &delop, BMOP_DEL_MULTIN, EXT_DEL, BM_ALL);
+ BMO_Set_Int(&delop, BMOP_DEL_CONTEXT, DEL_ONLYTAGGED);
- BMO_CopySlot(&splitop, op, BMOP_SPLIT_MULTOUT, BMOP_EXFACE_MULTOUT);
+ BMO_CopySlot(op, &dupeop, BMOP_EXFACE_EDGEFACEIN, BMOP_DUPE_MULTIN);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list