*/}}
Browse Source

Normalize automatically and correct edge mode batch index.

YimingWu 1 year ago
parent
commit
9b1d322c9f
2 changed files with 13 additions and 7 deletions
  1. 9 3
      la_tns_mesh.c
  2. 4 4
      resources/la_modelling.c

+ 9 - 3
la_tns_mesh.c

@@ -198,7 +198,7 @@ float* tnsGetDrawingVertArray(tnsMeshObject* mo, int* r_tot_render_v, float** r_
             (*editcolors)[i*4]=c[0]; (*editcolors)[i*4+1]=c[1]; (*editcolors)[i*4+2]=c[2]; (*editcolors)[i*4+3]=c[3];
         }
         for(tnsMEdge*me=mo->me.pFirst;me;me=me->Item.pNext){ int ei=me->i;
-            (*edgeelems)[ei*2]=mo->totmv+ei*2; (*edgeelems)[ei*2+1]=mo->totmv+ei*2+1;
+            (*edgeelems)[ei*2]=mo->totmv+mo->totmf+ei*2; (*edgeelems)[ei*2+1]=mo->totmv+mo->totmf+ei*2+1;
             float* eidcolor1=&(*idcolors)[(*edgeelems)[ei*2]*3], *eidcolor2=&(*idcolors)[(*edgeelems)[ei*2+1]*3];
             int id=ei+1; real r=(real)((id & 0x000000FF)>>0)/255.0; real g=(real)((id & 0x0000FF00)>>8)/255.0; real b=(real)((id & 0x00FF0000)>>16)/255.0;
             tnsVectorSet3(eidcolor1,r,g,b); tnsVectorSet3(eidcolor2,r,g,b);
@@ -325,9 +325,15 @@ void tnsMMeshCalculateFaceVertNormal(tnsMFace* mf){
 }
 int tnsMMeshCalculateNormal(tnsMeshObject* mo){
     tnsMMeshClearExtraFlags(mo); int ran=0;
-    for(tnsMFace* mf=mo->mf.pFirst;mf;mf=mf->Item.pNext){ if((!(mf->flags&TNS_MESH_FLAG_SELECTED))||(mf->flags&TNS_MESH_FLAG_PICKED)) continue;
-        tnsMMeshCalculateNormalFrom(mf); ran=1;
+    for(tnsMVert* mv=mo->mv.pFirst;mv;mv=mv->Item.pNext){ if(!(mv->flags&TNS_MESH_FLAG_SELECTED)) continue;
+        for(laListItemPointer* lip=mv->elink.pFirst; lip;lip=lip->pNext){
+            tnsMEdge*me=lip->p; if((!me->fl) && (!me->fr)) continue;
+            if(me->fl) tnsMMeshCalculateNormalFrom(me->fl); if(me->fr) tnsMMeshCalculateNormalFrom(me->fr); ran=1;
+        }
     }
+    //for(tnsMFace* mf=mo->mf.pFirst;mf;mf=mf->Item.pNext){ if((!(mf->flags&TNS_MESH_FLAG_SELECTED))||(mf->flags&TNS_MESH_FLAG_PICKED)) continue;
+    //    tnsMMeshCalculateNormalFrom(mf); ran=1;
+    //}
     for(tnsMFace* mf=mo->mf.pFirst;mf;mf=mf->Item.pNext){ if(!(mf->flags&TNS_MESH_FLAG_PICKED)) continue;
         tnsMMeshCalculateFaceVertNormal(mf); ran=1;
     }

+ 4 - 4
resources/la_modelling.c

@@ -485,7 +485,7 @@ void la_ApplyTranslation(MTransformData* td, int x, int y){
         for(int i=0;i<td->next;i++){ MTOrigMVert* to=arrElement(td->Originals, i, sizeof(MTOrigMVert));
             tnsApplyTransform43d(gp, trans, to->p); if(!td->UseLocal) tnsApplyTransform43d(to->mv->p, td->obmatinv, gp); else tnsVectorCopy3d(gp, to->mv->p);
         }
-        tnsInvalidateMeshBatch(td->mo);
+        tnsInvalidateMeshBatch(td->mo); tnsMMeshCalculateNormal(td->mo);
     }
 }
 void la_ApplyScale(MTransformData* td, int uix, int uiy){
@@ -505,7 +505,7 @@ void la_ApplyScale(MTransformData* td, int uix, int uiy){
         for(int i=0;i<td->next;i++){ MTOrigMVert* to=arrElement(td->Originals, i, sizeof(MTOrigMVert));
             tnsApplyTransform43d(gp, final, to->p); tnsApplyTransform43d(to->mv->p, td->obmatinv, gp);
         }
-        tnsInvalidateMeshBatch(td->mo);
+        tnsInvalidateMeshBatch(td->mo); tnsMMeshCalculateNormal(td->mo);
     }
 }
 void la_ApplyRotation(MTransformData* td, int uix, int uiy){
@@ -529,7 +529,7 @@ void la_ApplyRotation(MTransformData* td, int uix, int uiy){
         for(int i=0;i<td->next;i++){ MTOrigMVert* to=arrElement(td->Originals, i, sizeof(MTOrigMVert));
             tnsApplyTransform43d(gp, final, to->p); tnsApplyTransform43d(to->mv->p, td->obmatinv, gp);
         }
-        tnsInvalidateMeshBatch(td->mo);
+        tnsInvalidateMeshBatch(td->mo); tnsMMeshCalculateNormal(td->mo);
     }
 }
 void la_CancelTransformObjects(MTransformData* td){
@@ -1113,7 +1113,7 @@ int OPINV_Make(laOperator *a, laEvent *e){
 
     MMakeData md={0};
     la_GetSelectionIslands(mo,&md,ex->SelectMode);
-    int success=la_MakeFacesFromIslands(mo,&md);
+    int success=la_MakeFacesFromIslands(mo,&md); if(success){ tnsMMeshCalculateNormal(mo); }
     la_ClearIslands(&md);
 
     tnsMMeshRefreshIndex(mo);