| 
					
				 | 
			
			
				@@ -21,6 +21,16 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 extern tnsMain *T; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void tnsPrintMeshTopology(tnsMeshObject*mo){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for(tnsMVert* mv=mo->mv.pFirst;mv;mv=mv->Item.pNext){ printf("%d ",mv->i); } printf("\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for(tnsMEdge* me=mo->me.pFirst;me;me=me->Item.pNext){ printf("%d-%d ",me->vl->i,me->vr->i); } printf("\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for(tnsMFace* mf=mo->mf.pFirst;mf;mf=mf->Item.pNext){ printf("%d-[",mf->looplen); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for(laListItemPointer* lip=mf->l.pFirst;lip;lip=lip->pNext){ tnsMEdge*ie=lip->p; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        printf("%d%s%d ",ie->vl->i,(ie->fl&&ie->fr)?":":(ie->fl?"l":(ie->fr?"r":"-")),ie->vr->i); } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        printf("] "); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }printf("\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 tnsEdgeHash* tnsCreateEdgeHash(int OptionalInitialVertCount){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tnsEdgeHash*eh=memAcquireSimple(sizeof(tnsEdgeHash)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     eh->max=OptionalInitialVertCount; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -367,6 +377,11 @@ void tnsMMeshFaceAddEdge(tnsMFace* mf, tnsMEdge* me){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     lstAppendPointer(&mf->l, me); mf->looplen++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if(!me->fl) me->fl=mf; elif(!me->fr) me->fr=mf; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void tnsMMeshFaceAddEdgeReplaceFace(tnsMFace* mf, tnsMEdge* me, tnsMFace* to_be_replaced){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    lstAppendPointer(&mf->l, me); mf->looplen++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if(me->fl==to_be_replaced) me->fl=mf; elif(me->fr==to_be_replaced) me->fr=mf; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    elif(!me->fl) me->fl=mf; elif(!me->fr) me->fr=mf; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 tnsMFace* tnsMMeshFaceHasVert(tnsMFace* mf, tnsMVert* mv){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if(!mf||!mv) return 0; for(laListItemPointer*lip=mf->l.pFirst;lip;lip=lip->pNext){ if(tnsMMeshEdgeAnotherVert(lip->p, mv)) return mf; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return 0; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -387,14 +402,15 @@ int tnsMMeshSplitFace(tnsMeshObject* mo, tnsMFace* mf, tnsMEdge* me, tnsMFace** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tnsMFace* f1=tnsMMeshNewFace(mo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for(laListItemPointer*lip=StartLip;lip;lip=NextLip){ NextLip=lip->pNext?lip->pNext:mf->l.pFirst;  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         if(lip==EndLip){ tnsMMeshFaceAddEdge(f1, me); break; } tnsMMeshFaceAddEdge(f1, lip->p); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         if(lip==EndLip){ tnsMMeshFaceAddEdgeReplaceFace(f1, me, mf); break; } tnsMMeshFaceAddEdgeReplaceFace(f1, lip->p, mf); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tnsMFace* f2=tnsMMeshNewFace(mo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for(laListItemPointer*lip=EndLip;lip;lip=NextLip){ NextLip=lip->pNext?lip->pNext:mf->l.pFirst;  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         if(lip==StartLip){ tnsMMeshFaceAddEdge(f2, me); break; } tnsMMeshFaceAddEdge(f2, lip->p); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         if(lip==StartLip){ tnsMMeshFaceAddEdgeReplaceFace(f2, me, mf); break; } tnsMMeshFaceAddEdgeReplaceFace(f2, lip->p, mf); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tnsMMeshRemoveFaceOnly(mo, mf); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if(r_f1){ *r_f1=f1; }  if(r_f2){ *r_f2=f2; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //tnsPrintMeshTopology(mo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 tnsMEdge* tnsMMeshMakeEdge(tnsMeshObject* mo, tnsMVert* v1, tnsMVert* v2){ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -475,6 +491,7 @@ int tnsMMeshEdgeInsertVert(tnsMeshObject* mo, tnsMEdge* me, tnsMVert* mv, tnsMVe 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     me->fl=me->fr=0; tnsMMeshRemoveEdgeFace(mo,me); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if(ref_e1v_optional&&tnsMMeshEdgeShareVert(me1, ref_e1v_optional)){ if(r_e1)*r_e1=me1; if(r_e2)*r_e2=me2; }else{ if(r_e1)*r_e1=me2; if(r_e2)*r_e2=me1; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //tnsPrintMeshTopology(mo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 tnsMVert* tnsMMeshEdgeInsertVertAt(tnsMeshObject* mo, tnsMEdge* me, real at, tnsMVert* ref_e1v_optional, tnsMEdge** r_e1, tnsMEdge** r_e2){ 
			 |