Revision: 19255
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19255
Author: joeedh
Date: 2009-03-11 06:13:36 +0100 (Wed, 11 Mar 2009)
Log Message:
-----------
implemented an (edge) loop walker. note I misunderstood
how original edge loop worked, and made it so if it starts
at a boundary edge, it walks across the boundary. I'm not
sure if this is bad, most of the time I do that I want it
to do that anyway.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/bmesh/bmesh.h
branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h
branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c
branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c
branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c
Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h 2009-03-11 02:58:18 UTC
(rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h 2009-03-11 05:13:36 UTC
(rev 19255)
@@ -209,7 +209,9 @@
//void bmesh_data_interp_from_face(struct BMesh *bm, struct BMFace *source,
struct BMFace *target);
struct EditMesh;
+struct BMOperator;
BMesh *editmesh_to_bmesh(struct EditMesh *em);
+BMesh *init_editmesh_to_bmesh(struct EditMesh *em, struct BMOperator *op);
struct EditMesh *bmesh_to_editmesh(BMesh *bm);
/*include the rest of the API*/
Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
2009-03-11 02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
2009-03-11 05:13:36 UTC (rev 19255)
@@ -55,6 +55,11 @@
/*editmesh->bmesh op*/
enum {
BMOP_FROM_EDITMESH_EM, /*em*/
+
+ /*maps old elements to new ones.
+ coud do new elements to old too,
+ in the future*/
+ BMOP_FROM_EDITMESH_MAP,
BMOP_FROM_EDITMESH_TOTSLOT,
};
Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h 2009-03-11
02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h 2009-03-11
05:13:36 UTC (rev 19255)
@@ -33,4 +33,5 @@
int BM_Edge_Share_Faces(struct BMEdge *e1, struct BMEdge *e2);
int BM_Validate_Face(BMesh *bm, BMFace *face, FILE *err);
int BM_FacesAroundEdge(BMEdge *e);
+int BM_EdgesAroundVert(BMVert *v);
#endif
Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h 2009-03-11
02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h 2009-03-11
05:13:36 UTC (rev 19255)
@@ -39,11 +39,11 @@
*/
#define BMW_SHELL 0
-/*#define BMW_LOOP 1
-#define BMW_RING 2
+#define BMW_LOOP 1
+/*#define BMW_RING 2
#define BMW_UVISLANDS 3*/
-#define BMW_ISLANDBOUND 1
-#define BMW_ISLAND 2
-#define BMW_MAXWALKERS 3
+#define BMW_ISLANDBOUND 2
+#define BMW_ISLAND 3
+#define BMW_MAXWALKERS 4
#endif
\ No newline at end of file
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
2009-03-11 02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
2009-03-11 05:13:36 UTC (rev 19255)
@@ -240,6 +240,11 @@
}
}
+ if (j != len) {
+ /*sanity check*/
+ return NULL;
+ }
+
overlap = BM_Exist_Face_Overlaps(bm, verts, len, &f);
/*clear flags*/
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
2009-03-11 02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
2009-03-11 05:13:36 UTC (rev 19255)
@@ -76,17 +76,17 @@
BMOpDefine def_edit2bmesh = {
"editmesh_to_bmesh",
- {{BMOP_OPSLOT_PNT, "emout"}},
+ {{BMOP_OPSLOT_PNT, "em"}, {BMOP_OPSLOT_MAPPING, "map"}},
edit2bmesh_exec,
- BMOP_TO_EDITMESH_TOTSLOT,
+ BMOP_FROM_EDITMESH_TOTSLOT,
0
};
BMOpDefine def_bmesh2edit = {
"bmesh_to_editmesh",
- {{BMOP_OPSLOT_PNT, "em"}},
+ {{BMOP_OPSLOT_PNT, "emout"}},
bmesh2edit_exec,
- BMOP_FROM_EDITMESH_TOTSLOT,
+ BMOP_TO_EDITMESH_TOTSLOT,
0
};
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
2009-03-11 02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
2009-03-11 05:13:36 UTC (rev 19255)
@@ -395,18 +395,23 @@
if (testedgeside(v1, v2, v3)) return 0;
- for (i=0; i<nvert; i++) {
- if (i == v1i || i == v2i || i == v3i) continue;
+ //for (i=0; i<nvert; i++) {
+ do {
+ i = l->v->head.eflag2;
+ if (i == v1i || i == v2i || i == v3i) {
+ l = l->head.next;
+ continue;
+ }
- VECCOPY(pv1, projectverts[i]); //l->v->head.eflag2]);
- VECCOPY(pv2, projectverts[(i+1) % nvert]);
//((BMLoop*)l->head.next)->v->head.eflag2]);
+ VECCOPY(pv1, projectverts[l->v->head.eflag2]);
+ VECCOPY(pv2,
projectverts[((BMLoop*)l->head.next)->v->head.eflag2]);
//if (linecrosses(pv1, pv2, v1, v3)) return 0;
if (point_in_triangle(v1, v2, v3, pv1)) return 0;
if (point_in_triangle(v3, v2, v1, pv1)) return 0;
- //l = l->head.next;
- } //while (l != f->loopbase);
+ l = l->head.next;
+ } while (l != f->loopbase);
return 1;
}
/*
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
2009-03-11 02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
2009-03-11 05:13:36 UTC (rev 19255)
@@ -36,6 +36,12 @@
return 0;
}
+int BM_EdgesAroundVert(BMVert *v)
+{
+ if (v == v->edge->v1) return bmesh_cycle_length(&v->edge->d1);
+ else return bmesh_cycle_length(&v->edge->d2);
+}
+
/*
* BMESH VERT IN EDGE
*
@@ -52,7 +58,7 @@
/*
* BMESH OTHER EDGE IN FACE SHARING A VERTEX
*
- * Returns an opposing edge that shares the same face.
+ * Returns an opposing loop that shares the same face.
*
*/
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c
2009-03-11 02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c
2009-03-11 05:13:36 UTC (rev 19255)
@@ -29,10 +29,6 @@
for if walkers fail.
*/
-/*
-NOTE: This code needs to be read through a couple of times!!
-*/
-
typedef struct shellWalker{
struct shellWalker *prev;
BMVert *base;
@@ -51,6 +47,13 @@
BMFace *cur;
} islandWalker;
+typedef struct loopWalker {
+ struct islandWalker * prev;
+ BMEdge *cur, *start;
+ BMVert *lastv, *startv;
+ int startrad, stage2;
+} loopWalker;
+
/* NOTE: this comment is out of date, update it - joeedh
* BMWalker - change this to use the filters functions.
*
@@ -87,12 +90,13 @@
static void *islandboundWalker_yield(BMWalker *walker);
static void *islandboundWalker_step(BMWalker *walker);
-
static void islandWalker_begin(BMWalker *walker, void *data);
static void *islandWalker_yield(BMWalker *walker);
static void *islandWalker_step(BMWalker *walker);
-struct shellWalker;
+static void loopWalker_begin(BMWalker *walker, void *data);
+static void *loopWalker_yield(BMWalker *walker);
+static void *loopWalker_step(BMWalker *walker);
/* Pointer hiding*/
typedef struct bmesh_walkerGeneric{
@@ -143,13 +147,12 @@
walker->yield = islandWalker_yield;
size = sizeof(islandWalker);
break;
-
- //case BMW_LOOP:
- // walker->begin = loopwalker_Begin;
- // walker->step = loopwalker_Step;
- // walker->yield = loopwalker_Yield;
- // size = sizeof(loopWalker);
- // break;
+ case BMW_LOOP:
+ walker->begin = loopWalker_begin;
+ walker->step = loopWalker_step;
+ walker->yield = loopWalker_yield;
+ size = sizeof(loopWalker);
+ break;
//case BMW_RING:
// walker->begin = ringwalker_Begin;
// walker->step = ringwalker_Step;
@@ -479,3 +482,115 @@
return curf;
}
+
+
+/* Island Walker:
+ *
+ * Starts at a tool flagged-face and walks over the face region
+ *
+ * TODO:
+ *
+ * Add restriction flag/callback for wire edges.
+ *
+*/
+
+static void loopWalker_begin(BMWalker *walker, void *data){
+ loopWalker *lwalk = NULL, owalk;
+ BMEdge *e = data;
+ BMVert *v;
+ int found=1, val;
+
+ v = e->v1;
+
+ val = BM_EdgesAroundVert(v);
+
+ BMW_pushstate(walker);
+
+ lwalk = walker->currentstate;
+ BLI_ghash_insert(walker->visithash, e, NULL);
+
+ lwalk->cur = lwalk->start = e;
+ lwalk->lastv = lwalk->startv = v;
+ lwalk->stage2 = 0;
+ lwalk->startrad = BM_FacesAroundEdge(e);
+
+ /*rewind*/
+ while (walker->currentstate) {
+ owalk = *((loopWalker*)walker->currentstate);
+ BMW_walk(walker);
+ }
+
+ BMW_pushstate(walker);
+ lwalk = walker->currentstate;
+ *lwalk = owalk;
+
+ if (lwalk->lastv == owalk.cur->v1) lwalk->lastv = owalk.cur->v2;
+ else lwalk->lastv = owalk.cur->v1;
+
+ lwalk->startv = lwalk->lastv;
+
+ BLI_ghash_free(walker->visithash, NULL, NULL);
+ walker->visithash = BLI_ghash_new(BLI_ghashutil_ptrhash,
BLI_ghashutil_ptrcmp);
+ BLI_ghash_insert(walker->visithash, owalk.cur, NULL);
+}
+
+static void *loopWalker_yield(BMWalker *walker)
+{
+ loopWalker *lwalk = walker->currentstate;
+
+ return lwalk->cur;
+}
+
+static void *loopWalker_step(BMWalker *walker)
+{
+ loopWalker *lwalk = walker->currentstate, owalk;
+ BMIter iter;
+ BMEdge *e = lwalk->cur, *nexte = NULL;
+ BMLoop *l, *l2;
+ BMVert *v;
+ int val, rlen, found=0, i=0, stopi;
+
+ owalk = *lwalk;
+
+ if (e->v1 == lwalk->lastv) v = e->v2;
+ else v = e->v1;
+
+ val = BM_EdgesAroundVert(v);
+
+ BMW_popstate(walker);
+
+ rlen = owalk.startrad;
+ l = e->loop;
+
+ if (val == 4 || val == 2 || rlen == 1) {
+ i = 0;
+ stopi = val / 2;
+ while (1) {
+ if (rlen != 1 && i == stopi) break;
+
+ l = BM_OtherFaceLoop(l->e, l->f, v);
+ l2 = bmesh_radial_nextloop(l);
+
+ if (l2 == l) {
+ break;
+ }
+
+ l = l2;
+
+ i += 1;
+ }
+ }
+
+ if (l != e->loop && !BLI_ghash_haskey(walker->visithash, l->e)) {
+ if (!(rlen != 1 && i != stopi)) {
+ BMW_pushstate(walker);
+ lwalk = walker->currentstate;
+ *lwalk = owalk;
+ lwalk->cur = l->e;
+ lwalk->lastv = v;
+ BLI_ghash_insert(walker->visithash, l->e, NULL);
+ }
+ }
+
+ return owalk.cur;
+}
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-11 02:58:18 UTC (rev 19254)
+++ branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c
2009-03-11 05:13:36 UTC (rev 19255)
@@ -86,7 +86,7 @@
*
*/
@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs