// UVSymmetric 0.522 // 最初に選択した頂点のUV値を中心軸とし、2-3、4-5・・・と線対称にする。 @name "UVSynmmetric" @version 2.6 @warnings @script modeler main { selmode(DIRECT); var SelPts = pointcount(); if(SelPts < 3){ error("Need 3 Pts or More"); return; } var vmap = VMap(VMTEXTURE, 0); if(vmap == nil){ error("Not Select UV Map"); return; } editbegin(); if(!vmap.isMapped(points[1])){ editend(); error("not mapped UVs. on 1st Pts."); return; } var LastPnt, DiffX; var SrcUV[2], DstUV[2], CenterUV[2]; CenterUV = vmap.getValue(points[1]); var ErrFlag = 1; var p = 2; // 基準点の分を引く x = (SelPts - 1) >> 1; // 対の数分ループ、内で2ポイント分処理 // setValue内でpoints[p++]とするとNG(LS2.5バグ) 念の為LS2.5以外でも外でInc/Dec for(i = 1; i <= x; i++){ if(vmap.isMapped(points[p])){ SrcUV = vmap.getValue(points[p]); p++; DiffX = SrcUV[1] - CenterUV[1]; if(DiffX != 0.0) DstUV[1] = CenterUV[1] - DiffX; else DstUV[1] = CenterUV[1]; DstUV[2] = SrcUV[2]; vmap.setValue(points[p], DstUV); p++; }else{ // UVが無い場合、そのIDを記録。頂点カウントも進める LastPnt[ErrFlag] = points[p]; ErrFlag++; p++; // 対になる頂点も記録。カウントも進める LastPnt[ErrFlag] = points[p]; ErrFlag++; p++; } } LastPnt[ErrFlag] = points[SelPts]; editend(); selmode(USER); selpoint(CLEAR); // 端数、または、非マップ頂点があったら if(!(SelPts % 2) || ErrFlag >= 2){ info("Fraction or Non Assign Points."); selpoint(SET, POINTID, LastPnt); } }