*/}}
Browse Source

Make faces

Yiming Wu 2 years ago
parent
commit
7395669f4c
3 changed files with 13 additions and 11 deletions
  1. 1 1
      source/lagui/la_tns.h
  2. 4 2
      source/lagui/la_tns_mesh.c
  3. 8 8
      source/lagui/resources/la_modelling.c

+ 1 - 1
source/lagui/la_tns.h

@@ -1068,7 +1068,7 @@ tnsMVert* tnsMMeshEdgeStartingVert(tnsMEdge* me0, tnsMEdge* me1);
 int tnsMMeshSplitFace(tnsMeshObject* mo, tnsMFace* mf, tnsMEdge* me, tnsMFace** r_f1, tnsMFace** r_f2);
 void tnsMMeshFaceAddEdge(tnsMFace* mf, tnsMEdge* me);
 int tnsMMeshFaceMatches(tnsMFace* mf, int ecount, ...);
-tnsMFace* tnsMMeshMakeFaceN(tnsMeshObject* mo, int count, laListHandle* vip);
+tnsMFace* tnsMMeshMakeFaceN(tnsMeshObject* mo, int count, laListHandle* vip, tnsMEdge** r_fallback_me);
 tnsMFace* tnsMMeshMakeFace4v(tnsMeshObject* mo, tnsVert* v1,tnsVert* v2,tnsVert* v3,tnsVert* v4);
 int tnsMMeshLoopIsInverted(laListItemPointer* l);
 int tnsMMeshEdgeInsertVert(tnsMeshObject* mo, tnsMEdge* me, tnsMVert* mv, tnsMVert* ref_e1v_optional, tnsMEdge** r_e1, tnsMEdge** r_e2);

+ 4 - 2
source/lagui/la_tns_mesh.c

@@ -301,8 +301,10 @@ int tnsMMeshFaceMatches(tnsMFace* mf, int ecount, ...){
     }
     va_end(list); return 1;
 }
-tnsMFace* tnsMMeshMakeFaceN(tnsMeshObject* mo, int count, laListHandle* vip){
-    if(count<3) return; laListHandle el={0};
+tnsMFace* tnsMMeshMakeFaceN(tnsMeshObject* mo, int count, laListHandle* vip, tnsMEdge** r_fallback_me){
+    if(count<2){ return 0; }
+    if(count==2){ tnsMEdge* me=tnsMMeshMakeEdge(mo,((laListItemPointer*)vip->pFirst)->p,((laListItemPointer*)vip->pLast)->p); if(r_fallback_me)*r_fallback_me=me;  return 0; } 
+    laListHandle el={0};
     for(laListItemPointer*lip=vip->pFirst;lip;lip=lip->pNext){
         tnsMVert* mv=lip->p; laListItemPointer*nlip=lip->pNext?((laListItemPointer*)lip->pNext):vip->pFirst; tnsMVert* nextmv=nlip->p;
         lstAppendPointer(&el,tnsMMeshMakeEdge(mo,mv,nextmv));

+ 8 - 8
source/lagui/resources/la_modelling.c

@@ -815,9 +815,9 @@ int la_EdgeShouldDeleteVert(tnsMVert* mv){
         tnsMEdge* me=lip->p;
         tnsMVert* av=tnsMMeshEdgeAnotherVert(me,mv);
         if(av->flags&TNS_MESH_FLAG_SELECTED){ NearSelected=1; } else { NearUnselected=1; }
-        if(NearUnselected && NearSelected) return 1;
+        if(NearUnselected && NearSelected) return 0;
     }
-    return 0;
+    if(NearSelected&&(!NearUnselected)) return 1; return 0;
 }
 int la_FaceShouldDeleteVert(tnsMVert* mv){
     if(!mv->elink.pFirst) return 0;
@@ -936,7 +936,7 @@ STRUCTURE(MMakeData){
 #define M_SHOULD_INCL_PRIM(m)\
     ((!(m->flags&TNS_MESH_FLAG_PICKED)) && (m->flags&TNS_MESH_FLAG_SELECTED))
 #define M_SHOULD_USE_OE(oe,sf)\
-    (((!oe->fl)&&(oe->fr!=sf))||((!oe->fr)&&(oe->fl!=sf)))
+    (((!oe->fl)&&((!sf)||(oe->fr!=sf)))||((!oe->fr)&&((!sf)||(oe->fl!=sf))))
 
 MIslandInfo* la_NewMIsland(MMakeData* md){ MIslandInfo* ii=memAcquireSimple(sizeof(MIslandInfo)); lstAppendItem(&md->Islands, ii); md->NumIslands++; return ii; }
 void la_FillIslandFromVert(MIslandInfo* ii, tnsMVert* mv, int SelectMode){
@@ -965,7 +965,7 @@ tnsMFace* la_MakeFacesFrom1Vert(tnsMeshObject* mo, tnsMVert* mv){
     } if(!oe1||!oe2) return 0;
     ov1=tnsMMeshEdgeAnotherVert(oe1,mv); ov2=tnsMMeshEdgeAnotherVert(oe2,mv);
     laListHandle vl={0}; lstAppendPointer(&vl,ov1); lstAppendPointer(&vl,mv); lstAppendPointer(&vl,ov2);
-    tnsMFace* f=tnsMMeshMakeFaceN(mo, 3, &vl); while(lstPopPointer(&vl)); return f;
+    tnsMFace* f=tnsMMeshMakeFaceN(mo, 3, &vl, 0); while(lstPopPointer(&vl)); return f;
 }
 tnsMFace* la_MakeFacesFrom2Verts(tnsMeshObject* mo, tnsMVert* mv1, tnsMVert* mv2){
     tnsMEdge* oe1=0,*oe2=0; tnsMVert* ov1,*ov2; tnsMFace* sf=0;
@@ -980,7 +980,7 @@ tnsMFace* la_MakeFacesFrom2Verts(tnsMeshObject* mo, tnsMVert* mv1, tnsMVert* mv2
     ov1=tnsMMeshEdgeAnotherVert(oe1,mv1); ov2=tnsMMeshEdgeAnotherVert(oe2,mv2);
     ov1->flags|=TNS_MESH_FLAG_SELECTED;ov2->flags|=TNS_MESH_FLAG_SELECTED; mv1->flags&=(~TNS_MESH_FLAG_SELECTED);mv2->flags&=(~TNS_MESH_FLAG_SELECTED);
     laListHandle vl={0}; lstAppendPointer(&vl,ov1); lstAppendPointer(&vl,mv1); lstAppendPointer(&vl,mv2); lstAppendPointer(&vl,ov2);
-    tnsMFace* f=tnsMMeshMakeFaceN(mo, 4, &vl); while(lstPopPointer(&vl)); return f;
+    tnsMFace* f=tnsMMeshMakeFaceN(mo, 4, &vl, 0); while(lstPopPointer(&vl)); return f;
 }
 int la_IsEndingVert(tnsMVert* mv){
     int sel=0; for(laListItemPointer*lip=mv->elink.pFirst;lip;lip=lip->pNext){ tnsMEdge* me=lip->p;
@@ -1015,7 +1015,7 @@ int la_MakeFacesFromIslands(tnsMeshObject* mo, MMakeData* md){
         MIslandInfo* ii=md->Islands.pFirst; if(ii->HasBranches) return 0;
         if(ii->numv==1){ laListItemPointer*lip=ii->v.pFirst; if(la_MakeFacesFrom1Vert(mo,lip->p)) success++; }
         elif(ii->numv==2){ laListItemPointer*lip=ii->v.pFirst,*lip2=ii->v.pLast; if(la_MakeFacesFrom2Verts(mo,lip->p, lip2->p)) success++; }
-        else{ la_EnsureIslandVertsSequence(ii); if(tnsMMeshMakeFaceN(mo, ii->numv, &ii->v)) success++; }
+        else{ la_EnsureIslandVertsSequence(ii); if(tnsMMeshMakeFaceN(mo, ii->numv, &ii->v, 0)) success++; }
     }else{
         for(MIslandInfo* ii=md->Islands.pFirst;ii;ii=ii->Item.pNext){ if(ii->HasBranches) return 0; la_EnsureIslandVertsSequence(ii); }
         laListHandle final={0}; int vcount=0;
@@ -1023,7 +1023,8 @@ int la_MakeFacesFromIslands(tnsMeshObject* mo, MMakeData* md){
         while((ii=la_GetNeighborIsland(((laListItemPointer*)ii->v.pLast)->p, md))){
             for(laListItemPointer* lip=ii->v.pFirst;lip;lip=lip->pNext){ lstAppendPointer(&final, lip->p); vcount++; }
         }
-        if(tnsMMeshMakeFaceN(mo,vcount,&final)) success++;
+        tnsMEdge* fallback_e=0;
+        if(tnsMMeshMakeFaceN(mo,vcount,&final, &fallback_e) || fallback_e) success++;
         while(lstPopPointer(&final));
     }
     return success;
@@ -1041,7 +1042,6 @@ int OPINV_Make(laOperator *a, laEvent *e){
     int success=la_MakeFacesFromIslands(mo,&md);
     la_ClearIslands(&md);
 
-    //tnsMMeshDeselectAll(mo);
     tnsMMeshRefreshIndex(mo);
     tnsMMeshEnsureSelection(mo,ex->SelectMode);
     tnsInvaliateMeshBatch(mo);