! Add flag to control hash types

This commit is contained in:
indigo 2023-09-24 21:17:26 +08:00
parent 1992234adf
commit 777a2b8ed7
2 changed files with 129 additions and 43 deletions

View File

@ -8,10 +8,13 @@
#include <maya/MDagPath.h> #include <maya/MDagPath.h>
#include <maya/MFnMesh.h> #include <maya/MFnMesh.h>
#include <maya/MFloatArray.h> #include <maya/MFloatArray.h>
#include <maya/MPointArray.h>
#include <maya/MItDag.h> #include <maya/MItDag.h>
#include <algorithm> #include <algorithm>
#include <functional> #include <functional>
#include <vector> #include <vector>
#include <fstream>
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include <chrono> #include <chrono>
@ -37,9 +40,12 @@ MSyntax MeshInfoCmd::newSyntex()
syntax.addFlag(kVtxHashFlag, kVtxHashFlagLong, MSyntax::kNoArg); syntax.addFlag(kVtxHashFlag, kVtxHashFlagLong, MSyntax::kNoArg);
syntax.addFlag(kUvHashFlag, kUvHashFlagLong, MSyntax::kNoArg); syntax.addFlag(kUvHashFlag, kUvHashFlagLong, MSyntax::kNoArg);
syntax.addFlag(kPtHashFlag, kPtHashFlagLong, MSyntax::kNoArg);
syntax.addFlag(kExtendToShapeFlag, kExtendToShapeFlagLong, MSyntax::kNoArg); syntax.addFlag(kExtendToShapeFlag, kExtendToShapeFlagLong, MSyntax::kNoArg);
syntax.addFlag(kNoIntermediaFlag, kNoIntermediaFlagLong, MSyntax::kNoArg); syntax.addFlag(kNoIntermediaFlag, kNoIntermediaFlagLong, MSyntax::kNoArg);
syntax.addFlag(kFileFlag, kFileFlagLong, MSyntax::kString); syntax.addFlag(kFileFlag, kFileFlagLong, MSyntax::kString);
syntax.enableQuery(true);
return syntax; return syntax;
} }
@ -68,6 +74,39 @@ MString MeshInfoCmd::getHash(MFloatArray & arrayData1, MFloatArray & arrayData2)
return MString(hex); return MString(hex);
} }
MString MeshInfoCmd::getHash(MPointArray & arrayData)
{
auto SHA1 = sha1();
SHA1.add(&arrayData[0], sizeof(MPoint) * arrayData.length());
char hex[SHA1_HEX_SIZE];
SHA1.finalize().print_hex(hex);
return MString(hex);
}
MString MeshInfoCmd::getVtxHash(MFnMesh & fnMesh)
{
MIntArray vertexCount, vertexList;
fnMesh.getVertices(vertexCount, vertexList);
MString vtx_hash = getHash(vertexCount, vertexList);
return vtx_hash;
}
MString MeshInfoCmd::getUvHash(MFnMesh & fnMesh)
{
MFloatArray uArray, vArray;
fnMesh.getUVs(uArray, vArray);
MString uv_hash = getHash(uArray, vArray);
return uv_hash;
}
MString MeshInfoCmd::getPtHash(MFnMesh & fnMesh)
{
MPointArray ptArray;
fnMesh.getPoints(ptArray);
MString pt_hash = getHash(ptArray);
return pt_hash;
}
MStatus MeshInfoCmd::extendToShape(MSelectionList & list) MStatus MeshInfoCmd::extendToShape(MSelectionList & list)
{ {
MStatus status; MStatus status;
@ -81,23 +120,24 @@ MStatus MeshInfoCmd::extendToShape(MSelectionList & list)
for (unsigned int i = 0; i < nObj; i++) for (unsigned int i = 0; i < nObj; i++)
{ {
MObject node; MObject node;
current_list.getDependNode(0, node); current_list.getDependNode(0, node);
if (!node.hasFn(MFn::kMesh)) if (!node.hasFn(MFn::kMesh)) {
{
MItDag itDag; MItDag itDag;
itDag.reset(node); itDag.reset(node);
while (!itDag.isDone()) while (!itDag.isDone())
{ {
MObject currentItem = itDag.currentItem();
if (!currentItem.hasFn(MFn::kMesh))
continue;
MObject currentItem = itDag.currentItem();
if (currentItem.hasFn(MFn::kMesh)) {
MDagPath dagPath; MDagPath dagPath;
MFnMesh fnMesh(dagPath); MFnMesh fnMesh(dagPath);
itDag.getPath(dagPath); itDag.getPath(dagPath);
list.add(dagPath); list.add(dagPath);
}
itDag.next(); itDag.next();
} }
} }
@ -123,26 +163,60 @@ MStatus MeshInfoCmd::doIt(const MArgList & args)
return status; return status;
} }
bool isQuery = argData.isQuery();
bool vtxHashGen = argData.isFlagSet(kVtxHashFlag); bool vtxHashGen = argData.isFlagSet(kVtxHashFlag);
bool uvHashGen = argData.isFlagSet(kUvHashFlag); bool uvHashGen = argData.isFlagSet(kUvHashFlag);
bool ptHashGen = argData.isFlagSet(kPtHashFlag);
bool ets = argData.isFlagSet(kExtendToShapeFlag); bool ets = argData.isFlagSet(kExtendToShapeFlag);
bool noIntermdia = argData.isFlagSet(kNoIntermediaFlag); bool noIntermdia = argData.isFlagSet(kNoIntermediaFlag);
bool fileGen = argData.isFlagSet(kFileFlag); bool fileGen = argData.isFlagSet(kFileFlag);
if (list.isEmpty()) {
MGlobal::displayError("Error to get object in selection list");
return MS::kNotFound;
}
if (isQuery) {
MObject node;
list.getDependNode(0, node);
if (!node.hasFn(MFn::kMesh)) {
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));
return MS::kSuccess;
}
if (uvHashGen) {
setResult(getUvHash(fnMesh));
return MS::kSuccess;
}
if (ptHashGen) {
setResult(getPtHash(fnMesh));
return MS::kSuccess;
}
}
if (ets) { if (ets) {
extendToShape(list); extendToShape(list);
} }
unsigned nObj = list.length(); unsigned nObj = list.length();
MStringArray result;
std::vector<std::string> header = { "name", "vertices_hash", "uv_hash" }; std::vector<std::string> header = { "name", "vertices_hash", "uv_hash", "point_hash", "num_vertices", "num_polygons" };
auto meshInfo = json::array(); auto meshInfo = json::array();
meshInfo.push_back(header); meshInfo.push_back(header);
if (nObj) if (nObj){
{
for (unsigned int i = 0; i < nObj; i++) for (unsigned int i = 0; i < nObj; i++) {
{
MDagPath dagPath; MDagPath dagPath;
MObject depNode; MObject depNode;
list.getDependNode(i, depNode); list.getDependNode(i, depNode);
@ -159,45 +233,51 @@ MStatus MeshInfoCmd::doIt(const MArgList & args)
if (fnMesh.isIntermediateObject()) if (fnMesh.isIntermediateObject())
continue; continue;
} }
/*std::vector<int> intArray;
intArray.resize(vertexList.length());
vertexList.get(&intArray[0]);*/
//std::copy(intArray.begin(), intArray.end(), std::ostream_iterator<int>(ss_result, ","));
/*auto SHA1 = sha1(); MString vtxHash, uvHash, ptHash;
//SHA1.add(&intArray[0], sizeof(int) * intArray.size());
SHA1.add(&vertexList[0], sizeof(int) * vertexList.length());
char hex[SHA1_HEX_SIZE];
SHA1.finalize().print_hex(hex);*/
//char hex[SHA1_HEX_SIZE];
result.append(fnMesh.name());
MString vtx_hash, uv_hash;
if (vtxHashGen || fileGen) { if (vtxHashGen || fileGen) {
MIntArray vertexCount, vertexList; vtxHash = getVtxHash(fnMesh);
fnMesh.getVertices(vertexCount, vertexList);
vtx_hash = getHash(vertexCount, vertexList);
result.append(vtx_hash);
} }
if (uvHashGen || fileGen){ if (uvHashGen || fileGen) {
MFloatArray uArray, vArray; uvHash = getUvHash(fnMesh);
fnMesh.getUVs(uArray, vArray); }
uv_hash = getHash(uArray, vArray);
result.append(uv_hash); if (ptHashGen || fileGen) {
ptHash = getPtHash(fnMesh);
} }
if (fileGen) if (fileGen)
{ {
std::vector<std::string> hashData = { fnMesh.name().asChar(), vtx_hash.asChar(), uv_hash.asChar() }; std::vector<std::string> hashData = {
fnMesh.name().asChar(),
vtxHash.asChar(), uvHash.asChar(), ptHash.asChar(),
std::to_string(fnMesh.numVertices()),
std::to_string(fnMesh.numPolygons())
};
meshInfo.push_back(hashData); meshInfo.push_back(hashData);
} }
}
}
}
}
std::string meshInfo_s = meshInfo.dump(4); std::string meshInfo_s = meshInfo.dump(4);
MGlobal::displayInfo(meshInfo_s.c_str());
setResult(result); if (fileGen)
{
MString filePath;
argData.getFlagArgument(kFileFlag, 0, filePath);
std::ofstream out(filePath.asChar());
out << meshInfo_s;
out.close();
char buff[1024];
sprintf(buff, "Mesh info file exported : %s", filePath.asChar());
MGlobal::displayInfo(buff);
}
else {
setResult(MString(meshInfo_s.c_str()));
}
return status; return status;
} }

View File

@ -8,6 +8,8 @@
#define kVtxHashFlagLong "-vtxHash" #define kVtxHashFlagLong "-vtxHash"
#define kUvHashFlag "-uvh" #define kUvHashFlag "-uvh"
#define kUvHashFlagLong "-uvHash" #define kUvHashFlagLong "-uvHash"
#define kPtHashFlag "-pth"
#define kPtHashFlagLong "-ptHash"
#define kExtendToShapeFlag "-ets" #define kExtendToShapeFlag "-ets"
#define kExtendToShapeFlagLong "-extendToShape" #define kExtendToShapeFlagLong "-extendToShape"
#define kNoIntermediaFlag "-ni" #define kNoIntermediaFlag "-ni"
@ -27,5 +29,9 @@ public:
MString getHash(MIntArray& arrayData1, MIntArray& arrayData2); MString getHash(MIntArray& arrayData1, MIntArray& arrayData2);
MString getHash(MFloatArray& arrayData1, MFloatArray& arrayData2); MString getHash(MFloatArray& arrayData1, MFloatArray& arrayData2);
MString getHash(MPointArray& arrayData);
MString getVtxHash(MFnMesh& fnMesh);
MString getUvHash(MFnMesh& fnMesh);
MString getPtHash(MFnMesh& fnMesh);
MStatus extendToShape(MSelectionList &list); MStatus extendToShape(MSelectionList &list);
}; };