// ==========================================================================
// Copyright 1995,2006,2008 Autodesk, Inc. All rights reserved.
// Use of this software is subject to the terms of the Autodesk
// license agreement provided at the time of installation or download,
// or which otherwise accompanies this software in either electronic
// or hard copy form.
// ==========================================================================

// meshRemapCmd.h
// Description:
//      Transfer the vertex/edge/face information from one mesh onto another.
//      The meshes are traversed based on three user supplied CVs, for each
//      mesh.
//      The CV/edge/face information is mapped based on the traversal
//      order within each mesh.
// Usage:
//              meshRemap srcMesh.vtx[5] srcMesh.vtx[23] srcMesh.vtx[9] dstMesh.vtx[13] dstMesh.vtx[16] dstMesh.vtx[17]
//      The vertices for each mesh must all be from a common face, be
//      adjacent, and be in order, clockwise or counter-clockwise, around
//      that face. For example, if the face has five vertices A, B, C, D
//      and E, in clockwise order, then you could specify ABC, BCD, DEA,
//      AED, DCB, etc. But ABD would be invalid because B and D are not
//      adjacent, and BCA would be invalid because they are not in order.
// See Also:
//      meshRemapTool.cpp : this context allows you to interactively pick
//      vertices and invoke this command

#ifndef _MESH_REMAP_CMD_H_
#define _MESH_REMAP_CMD_H_

#include <maya/MPxCommand.h>
#include <maya/MDagPath.h>
#include <maya/MSelectionList.h>
#include <maya/MIntArray.h>
#include <maya/MFloatPointArray.h>
#include <maya/MStringArray.h>
#include <maya/MFnMesh.h>

class MArgList;
class MFloatArray;
class MColorArray;

class meshRemapCommand : public MPxCommand
        int                 fFaceIdxSrc;
        int                 fFaceIdxDst;

        MIntArray           fFaceVtxSrc;
        MIntArray           fFaceVtxDst;        

        MDagPath            fDagPathSrc;
        MDagPath            fDagPathDst;

        // For undo
        MFloatPointArray        fVertices;
        MIntArray           fPolygonCounts;
        MIntArray           fPolygonConnects;
        // For Colors undo
        MStringArray                    fColorSetNames;
        MColorArray                    *fColorArrays;
        MFnMesh::MColorRepresentation  *fRepArray;
        bool                           *fClampedArray;
        // For UVs undo
        MStringArray                    fUVSetNames;
        MFloatArray                    *fUArrays;
        MFloatArray                    *fVArrays;
        MIntArray                      *fUVCountsArrays;
        MIntArray                      *fUVIdsArrays;

    MStatus parseArgs(const MArgList&);

      virtual ~meshRemapCommand();
      static void* creator();

      MStatus doIt(const MArgList&);
      MStatus redoIt();

      bool    isUndoable() const { return true; }
      MStatus undoIt();

      void    reset();