//- // ========================================================================== // Copyright (C) 1995 - 2005 Alias Systems Corp. and/or its licensors. All // rights reserved. // // The coded instructions, statements, computer programs, and/or related // material (collectively the "Data") in these files are provided by Alias // Systems Corp. ("Alias") and/or its licensors for the exclusive use of the // Customer (as defined in the Alias Software License Agreement that // accompanies this Alias software). Such Customer has the right to use, // modify, and incorporate the Data into other products and to distribute such // products for use by end-users. // // THE DATA IS PROVIDED "AS IS". ALIAS HEREBY DISCLAIMS ALL WARRANTIES // RELATING TO THE DATA, INCLUDING, WITHOUT LIMITATION, ANY AND ALL EXPRESS OR // IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND/OR FITNESS FOR A // PARTICULAR PURPOSE. IN NO EVENT SHALL ALIAS BE LIABLE FOR ANY DAMAGES // WHATSOEVER, WHETHER DIRECT, INDIRECT, SPECIAL, OR PUNITIVE, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, OR IN EQUITY, // ARISING OUT OF ACCESS TO, USE OF, OR RELIANCE UPON THE DATA. // ========================================================================== //+ // // File: splitUVFtyAction.cpp // // Node Factory: splitUVFty // // Author: Lonnie Li // #include "splitUVFty.h" // General Includes // #include #include // Function Sets // #include #include // Iterators // #include 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; }