- Main Page
- Related Pages
- Modules
- Classes
- Examples

# splitUVFtyAction.cpp

    //-
    // ==========================================================================
    // 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.
    // ==========================================================================
    //+

    //
    // File: splitUVFtyAction.cpp
    //
    // Node Factory: splitUVFty
    //
    // Author: Lonnie Li
    //
    #include "splitUVFty.h"

    // General Includes
    //
    #include <maya/MGlobal.h>
    #include <maya/MIOStream.h>

    // Function Sets
    //
    #include <maya/MFnMesh.h>
    #include <maya/MFnSingleIndexedComponent.h>

    // Iterators
    //
    #include <maya/MItMeshPolygon.h>

    MStatus splitUVFty::doIt()
    //
    //  Description:
    //      Performs the actual splitUV operation on the given object and UVs
    //
    {
        MStatus status = MS::kSuccess;

        // Declare our processing variables //

        MString     selUVSet;

        // Face Id and Face Offset map to the selected UVs
        //
        MIntArray   selUVFaceIdMap;
        MIntArray   selUVFaceOffsetMap;

        // Local Vertex Index map to the selected UVs
        //
        MIntArray   selUVLocalVertIdMap;

        // Collect necessary information for the splitUV //
        //                                               //
        // - uvSet                                       //
        // - faceIds / localVertIds per selected UV      //

        MFnMesh meshFn( fMesh );
        meshFn.getCurrentUVSetName( selUVSet );

        int i;
        int j;
        int offset = 0;
        int selUVsCount = fSelUVs.length();

        MItMeshPolygon polyIter( fMesh );

        for( i = 0; i < selUVsCount; i++ )
        {
            selUVFaceOffsetMap.append(offset);

            for( polyIter.reset(); !polyIter.isDone(); polyIter.next() )
            {
                if( polyIter.hasUVs() )
                {
                    int polyVertCount = polyIter.polygonVertexCount();

                    for( j = 0; j < polyVertCount; j++ )
                    {
                        int UVIndex = 0;
                        polyIter.getUVIndex(j, UVIndex);

                        if( UVIndex == fSelUVs[i] )
                        {
                            selUVFaceIdMap.append( polyIter.index() );
                            selUVLocalVertIdMap.append(j);
                            offset++;
                            break;
                        }
                    }
                }
            }
        }

        // Store total length of the faceId map in the last element of
        // the offset map so that there is a way to get the number of faces
        // sharing each of the selected UVs
        //
        selUVFaceOffsetMap.append(offset);

        // Begin the splitUV operation //

        int currentUVCount = meshFn.numUVs( selUVSet );

        for( i = 0; i < selUVsCount; i++ )
        {
            // Get the current FaceId map offset
            //
            offset = selUVFaceOffsetMap[i];

            // Get the U and V values of the current UV
            //
            float u;
            float v;
            int uvId = fSelUVs[i];

            meshFn.getUV( uvId, u, v, &selUVSet );

            // Get the number of faces sharing the current UV
            //
            int faceCount = selUVFaceOffsetMap[i + 1] - selUVFaceOffsetMap[i];

            // Arbitrarily choose that the last faceId in the list of faces
            // sharing this UV, will keep the original UV.
            //
            for( j = 0; j < faceCount - 1; j++ )
            {
                meshFn.setUV( currentUVCount, u, v, &selUVSet );

                int localVertId = selUVLocalVertIdMap[offset];
                int faceId = selUVFaceIdMap[offset];

                meshFn.assignUV( faceId, localVertId, currentUVCount, &selUVSet );

                currentUVCount++;
                offset++;
            }
        }

        return status;
    }