[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44446] trunk/blender/source/blender/bmesh : fix for a bug in bmesh_jekv (and its main caller BM_vert_collapse_faces).
Campbell Barton
ideasman42 at gmail.com
Sun Feb 26 05:38:47 CET 2012
Revision: 44446
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44446
Author: campbellbarton
Date: 2012-02-26 04:38:37 +0000 (Sun, 26 Feb 2012)
Log Message:
-----------
fix for a bug in bmesh_jekv (and its main caller BM_vert_collapse_faces).
Collapsing an edge could result on 2 edges sharing the same verts, now check for this and 'splice' one edge into another.
Modified Paths:
--------------
trunk/blender/source/blender/bmesh/intern/bmesh_mods.c
trunk/blender/source/blender/bmesh/intern/bmesh_newcore.c
trunk/blender/source/blender/bmesh/intern/bmesh_structure.h
trunk/blender/source/blender/bmesh/tools/BME_bevel.c
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mods.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mods.c 2012-02-26 00:43:47 UTC (rev 44445)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mods.c 2012-02-26 04:38:37 UTC (rev 44446)
@@ -478,8 +478,8 @@
/* single face or no faces */
/* same as BM_vert_collapse_edge() however we already
* have vars to perform this operation so dont call. */
- bmesh_jekv(bm, ke, kv);
- ne = BM_edge_exists(tv, tv2);
+ ne = bmesh_jekv(bm, ke, kv, TRUE);
+ /* ne = BM_edge_exists(tv, tv2); */ /* same as return above */
return ne;
}
@@ -512,9 +512,9 @@
BMVert *tv2 = BM_edge_other_vert(e2, kv);
if (tv2) {
/* only action, other calls here only get the edge to return */
- bmesh_jekv(bm, ke, kv);
+ ne = bmesh_jekv(bm, ke, kv);
- ne = BM_edge_exists(tv, tv2);
+ /* ne = BM_edge_exists(tv, tv2); */ /* same as return above */
}
}
}
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_newcore.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_newcore.c 2012-02-26 00:43:47 UTC (rev 44445)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_newcore.c 2012-02-26 04:38:37 UTC (rev 44446)
@@ -41,6 +41,8 @@
* TESTING ONLY! */
// #define USE_DEBUG_INDEX_MEMCHECK
+static int bmesh_edge_splice(BMesh *bm, BMEdge *e, BMEdge *etarget);
+
#ifdef USE_DEBUG_INDEX_MEMCHECK
#define DEBUG_MEMCHECK_INDEX_INVALIDATE(ele) \
{ \
@@ -1434,9 +1436,9 @@
* these faces.
*
* Returns -
- * 1 for success, 0 for failure.
+ * The resulting edge, NULL for failure.
*/
-int bmesh_jekv(BMesh *bm, BMEdge *ke, BMVert *kv)
+struct BMEdge *bmesh_jekv(BMesh *bm, BMEdge *ke, BMVert *kv, const short check_edge_double)
{
BMEdge *oe;
BMVert *ov, *tv;
@@ -1444,7 +1446,7 @@
int len, radlen = 0, halt = 0, i, valence1, valence2, edok;
if (bmesh_vert_in_edge(ke, kv) == 0) {
- return FALSE;
+ return NULL;
}
len = bmesh_disk_count(kv);
@@ -1456,13 +1458,19 @@
halt = bmesh_verts_in_edge(kv, tv, oe); /* check for double edge */
if (halt) {
- return FALSE;
+ return NULL;
}
else {
+ BMEdge *e_splice;
+
/* For verification later, count valence of ov and t */
valence1 = bmesh_disk_count(ov);
valence2 = bmesh_disk_count(tv);
-
+
+ if (check_edge_double) {
+ e_splice = BM_edge_exists(tv, ov);
+ }
+
/* remove oe from kv's disk cycl */
bmesh_disk_remove_edge(oe, kv);
/* relink oe->kv to be oe->t */
@@ -1547,14 +1555,21 @@
BM_CHECK_ELEMENT(bm, l->f);
}
+ if (check_edge_double) {
+ if (e_splice) {
+ /* removes e_splice */
+ bmesh_edge_splice(bm, e_splice, oe);
+ }
+ }
+
BM_CHECK_ELEMENT(bm, ov);
BM_CHECK_ELEMENT(bm, tv);
BM_CHECK_ELEMENT(bm, oe);
- return TRUE;
+ return oe;
}
}
- return FALSE;
+ return NULL;
}
/**
@@ -1718,7 +1733,7 @@
*
* merges two verts into one (v into vtarget).
*/
-static int bmesh_splicevert(BMesh *bm, BMVert *v, BMVert *vtarget)
+static int bmesh_vert_splice(BMesh *bm, BMVert *v, BMVert *vtarget)
{
BMEdge *e;
BMLoop *l;
@@ -1861,7 +1876,7 @@
*
* edges must already have the same vertices
*/
-static int UNUSED_FUNCTION(bmesh_spliceedge)(BMesh *bm, BMEdge *e, BMEdge *etarget)
+static int bmesh_edge_splice(BMesh *bm, BMEdge *e, BMEdge *etarget)
{
BMLoop *l;
@@ -1883,6 +1898,7 @@
BM_CHECK_ELEMENT(bm, e);
BM_CHECK_ELEMENT(bm, etarget);
+ /* removes from disks too */
BM_edge_kill(bm, e);
return TRUE;
@@ -1992,7 +2008,7 @@
/* And then glue the rest back together */
for (i = 1; i < len - 1; i++) {
- bmesh_splicevert(bm, vtar[i], vtar[0]);
+ bmesh_vert_splice(bm, vtar[i], vtar[0]);
}
}
}
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_structure.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_structure.h 2012-02-26 00:43:47 UTC (rev 44445)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_structure.h 2012-02-26 04:38:37 UTC (rev 44446)
@@ -90,7 +90,8 @@
#endif
BMEdge *example
);
-int bmesh_jekv(struct BMesh *bm, struct BMEdge *ke, struct BMVert *kv);
+
+struct BMEdge *bmesh_jekv(struct BMesh *bm, struct BMEdge *ke, struct BMVert *kv, const short check_edge_splice);
int bmesh_loop_reverse(struct BMesh *bm, struct BMFace *f);
struct BMFace *bmesh_jfke(struct BMesh *bm, struct BMFace *f1, struct BMFace *f2, struct BMEdge *e);
Modified: trunk/blender/source/blender/bmesh/tools/BME_bevel.c
===================================================================
--- trunk/blender/source/blender/bmesh/tools/BME_bevel.c 2012-02-26 00:43:47 UTC (rev 44445)
+++ trunk/blender/source/blender/bmesh/tools/BME_bevel.c 2012-02-26 04:38:37 UTC (rev 44446)
@@ -153,7 +153,7 @@
e = v->e;
elast = bmesh_disk_nextedge(e, v);
- bmesh_jekv(bm, e, v);
+ bmesh_jekv(bm, e, v, FALSE);
l1 = elast->l;
l2 = l1->radial_next;
More information about the Bf-blender-cvs
mailing list