#include <iostream>
#include <maya/MStatus.h>
#include <maya/MIOStream.h>
#include <maya/MPxNode.h>
#include <maya/MString.h>
#include <maya/MTypeId.h>
#include <maya/MPlug.h>
#include <maya/MDataBlock.h>
#include <maya/MDataHandle.h>
#include <maya/MArrayDataHandle.h>
#include <maya/MFnNumericAttribute.h>
#include <maya/MFnCompoundAttribute.h>
#include <maya/MFloatVector.h>
#include <maya/MFnTypedAttribute.h>
#include <maya/MFnGeometryData.h>
#include <maya/MFnPlugin.h>
#include <maya/MFnMesh.h>
#include <maya/MGlobal.h>
#include <maya/MPointArray.h>
#include <cmath>
#include <algorithm>
constexpr double kFloatEpsilon {1.0e-4};
{
public:
MeshCompare();
~MeshCompare() override;
SchedulingType
schedulingType()
const override {
return SchedulingType::kParallel; }
static void * creator();
protected:
};
MTypeId MeshCompare::id( 0x58000880 );
MeshCompare::MeshCompare()
{
}
MeshCompare::~MeshCompare()
{
}
void* MeshCompare::creator()
{
return new MeshCompare();
}
{
if (!stat) { stat.
perror(
"create attribute inputA");
return stat; }
if (!stat) { stat.
perror(
"create attribute inputB");
return stat; }
return MS::kSuccess;
}
{
if( plug == aOutValue )
{
bool same = (c == b.length());
if(same)
{
for(unsigned int i = 0; i < c; ++i){
same = false;
auto pta = a[i];
auto ptb = b[i];
auto eps = std::max({pta[0]*kFloatEpsilon, ptb[0]*kFloatEpsilon, kFloatEpsilon});
if(std::fabs(pta[0] - ptb[0]) > eps) break;
eps = std::max({pta[1]*kFloatEpsilon, ptb[1]*kFloatEpsilon, kFloatEpsilon});
if(std::fabs(pta[1] - ptb[1]) > eps) break;
eps = std::max({pta[2]*kFloatEpsilon, ptb[2]*kFloatEpsilon, kFloatEpsilon});
if(std::fabs(pta[2] - ptb[2]) > eps) break;
same = true;
}
}
} else
return MS::kUnknownParameter;
return MS::kSuccess;
}
{
MFnPlugin plugin( obj,
"Autodesk",
"1.0",
"Any");
CHECK_MSTATUS ( plugin.registerNode(
"MeshCompare", MeshCompare::id,
MeshCompare::creator, MeshCompare::initialize,
return MS::kSuccess;
}
{
return MS::kSuccess;
}