diff --git a/make.bat b/make.bat index d1371d4..8d6a480 100644 --- a/make.bat +++ b/make.bat @@ -37,16 +37,22 @@ if not defined VisualStudioVersion ( set compiler_bat="%ProgramFiles(x86)%\Microsoft Visual Studio !compiler_ver!\VC\vcvarsall.bat" x86_amd64 ) - if %maya_ver% GEQ 2020 ( + if %maya_ver% EQU 2020 ( if exist "%ProgramFiles(x86)%\Microsoft Visual Studio 2017\WDExpress\VC\Auxiliary\Build\vcvarsall.bat" ( set compiler_bat="%ProgramFiles(x86)%\Microsoft Visual Studio 2017\WDExpress\VC\Auxiliary\Build\vcvarsall.bat" x86_amd64 set compiler_ver=15.0 ) if exist "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\BuildTools\Common7\Tools\VsDevCmd.bat" ( set compiler_bat="%ProgramFiles(x86)%\Microsoft Visual Studio\2017\BuildTools\Common7\Tools\VsDevCmd.bat" + set compiler_ver=15.0 + ) + ) + if %maya_ver% GEQ 2022 ( + if exist "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" ( + set compiler_bat="%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86_amd64 + set compiler_ver=16.0 ) ) - set VisualStudioVersion=!compiler_ver! if not exist !compiler_bat! ( @@ -66,6 +72,7 @@ IF %VisualStudioVersion% == 11.0 set vc_config=Visual Studio 11 2012 Win64 IF %VisualStudioVersion% == 12.0 set vc_config=Visual Studio 12 2013 Win64 IF %VisualStudioVersion% == 14.0 set vc_config=Visual Studio 14 2015 Win64 IF %VisualStudioVersion% == 15.0 set vc_config=Visual Studio 15 2017 Win64 +IF %VisualStudioVersion% == 16.0 set vc_config=Visual Studio 16 2019 set install_dir=%current%\install diff --git a/src/MeshInfoCmd.cpp b/src/MeshInfoCmd.cpp index 3978ae9..a5419f1 100644 --- a/src/MeshInfoCmd.cpp +++ b/src/MeshInfoCmd.cpp @@ -41,6 +41,7 @@ MSyntax MeshInfoCmd::newSyntex() syntax.addFlag(kVtxHashFlag, kVtxHashFlagLong, MSyntax::kNoArg); syntax.addFlag(kUvHashFlag, kUvHashFlagLong, MSyntax::kNoArg); syntax.addFlag(kPtHashFlag, kPtHashFlagLong, MSyntax::kNoArg); + syntax.addFlag(kUnsetFlag, kUnsetFlagLong, MSyntax::kNoArg); syntax.addFlag(kExtendToShapeFlag, kExtendToShapeFlagLong, MSyntax::kNoArg); syntax.addFlag(kNoIntermediaFlag, kNoIntermediaFlagLong, MSyntax::kNoArg); syntax.addFlag(kFileFlag, kFileFlagLong, MSyntax::kString); @@ -106,6 +107,46 @@ MString MeshInfoCmd::getPtHash(MFnMesh & fnMesh) MString pt_hash = getHash(ptArray); return pt_hash; } +MIntArray MeshInfoCmd::getUnsetIds(MFnMesh& fnMesh) +{ + MStatus status; + MStringArray familyNames; + std::vector UnsetIds; + + status = fnMesh.getColorSetFamilyNames(familyNames); + if (!familyNames.length()) + { + return MIntArray(); + } + + MIntArray vtxCounts, vtxList; + fnMesh.getVertices(vtxCounts, vtxList); + for (unsigned int i = 0; i < familyNames.length(); i++) + { + MColorArray colors; + fnMesh.getFaceVertexColors(colors, &familyNames[i]); + if (!colors.length()) + continue; + for (unsigned int fid=0; fid < fnMesh.numPolygons(); fid++) + { + int vtx_count = vtxCounts[fid]; + for (int vid = 0; vid < vtx_count; vid++) + { + int fv_index; + fnMesh.getFaceVertexColorIndex(fid, vid, fv_index, &familyNames[i]); + if (colors[fv_index].r < 0 && colors[fv_index].g < 0 && colors[fv_index].b < 0 && colors[fv_index].a < 0) + { + if (std::find(UnsetIds.begin(), UnsetIds.end(), fid) == UnsetIds.end()) + { + UnsetIds.push_back(fid); + } + } + } + } + } + MIntArray result(&UnsetIds[0], UnsetIds.size()); + return result; +} MStatus MeshInfoCmd::extendToShape(MSelectionList & list) { @@ -129,7 +170,6 @@ MStatus MeshInfoCmd::extendToShape(MSelectionList & list) itDag.reset(node); while (!itDag.isDone()) { - MObject currentItem = itDag.currentItem(); if (currentItem.hasFn(MFn::kMesh)) { MDagPath dagPath; @@ -167,6 +207,7 @@ MStatus MeshInfoCmd::doIt(const MArgList & args) bool vtxHashGen = argData.isFlagSet(kVtxHashFlag); bool uvHashGen = argData.isFlagSet(kUvHashFlag); bool ptHashGen = argData.isFlagSet(kPtHashFlag); + bool unsetIdGen = argData.isFlagSet(kUnsetFlag); bool ets = argData.isFlagSet(kExtendToShapeFlag); bool noIntermdia = argData.isFlagSet(kNoIntermediaFlag); bool fileGen = argData.isFlagSet(kFileFlag); @@ -186,22 +227,38 @@ MStatus MeshInfoCmd::doIt(const MArgList & args) MGlobal::displayError("Input node is not mesh type in query mode"); return MS::kInvalidParameter; } - + MDagPath meshPath; list.getDagPath(0, meshPath); MFnMesh fnMesh(meshPath); - if (vtxHashGen) { - setResult(getVtxHash(fnMesh)); + + if (unsetIdGen) { + setResult(getUnsetIds(fnMesh)); return MS::kSuccess; } - if (uvHashGen) { - setResult(getUvHash(fnMesh)); - return MS::kSuccess; - } - if (ptHashGen) { - setResult(getPtHash(fnMesh)); - return MS::kSuccess; + else { + int argCount = int(vtxHashGen) + int(uvHashGen) + int(ptHashGen); + if (argCount > 1) + { + MGlobal::displayError("Could not mix multiple hash arguments in query mode"); + return MS::kInvalidParameter; + } + + if (vtxHashGen) { + setResult(getVtxHash(fnMesh)); + return MS::kSuccess; + } + if (uvHashGen) { + setResult(getUvHash(fnMesh)); + return MS::kSuccess; + } + if (ptHashGen) { + setResult(getPtHash(fnMesh)); + return MS::kSuccess; + } } + MGlobal::displayError("Empty query arguments in query mode"); + return MS::kInvalidParameter; } if (ets) { @@ -210,7 +267,23 @@ MStatus MeshInfoCmd::doIt(const MArgList & args) unsigned nObj = list.length(); - std::vector header = { "name", "vertices_hash", "uv_hash", "point_hash", "num_vertices", "num_polygons" }; + std::vector header = { "name" }; + //{"vertices_hash", "uv_hash", "point_hash", "num_vertices", "num_polygons"} + if (vtxHashGen) + header.push_back("vertices_hash"); + + if (uvHashGen) + header.push_back("uv_hash"); + + if (ptHashGen) + header.push_back("point_hash"); + + if (unsetIdGen) + header.push_back("unset_ids"); + + header.push_back("num_vertices"); + header.push_back("num_polygons"); + auto meshInfo = json::array(); meshInfo.push_back(header); @@ -235,27 +308,26 @@ MStatus MeshInfoCmd::doIt(const MArgList & args) } MString vtxHash, uvHash, ptHash; - + std::vector hashData = { fnMesh.name().asChar() }; if (vtxHashGen || fileGen) { vtxHash = getVtxHash(fnMesh); + hashData.push_back(vtxHash.asChar()); } if (uvHashGen || fileGen) { uvHash = getUvHash(fnMesh); + hashData.push_back(uvHash.asChar()); } if (ptHashGen || fileGen) { ptHash = getPtHash(fnMesh); + hashData.push_back(ptHash.asChar()); } if (fileGen) { - std::vector hashData = { - fnMesh.name().asChar(), - vtxHash.asChar(), uvHash.asChar(), ptHash.asChar(), - std::to_string(fnMesh.numVertices()), - std::to_string(fnMesh.numPolygons()) - }; + hashData.push_back(std::to_string(fnMesh.numVertices())); + hashData.push_back(std::to_string(fnMesh.numPolygons())); meshInfo.push_back(hashData); } } diff --git a/src/MeshInfoCmd.h b/src/MeshInfoCmd.h index fb750c1..822bb6f 100644 --- a/src/MeshInfoCmd.h +++ b/src/MeshInfoCmd.h @@ -1,6 +1,7 @@ #include #include #include +#include #define kCommandName "meshInfo" @@ -10,6 +11,8 @@ #define kUvHashFlagLong "-uvHash" #define kPtHashFlag "-pth" #define kPtHashFlagLong "-ptHash" +#define kUnsetFlag "-ust" +#define kUnsetFlagLong "-unset" #define kExtendToShapeFlag "-ets" #define kExtendToShapeFlagLong "-extendToShape" #define kNoIntermediaFlag "-ni" @@ -33,5 +36,6 @@ public: MString getVtxHash(MFnMesh& fnMesh); MString getUvHash(MFnMesh& fnMesh); MString getPtHash(MFnMesh& fnMesh); + MIntArray getUnsetIds(MFnMesh& fnMesh); MStatus extendToShape(MSelectionList &list); }; \ No newline at end of file