diff --git a/src/cpp/skin_plus_plus_pymaya/skin_plus_plus_pymaya.cpp b/src/cpp/skin_plus_plus_pymaya/skin_plus_plus_pymaya.cpp index 74a1911..365f6d1 100644 --- a/src/cpp/skin_plus_plus_pymaya/skin_plus_plus_pymaya.cpp +++ b/src/cpp/skin_plus_plus_pymaya/skin_plus_plus_pymaya.cpp @@ -96,14 +96,14 @@ static void removeBonesFromBindPose( } -std::unordered_set getBoneNamesSet(MDagPathArray skinnedBones) +std::unordered_set getBoneNamesSet(MDagPathArray skinnedBones) { - std::vector skinnedBoneNames(skinnedBones.length()); + std::vector skinnedBoneNames(skinnedBones.length()); for (UINT i = 0; i < skinnedBones.length(); i++) { - skinnedBoneNames[i] = skinnedBones[i].partialPathName().asChar(); + skinnedBoneNames[i] = skinnedBones[i].partialPathName().asWChar(); } - std::unordered_set skinnedBoneNamesSet(skinnedBoneNames.begin(), skinnedBoneNames.end()); + std::unordered_set skinnedBoneNamesSet(skinnedBoneNames.begin(), skinnedBoneNames.end()); return skinnedBoneNamesSet; } @@ -154,13 +154,20 @@ static UINT getFirstFreeIndex(MPlug* arrayPlug) } -MObject SkinManagerMaya::addMissingBones(BoneNamesVector& missingBoneNames, const UINT& skinnedBoneCount) +const bool SkinManagerMaya::addMissingBones(BoneNamesVector& missingBoneNames, const UINT& skinnedBoneCount) { + std::wstring command = L"skinCluster -e"; for (std::wstring& name : missingBoneNames) { - std::wstring command = fmt::format(L"skinCluster -e -ai {} {}", name, fmt::ptr(this->fnSkinCluster.name().asChar())); - MGlobal::executeCommand(MString(command.c_str())); + command = fmt::format(L"{} -ai \"{}\"", command, name); } + command = fmt::format(L"{} {}", command, this->fnSkinCluster.name().asWChar()); + auto status = MGlobal::executeCommand(MString(command.c_str())); + if (status == MS::kSuccess) + { + return true; + } + return false; } @@ -270,7 +277,6 @@ PySkinData SkinManagerMaya::extractSkinData(const bool safeMode) MDoubleArray weights; UINT boneCount; this->fnSkinCluster.getWeights(this->dagPath, this->component, weights, boneCount); - PySkinData pySkinData = PySkinData(vertexCount, this->maximumVertexWeightCount); MDagPathArray skinnedBones; MStatus status; this->fnSkinCluster.influenceObjects(skinnedBones, &status); @@ -278,13 +284,8 @@ PySkinData SkinManagerMaya::extractSkinData(const bool safeMode) { throw std::runtime_error("Failed to find influence objects!"); } - pySkinData.boneNames = std::vector(skinnedBones.length()); - for (UINT boneIndex = 0; boneIndex < skinnedBones.length(); boneIndex++) - { - pySkinData.boneNames[boneIndex] = fmt::format(L"{}", fmt::ptr(skinnedBones[boneIndex].partialPathName().asChar())); - } MPoint mPoint; - pySkinData.setMaximumVertexWeightCount(boneCount); + PySkinData pySkinData = PySkinData(vertexCount, boneCount); for (UINT vertexIndex = 0; vertexIndex < vertexCount; vertexIndex++) { UINT influenceIndex = 0; @@ -301,11 +302,18 @@ PySkinData SkinManagerMaya::extractSkinData(const bool safeMode) pySkinData.boneIDs(vertexIndex, influenceIndex) = boneIndex; influenceIndex += 1; } + this->maximumVertexWeightCount = influenceIndex > this->maximumVertexWeightCount ? influenceIndex : this->maximumVertexWeightCount; fnMesh.getPoint(vertexIndex, mPoint, MSpace::kObject); pySkinData.positions(vertexIndex, 0) = mPoint.x; pySkinData.positions(vertexIndex, 1) = mPoint.y; pySkinData.positions(vertexIndex, 2) = mPoint.z; } + pySkinData.setMaximumVertexWeightCount(this->maximumVertexWeightCount); + pySkinData.boneNames = std::vector(skinnedBones.length()); + for (UINT boneIndex = 0; boneIndex < skinnedBones.length(); boneIndex++) + { + pySkinData.boneNames[boneIndex] = fmt::format(L"{}", MNamespace::stripNamespaceFromName(skinnedBones[boneIndex].partialPathName()).asWChar()); + } if (safeMode) { if (pySkinData.weights.hasNaN()) @@ -415,7 +423,7 @@ static void getBoneNames(std::vector& currentBoneNames, const MDag currentBoneNames.resize(skinnedBoneCount); for (UINT boneIndex = 0; boneIndex < skinnedBoneCount; boneIndex++) { - currentBoneNames[boneIndex] = fmt::format(L"{}", fmt::ptr(skinnedBones[boneIndex].partialPathName().asChar())); + currentBoneNames[boneIndex] = fmt::format(L"{}", skinnedBones[boneIndex].partialPathName().asWChar()); } } diff --git a/src/cpp/skin_plus_plus_pymaya/skin_plus_plus_pymaya.h b/src/cpp/skin_plus_plus_pymaya/skin_plus_plus_pymaya.h index 0379d48..bcba232 100644 --- a/src/cpp/skin_plus_plus_pymaya/skin_plus_plus_pymaya.h +++ b/src/cpp/skin_plus_plus_pymaya/skin_plus_plus_pymaya.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -235,7 +236,7 @@ class SkinManagerMaya // Get the skin weights from the given node's skin modifier //std::vector>> getSkinWeights(); - MObject addMissingBones(std::vector& missingBoneNames, const UINT& skinnedBoneCount); + const bool addMissingBones(std::vector& missingBoneNames, const UINT& skinnedBoneCount); // Get the vertex weights, bone ids and positions from the given node PySkinData extractSkinData(const bool safeMode = true); diff --git a/src/cpp/skin_plus_plus_pymxs/source/skin_plus_plus_pymxs.cpp b/src/cpp/skin_plus_plus_pymxs/source/skin_plus_plus_pymxs.cpp index 5ac4584..09daafe 100644 --- a/src/cpp/skin_plus_plus_pymxs/source/skin_plus_plus_pymxs.cpp +++ b/src/cpp/skin_plus_plus_pymxs/source/skin_plus_plus_pymxs.cpp @@ -420,8 +420,9 @@ bool SkinManager::applySkinData(PySkinData& skinData) "skin bone ids count does not match skin weights count: " + convertWCharToChar(this->node->GetName()) ); const int vertexCount = getVertexCount(node); - if (boneIDsRows != vertexCount && !skinData.vertexIDs.has_value()) throw std::length_error( - fmt::format("skin vertex count does not match provided data count: {}", convertWCharToChar(this->node->GetName())) + + if (boneIDsRows != vertexCount && !skinData.vertexIDs.has_value()) throw py::value_error( + "skin vertex count does not match provided data count: " + convertWCharToChar(this->node->GetName()) ); auto skinBoneCount = this->iSkin->GetNumBones(); if (skinBoneCount == 0) diff --git a/src/skin_plus_plus/dccs/max/2024/skin_plus_plus_pymxs.pyd b/src/skin_plus_plus/dccs/max/2024/skin_plus_plus_pymxs.pyd index 9aaca66..261331f 100644 Binary files a/src/skin_plus_plus/dccs/max/2024/skin_plus_plus_pymxs.pyd and b/src/skin_plus_plus/dccs/max/2024/skin_plus_plus_pymxs.pyd differ diff --git a/src/skin_plus_plus/py/310/skin_plus_plus_py.pyd b/src/skin_plus_plus/py/310/skin_plus_plus_py.pyd index 7c94bad..69f1b83 100644 Binary files a/src/skin_plus_plus/py/310/skin_plus_plus_py.pyd and b/src/skin_plus_plus/py/310/skin_plus_plus_py.pyd differ