[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33145] branches/bmesh/blender: fixed some dissolve bugs, still one or two left
Joseph Eagar
joeedh at gmail.com
Wed Nov 17 23:32:25 CET 2010
Revision: 33145
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33145
Author: joeedh
Date: 2010-11-17 23:32:25 +0100 (Wed, 17 Nov 2010)
Log Message:
-----------
fixed some dissolve bugs, still one or two left
Modified Paths:
--------------
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c
branches/bmesh/blender/test/tester.py
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c 2010-11-17 21:28:22 UTC (rev 33144)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c 2010-11-17 22:32:25 UTC (rev 33145)
@@ -113,9 +113,12 @@
/*handle two-valence*/
f = v->e->l->f;
f2 = ((BMLoop*)v->e->l->radial_next)->f;
+
/*collapse the vertex*/
BM_Collapse_Vert(bm, v->e, v, 1.0);
- BM_Join_TwoFaces(bm, f, f2, NULL);
+
+ if (f != f2 && !BM_Join_TwoFaces(bm, f, f2, NULL))
+ return 0;
return 1;
}
@@ -220,6 +223,11 @@
}while(l1!=bm_firstfaceloop(f1));
}
+ if (!jed) {
+ bmesh_error();
+ return NULL;
+ }
+
l1 = jed->l;
if (!l1) {
@@ -342,7 +350,7 @@
BM_Data_Interp_From_Verts(bm, kv, tv, kv, fac);
//bmesh_jekv(bm,ke,kv);
- if (faces) {
+ if (faces && BLI_array_count(faces) > 1) {
BMFace *f2;
BMEdge *e2;
BMVert *tv2;
@@ -353,6 +361,58 @@
f2 = BM_Join_Faces(bm, faces, BLI_array_count(faces));
BM_Split_Face(bm, f2, tv, tv2, NULL, NULL);
+ } else if (faces && BLI_array_count(faces) == 1) {
+ BMLoop **loops = NULL;
+ BMEdge *e;
+ BMVert **verts = NULL;
+ BMEdge **edges = NULL;
+ BMFace *f2;
+ BLI_array_staticdeclare(verts, 64);
+ BLI_array_staticdeclare(edges, 64);
+ BLI_array_staticdeclare(loops, 64);
+ int i;
+
+ /*create new face excluding kv*/
+ f = *faces;
+ l = bm_firstfaceloop(f);
+ i = 0;
+ do {
+ if (l->v != kv) {
+ BLI_array_append(verts, l->v);
+
+ if (l->e != ke && !BM_Vert_In_Edge(l->e, kv)) {
+ BLI_array_append(edges, l->e);
+ } else {
+ BMVert *v2;
+
+ if (BM_Vert_In_Edge(l->next->e, kv))
+ v2 = BM_OtherEdgeVert(l->next->e, kv);
+ else
+ v2 = BM_OtherEdgeVert(l->prev->e, kv);
+
+ e = BM_Make_Edge(bm, BM_OtherEdgeVert(l->e, kv), v2, l->e, 1);
+ BLI_array_append(edges, e);
+ }
+
+ BLI_array_append(loops, l);
+ i++;
+ }
+
+ l = l->next;
+ } while (l != bm_firstfaceloop(f));
+
+ f2 = BM_Make_Face(bm, verts, edges, BLI_array_count(verts));
+ l = bm_firstfaceloop(f2);
+ i = 0;
+ do {
+ BM_Copy_Attributes(bm, bm, loops[i], l);
+ i++;
+ l = l->next;
+ } while (l != bm_firstfaceloop(f2));
+
+ BM_Copy_Attributes(bm, bm, f, f2);
+ BM_Kill_Face(bm, f);
+ BM_Kill_Vert(bm, kv);
} else {
BMVert *tv2;
BMEdge *e2, *ne;
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c 2010-11-17 21:28:22 UTC (rev 33144)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c 2010-11-17 22:32:25 UTC (rev 33145)
@@ -402,7 +402,7 @@
return err;
}
-static void bmesh_kill_loop(BMesh *bm, BMLoop *l) {
+void bmesh_kill_loop(BMesh *bm, BMLoop *l) {
int i;
for (i=0; i<bm->totlayer; i++) {
@@ -702,9 +702,13 @@
do {
BMLoop *l = e->l;
- if (!l)
+ if (!l) {
return 0;
-
+ }
+
+ if (bmesh_radial_length(l) == 1)
+ return 0;
+
do {
if (!bmesh_api_getflag(l->f, flag))
return 0;
@@ -792,6 +796,7 @@
for (lst=f->loops.first; lst; lst=lst->next) {
if (lst == f->loops.first) continue;
+
BLI_remlink(&f->loops, lst);
BLI_addtail(&holes, lst);
}
@@ -852,14 +857,14 @@
bmesh_api_clearflag(newf, _FLAG_JF);
/*delete old geometry*/
- for (i=0; i<BLI_array_count(delverts); i++) {
- BM_Kill_Vert(bm, delverts[i]);
- }
-
for (i=0; i<BLI_array_count(deledges); i++) {
BM_Kill_Edge(bm, deledges[i]);
}
+ for (i=0; i<BLI_array_count(delverts); i++) {
+ BM_Kill_Vert(bm, delverts[i]);
+ }
+
BLI_array_free(edges);
BLI_array_free(deledges);
BLI_array_free(delverts);
Modified: branches/bmesh/blender/test/tester.py
===================================================================
--- branches/bmesh/blender/test/tester.py 2010-11-17 21:28:22 UTC (rev 33144)
+++ branches/bmesh/blender/test/tester.py 2010-11-17 22:32:25 UTC (rev 33145)
@@ -92,7 +92,7 @@
else:
return None
-def runtests(test=None):
+def runtests(test=None, recheck=False):
gen_testfiles()
if test is not None and test.startswith("test_")==0:
test = "test_" + test
@@ -110,11 +110,12 @@
print("==Running %s with runfile \"%s\"..."%(t.prefix, runfile))
#"""
- copyfile(t.testfile, runfile)
- cmdline = [binpath, runfile, "--window-geometry", "0", "0",
- "640", "480", "--eventmacro", t.eventfile]
- proc = subprocess.Popen(cmdline, shell=False)
- proc.wait()
+ if not recheck:
+ copyfile(t.testfile, runfile)
+ cmdline = [binpath, runfile, "--window-geometry", "0", "0",
+ "640", "480", "--eventmacro", t.eventfile]
+ proc = subprocess.Popen(cmdline, shell=False)
+ proc.wait()
#"""
err = checktest(runfile, t.checkfile)
@@ -166,6 +167,11 @@
print ("usage: tester.py [binpath] --newtest [testname]")
else:
newtest(sys.argv[3])
+ elif sys.argv[2] == "--recheck":
+ if len(sys.argv) < 4:
+ print ("usage: tester.py [binpath] --recheck [testname]")
+ else:
+ runtests(sys.argv[3], recheck=True)
else:
runtests(sys.argv[2])
else:
More information about the Bf-blender-cvs
mailing list