--
-- Flip.lua 選択面を反転させる
--

-- 下行のコメントをはずすと高速に実行できる(可能性がある)が、途中で停止できなくなる
--  mc.debugmode(false)

  local start = os.time()

  local doc = mc.GetDocument()
  if doc then
 
    -- 操作用のプロクシオブジェクトを作成
    -- メモリ消費を抑えるためにループの外で作成しておく
    local poly = mc.polygon_proxy()
    local vtxs = {-1,-1,-1,-1}  --頂点指定用配列。(Lua配列は1から始まることに注意)
    local uvs = {-1,-1,-1,-1} --UV頂点指定用配列。(Lua配列は1から始まることに注意)
    
    local i = 0
    repeat
      local obj = mc.GetActiveMesh(doc,i)
      if obj then
        -- 面の数を取得する
        local cnt = mc.GetPolygonCount(obj)
        
        -- 編集操作を記録するためのHistoryオブジェクトを作成する
        local his = mc.CreateHistory(doc,obj,CW_HISTORY_MODIFY_GEOMETRY,"FlipByLua")

        -- 編集開始
        mc.BeginModify(obj,his)
        
        -- 全ての面を走査
        for j = 0,cnt-1 do
          if mc.GetPolygonProxy(obj,j,poly) then --ポリゴンプロクシにj番目の面の情報を取得する
          
            -- タグフィールドにINVALIDが含まれいなく、SELECTが含まれている面を探す
            if (not mc.tag_contains(poly, CWBIT_TAG_INVALID))
            and (mc.tag_contains(poly, CWBIT_TAG_SELECT)) then
              -- 面の頂点を反転させた配列を作る
              local n = poly.n
              for k = 1,n do
                vtxs[k] = poly["v"..(n-k)]  --頂点番号は poly[v0~v3]に格納されている
                uvs[k] = poly["u"..(n-k)]  --UV頂点番号は poly[u0~u3]に格納されている
              end
              
              -- 元の面を削除
              mc.RemovePolygon(obj, j, false, true, his) 
              -- 新しい面を作成する。(面を削除した直後ならプロクシ内のデータはまだ有効)
              mc.AddPolygon(obj, poly.mat, poly.n, vtxs, uvs, poly.grp, his)
            end
          end
        end
        
        -- 編集終了
        mc.EndModify(obj,CWBIT_TAG_SELECT or CWBIT_TAG_MAKE,0,his)
      else
        break
      end
      i = i + 1
    until (false)

    -- 画面更新
    mc.RefreshView(doc, CW_VIEW_ALL)
    
    print("done.")
  end
  
  print("time=",os.time()-start)

  