Revision: 18618
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18618
Author:   joeedh
Date:     2009-01-22 08:06:25 +0100 (Thu, 22 Jan 2009)

Log Message:
-----------
tesselator/triangulator improvements, it now works a lot better, though still 
not perfectly

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_private.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c     
2009-01-22 04:22:26 UTC (rev 18617)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c     
2009-01-22 07:06:25 UTC (rev 18618)
@@ -49,6 +49,22 @@
        printf("BM modelling error!");
 }
 
+#ifndef bmesh_api_setindex
+/*NOTE: ensure different parts of the API do not conflict
+  on using this!*/
+void bmesh_api_setindex(BMesh *bm, BMHeader *head, int i)
+{
+       head->flags[bm->stackdepth-1].pflag = i;
+}
+#endif
+
+#ifndef bmesh_api_getindex
+int bmesh_api_getindex(BMesh *bm, BMHeader *head)
+{
+       return head->flags[bm->stackdepth-1].pflag;
+}
+#endif
+
 /*
  * BMESH SET SYSFLAG
  *

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c  
2009-01-22 04:22:26 UTC (rev 18617)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c  
2009-01-22 07:06:25 UTC (rev 18618)
@@ -61,11 +61,11 @@
  * projected to the x/y plane
  *
 */
-static int convexangle(float *__v1, float *__v2, float *__v3)
+static int convexangle(float *v1t, float *v2t, float *v3t)
 {
        float v1[3], v3[3], n[3];
-       VecSubf(v1, __v1, __v2);
-       VecSubf(v3, __v3, __v2);
+       VecSubf(v1, v1t, v2t);
+       VecSubf(v3, v3t, v2t);
 
        Normalize(v1);
        Normalize(v3);
@@ -224,15 +224,17 @@
 {
 
        float up[3] = {0.0,0.0,1.0}, axis[3], angle, q[4];
+       float mat[3][3];
        int i;
 
        Crossf(axis, up, normal);
        angle = VecAngle2(normal, up);
        
        AxisAngleToQuat(q, axis, angle);
-       
+       QuatToMat3(q, mat);
+
        for(i = 0;  i < nverts;  i++)
-               QuatMulVecf(q, verts[i]);
+               Mat3MulVecfl(mat, verts[i]);
 }
 
 /*
@@ -316,7 +318,6 @@
        float angle, bestangle = 180.0f;
        int isear;
        
-
        l = f->loopbase;
        do{
                isear = 1;
@@ -324,17 +325,21 @@
                v1 = ((BMLoop*)(l->head.prev))->v;
                v2 = l->v;
                v3 = ((BMLoop*)(l->head.next))->v;
-               if(convexangle(verts[v1->head.eflag2], verts[v2->head.eflag2], 
verts[v3->head.eflag2])){
+
+               if (BM_Edge_Exist(v1, v3)) isear = 0;
+
+               if(isear && convexangle(verts[v1->head.eflag2], 
verts[v2->head.eflag2], verts[v3->head.eflag2])){
                        for(l2 = ((BMLoop*)(l->head.next->next)); l2 != 
((BMLoop*)(l->head.prev)); l2 = ((BMLoop*)(l2->head.next)) ){
                                if(point_in_triangle(verts[v1->head.eflag2], 
verts[v2->head.eflag2],verts[v3->head.eflag2], l2->v->co)){
                                        isear = 0;
                                        break;
                                }
                        }
-               }
+               } else isear = 0;
+
                if(isear){
                        angle = VecAngle3(verts[v1->head.eflag2], 
verts[v2->head.eflag2], verts[v3->head.eflag2]);
-                       if((!bestear) && angle < bestangle){
+                       if(!bestear || angle < bestangle){
                                bestear = l;
                                bestangle = angle;
                        }
@@ -379,14 +384,16 @@
                l = (BMLoop*)(l->head.next);
        }while(l != f->loopbase);
        
+       bmesh_update_face_normal(bm, f, projectverts);
+
        compute_poly_plane(projectverts, i);
        poly_rotate_plane(f->no, projectverts, i);
 
        done = 0;
-       while(!done){
+       while(!done && f->len > 3){
                done = 1;
                l = find_ear(f, projectverts);
-               if(l && l->head.prev != l->head.next && f->len > 3){
+               if(l) {
                        done = 0;
                        f = bmesh_sfme(bm, f, ((BMLoop*)(l->head.prev))->v, 
((BMLoop*)(l->head.next))->v, &newl);
                        BMO_SetFlag(bm, newl->e, newedgeflag);
@@ -397,7 +404,7 @@
        if (f->len > 3){
                l = f->loopbase;
                while (l->f->len > 3){
-                       nextloop = ((BMLoop*)(l->head.next->next->next));
+                       nextloop = ((BMLoop*)(l->head.next->next));
                        bmesh_sfme(bm, l->f, l->v,nextloop->v, &newl);
                        BMO_SetFlag(bm, newl->e, newedgeflag);
                        BMO_SetFlag(bm, f, newfaceflag);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_private.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_private.h  
2009-01-22 04:22:26 UTC (rev 18617)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_private.h  
2009-01-22 07:06:25 UTC (rev 18618)
@@ -58,6 +58,17 @@
 void bmesh_clear_sysflag(struct BMHeader *element, int flag);
 int bmesh_test_sysflag(struct BMHeader *element, int flag);
 
+/*NOTE: ensure different parts of the API do not conflict
+  on using this!*/
+/*used to access the index member of the current flag layer.
+  actual functions are only defined if the below macro versions
+  are not.*/
+void bmesh_api_setindex(BMesh *bm, BMHeader *head, int i);
+int bmesh_api_getindex(BMesh *bm, BMHeader *head);
+
+#define bmesh_api_setindex(bm, head, i) ((head)->flags[bm->stackdepth-1].pflag 
= i)
+#define bmesh_api_getindex(bm, head) ((head)->flags[bm->stackdepth-1].pflag)
+
 /*Polygon Utilities ? FIXME... where do these each go?*/
 /*newedgeflag sets a flag layer flag, obviously not the header flag.*/
 void BM_Triangulate_Face(BMesh *bm, BMFace *f, float (*projectverts)[3], int 
newedgeflag, int newfaceflag);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c  
2009-01-22 04:22:26 UTC (rev 18617)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c  
2009-01-22 07:06:25 UTC (rev 18618)
@@ -116,7 +116,6 @@
        return 0;
 }
 
-
 /*
  * BMESH VERTS IN EDGE
  *

Modified: branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c  
2009-01-22 04:22:26 UTC (rev 18617)
+++ branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c  
2009-01-22 07:06:25 UTC (rev 18618)
@@ -3380,6 +3380,9 @@
        MEM_freeN(em2); 
        
        BM_Free_Mesh(bm);
+
+       BIF_undo_push("BMesh Test");
+
        WM_event_add_notifier(C, NC_OBJECT|ND_DRAW|ND_TRANSFORM|ND_GEOM_SELECT, 
obedit);
        return OPERATOR_FINISHED;
 }


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to