Revision: 36181
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36181
Author:   joeedh
Date:     2011-04-15 07:08:36 +0000 (Fri, 15 Apr 2011)
Log Message:
-----------
=bmesh= connected PET now works, for the most part

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_structure.c
    branches/bmesh/blender/source/blender/bmesh/operators/bevel.c
    
branches/bmesh/blender/source/blender/editors/transform/transform_conversions.c

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c        
2011-04-15 05:20:18 UTC (rev 36180)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c        
2011-04-15 07:08:36 UTC (rev 36181)
@@ -335,7 +335,7 @@
        for (i=0; i<len; i++) {
                edges2[i] = BM_Edge_Exist(verts[i], verts[(i+1)%len]);
                if (!edges2[i])
-                       return NULL;
+                       goto err;
        }
 
        /*check if face already exists*/

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c        
2011-04-15 05:20:18 UTC (rev 36180)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c        
2011-04-15 07:08:36 UTC (rev 36181)
@@ -216,12 +216,10 @@
        BMLoop *l;
 
        l = iter->edata->l;
-       if (!l)
-               return;
 
        /*note sure why this sets ldata. . .*/
        init_iterator(iter);
-
+       
        iter->firstloop = iter->nextloop = l;
 }
 

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c  
2011-04-15 05:20:18 UTC (rev 36180)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c  
2011-04-15 07:08:36 UTC (rev 36181)
@@ -579,6 +579,11 @@
                        
                        do {
                                lnext = l->radial_next;
+                               if (lnext->f == l->f) {
+                                       BM_Kill_Face(bm, l->f);
+                                       break;                                  
+                               }
+                               
                                BM_Kill_Face(bm, l->f);
                        
                                if (l == lnext)

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_structure.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_structure.c        
2011-04-15 05:20:18 UTC (rev 36180)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_structure.c        
2011-04-15 07:08:36 UTC (rev 36181)
@@ -317,16 +317,28 @@
 int bmesh_radial_validate(int radlen, BMLoop *l)
 {
        BMLoop *l2 = l;
-
+       int i=0;
+       
        if (bmesh_radial_length(l) != radlen)
                return 0;
 
        do {
+               if (!l2) {
+                       bmesh_error();
+                       return 0;
+               }
+               
                if (l2->e != l->e)
                        return 0;
                if (l2->v != l->e->v1 && l2->v != l->e->v2)
                        return 0;
-
+               
+               if (i > 3000000) {
+                       bmesh_error();
+                       return 0;
+               }
+               
+               i++;
                l2 = l2->radial_next;
        } while (l2 != l);
 
@@ -394,6 +406,11 @@
                return 0;
 
        do {
+               if (!l2) {
+                       bmesh_error();
+                       return 0;
+               }
+               
                i++;
                l2 = l2->radial_next;
                if (i >= 555555)

Modified: branches/bmesh/blender/source/blender/bmesh/operators/bevel.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/bevel.c       
2011-04-15 05:20:18 UTC (rev 36180)
+++ branches/bmesh/blender/source/blender/bmesh/operators/bevel.c       
2011-04-15 07:08:36 UTC (rev 36181)
@@ -32,29 +32,61 @@
        BMVert *newv1, *newv2;
 } EdgeTag;
 
-void calc_corner_co(BMesh *UNUSED(bm), BMLoop *l, float *co, float fac)
+void calc_corner_co(BMesh *bm, BMLoop *l, float *co, float fac)
 {
-       float /* no[3], tan[3], */ vec1[3], vec2[3], v1[3], v2[3], v3[3], v4[3];
-       // float p1[3], p2[3], w[3];
-       // float l1, l2;
-       // int ret;
+       float  no[3], tan[3], vec1[3], vec2[3], v1[3], v2[3], v3[3], v4[3];
+       float p1[3], p2[3], w[3];
+       float l1, l2;
+       int ret, inv=0;
+       
+       if (l->f->len > 2) {
+               copy_v3_v3(v1, l->prev->v->co);
+               copy_v3_v3(v2, l->v->co);
+               copy_v3_v3(v3, l->v->co);
+               copy_v3_v3(v4, l->next->v->co);
+       } else {
+               BMIter iter;
+               BMLoop *l2;
+               float up[3] = {0.0f, 0.0f, 1.0f};
+               
+               copy_v3_v3(v1, l->prev->v->co);
+               copy_v3_v3(v2, l->v->co);
+               copy_v3_v3(v3, l->v->co);
+               
+               BM_ITER(l2, &iter, bm, BM_LOOPS_OF_VERT, l->v) {
+                       if (l2->f != l) {
+                               copy_v3_v3(v4, BM_OtherEdgeVert(l2->e, 
l2->next->v));
+                               break;
+                       }
+               }
+               
+               sub_v3_v3v3(vec1, v1, v2);
+               sub_v3_v3v3(vec2, v4, v3);
 
-       copy_v3_v3(v1, l->prev->v->co);
-       copy_v3_v3(v2, l->v->co);
-       copy_v3_v3(v3, l->v->co);
-       copy_v3_v3(v4, l->next->v->co);
+               cross_v3_v3v3(no, vec1, vec2);
+               if (dot_v3v3(no, no) == 0.0) {
+                       no[0] = no[1] = 0.0f; no[2] = -1.0f;    
+               }
+               
+               inv = dot_v3v3(no, up) < 0.0;
+       }
        
        /*calculate normal*/
        sub_v3_v3v3(vec1, v1, v2);
        sub_v3_v3v3(vec2, v4, v3);
+       
 #if 0
        cross_v3_v3v3(no, vec2, vec1);
        normalize_v3(no);
        
-       if (dot_v3v3(no, no) < DBL_EPSILON*10) {
+       if (dot_v3v3(no, no) < FLT_EPSILON*10) {
                copy_v3_v3(no, l->f->no);
        }
        
+       if (dot_v3v3(no, no) < FLT_EPSILON*10) {
+               no[0] = 0.0; no[1] = 0.0; no[2] = 1.0f;
+       }
+       
        /*compute offsets*/
        l1 = len_v3(vec1)*fac;
        l2 = len_v3(vec2)*fac;
@@ -83,6 +115,12 @@
        
        /*compute intersection*/
        ret = isect_line_line_v3(v1, v2, v3, v4, p1, p2);
+       if (len_v3v3(p1, v1) > len_v3v3(v1, v2) || len_v3v3(p1, v2) > 
len_v3v3(v1, v2))
+               copy_v3_v3(p1, v2);
+       
+       if (len_v3v3(p1, v3) > len_v3v3(v3, v4) || len_v3v3(p1, v4) > 
len_v3v3(v3, v4))
+               copy_v3_v3(p2, v3);
+       
        if (ret==1) {
                copy_v3_v3(co, p1);
        } else if (ret==2) {
@@ -92,14 +130,18 @@
                add_v3_v3v3(co, v2, v3);
                mul_v3_fl(co, 0.5);
        }
-#endif
+#else
        /*oddly, this simplistic method seems to work the best*/
        mul_v3_fl(vec1, fac);
        mul_v3_fl(vec2, fac);
        add_v3_v3(vec1, vec2);
        mul_v3_fl(vec1, 0.5);
+
+       if (inv)
+               negate_v3(vec1);
        
        add_v3_v3v3(co, vec1, l->v->co);
+#endif
 }
 
 #define ETAG_SET(e, v, nv) (v) == (e)->v1 ? (etags[BMINDEX_GET((e))].newv1 = 
(nv)) : (etags[BMINDEX_GET((e))].newv2 = (nv))
@@ -111,7 +153,7 @@
        BMIter iter;
        BMEdge *e;
        BMVert *v;
-       BMFace **faces = NULL;
+       BMFace **faces = NULL, *f;
        LoopTag *tags=NULL, *tag;
        EdgeTag *etags = NULL, *etag;
        BMVert **verts = NULL;
@@ -137,6 +179,15 @@
                        BMO_ClearFlag(bm, e->v1, BEVEL_DEL);
                        BMO_ClearFlag(bm, e->v2, BEVEL_DEL);
                }
+#if 0
+               if (BM_Edge_FaceCount(e) == 0) {
+                       BMVert *verts[2] = {e->v1, e->v2};
+                       BMEdge *edges[2] = {e, BM_Make_Edge(bm, e->v1, e->v2, 
e, 0)};
+                       
+                       BMO_SetFlag(bm, edges[1], BEVEL_FLAG);
+                       BM_Make_Face(bm, verts, edges, 2);
+               }
+#endif
        }
        
        BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
@@ -198,7 +249,6 @@
                        BMO_ClearFlag(bm, e, BEVEL_DEL);
                        BMO_ClearFlag(bm, e->v1, BEVEL_DEL);
                        BMO_ClearFlag(bm, e->v2, BEVEL_DEL);
-                       //continue;     
                }
                
                if (!BLI_smallhash_haskey(&hash, (intptr_t)e)) {
@@ -338,14 +388,35 @@
                        }
                }
                
-               for (j=0; j<BLI_array_count(verts); j++) {
-                       BMVert *next = verts[(j+1)%BLI_array_count(verts)];
-
-                       e = BM_Make_Edge(bm, next, verts[j], NULL, 1);
-                       BLI_array_append(edges, e);
+               if (BLI_array_count(verts) == 2) {
+                       BMEdge *e1=NULL, *e2=NULL;
+                       
+                       BM_ITER(l, &liter, bm, BM_LOOPS_OF_VERT, verts[0]) {
+                               if (BM_Vert_In_Edge(l->e, verts[1])) {
+                                       if (!e1)
+                                               e1 = l->e;
+                                       else if (!e2) 
+                                               e2 = l->e;
+                               }       
+                       }
+                       
+                       if (!e1)
+                               e1 = BM_Make_Edge(bm, verts[0], verts[1], NULL, 
0);
+                       if (!e2) 
+                               e2 = BM_Make_Edge(bm, verts[0], verts[1], NULL, 
0);
+                       
+                       BLI_array_append(edges, e1);
+                       BLI_array_append(edges, e2);
+               } else {
+                       for (j=0; j<BLI_array_count(verts); j++) {
+                               BMVert *next = 
verts[(j+1)%BLI_array_count(verts)];
+                               
+                               e = BM_Make_Edge(bm, next, verts[j], NULL, 1);
+                               BLI_array_append(edges, e);
+                       }
                }
                
-               f = BM_Make_Face(bm, verts, edges, BLI_array_count(verts));
+               f = BM_Make_Ngon(bm, verts[0], verts[1], edges, 
BLI_array_count(verts), 0);
                if (!f) {
                        printf("eck!!\n");
                        continue;
@@ -657,7 +728,20 @@
                        }
                }
        }
-
+#if 0
+       /*clean up any remainin 2-edged faces*/
+       BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+               if (f->len == 2) {
+                       BMFace *faces[2] = {f, 
bm_firstfaceloop(f)->radial_next->f};
+                       
+                       if (faces[0] == faces[1])
+                               BM_Kill_Face(bm, f);
+                       else
+                               BM_Join_Faces(bm, faces, 2);
+               }
+       }
+#endif
+       
        BMO_CallOpf(bm, "del geom=%fv context=%i", BEVEL_DEL, DEL_VERTS);
 
        /*clean up any edges that might not get properly deleted*/

Modified: 
branches/bmesh/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- 
branches/bmesh/blender/source/blender/editors/transform/transform_conversions.c 
    2011-04-15 05:20:18 UTC (rev 36180)
+++ 
branches/bmesh/blender/source/blender/editors/transform/transform_conversions.c 
    2011-04-15 07:08:36 UTC (rev 36181)
@@ -1824,17 +1824,16 @@
   or slow this is.*/
 static void editmesh_set_connectivity_distance(BMEditMesh *em, float mtx[][3], 
float *dists)
 {
-       BMVert **stack = NULL;
-       float *dstack = NULL;
-       BLI_array_declare(stack);
-       BLI_array_declare(dstack);
+       BMVert **queue = NULL;
+       float *dqueue = NULL;
+       int *tots = MEM_callocN(sizeof(int)*em->bm->totvert, "tots 
editmesh_set_connectivity_distance");
+       BLI_array_declare(queue);
+       BLI_array_declare(dqueue);
        SmallHash svisit, *visit=&svisit;
        BMVert *v;
        BMIter viter;
        int i;
        
-       BLI_smallhash_init(visit);
-       
        i = 0;
        BM_ITER(v, &viter, em->bm, BM_VERTS_OF_MESH, NULL) {
                BMINDEX_SET(v, i);
@@ -1844,26 +1843,30 @@
        
        BM_ITER(v, &viter, em->bm, BM_VERTS_OF_MESH, NULL) {
                BMVert *v2;
+               int start;
                
-               if (BLI_smallhash_haskey(visit, (uintptr_t)v) || 
BM_TestHFlag(v, BM_SELECT)==0 || BM_TestHFlag(v, BM_HIDDEN))
+               if (BM_TestHFlag(v, BM_SELECT)==0 || BM_TestHFlag(v, BM_HIDDEN))
                        continue;
                        
-               BLI_array_empty(stack);
-               BLI_array_append(stack, v);
-               BLI_array_append(dstack, 0.0f);
+               BLI_smallhash_init(visit);
 
+               BLI_array_empty(queue);
+               BLI_array_append(queue, v);
+               BLI_array_append(dqueue, 0.0f);
+               dists[BMINDEX_GET(v)] = 0.0f;
+               
                BLI_smallhash_insert(visit, (uintptr_t)v, NULL);                
+               start = 0;
                
-               while (BLI_array_count(stack)) {
+               while (start < BLI_array_count(queue)) {
                        BMIter eiter;
                        BMEdge *e;
                        BMVert *v3;
                        float d, d2, vec[3];
                        
-                       v2 = BLI_array_pop(stack);
-                       d = BLI_array_pop(dstack);
+                       v2 = queue[start];
+                       d = dqueue[start];
                        
-                       dists[BMINDEX_GET(v2)] = d;
                        BM_ITER(e, &eiter, em->bm, BM_EDGES_OF_VERT, v2) {
                                float d2;
                                v3 = BM_OtherEdgeVert(e, v2);
@@ -1876,22 +1879,37 @@
                                
                                d2 = d + len_v3(vec);
                                
-                               if (d2 >= dists[BMINDEX_GET(v3)] && 
BLI_smallhash_haskey(visit, (uintptr_t)v3))
+                               if (BLI_smallhash_haskey(visit, (uintptr_t)v3))
                                        continue;
                                
-                               dists[BMINDEX_GET(v3)] = d2;
+                               if (dists[BMINDEX_GET(v3)] != FLT_MAX)
+                                       dists[BMINDEX_GET(v3)] += d2;
+                               else
+                                       dists[BMINDEX_GET(v3)] = d2;
+                               
+                               tots[BMINDEX_GET(v3)]++;
+                               
                                if (!BLI_smallhash_haskey(visit, (uintptr_t)v3))

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to