#include "pointOnMeshCmd.h"
#include "getPointAndNormal.h"
pointOnMeshCommand::pointOnMeshCommand()
{
}
pointOnMeshCommand::~pointOnMeshCommand()
{
}
void* pointOnMeshCommand::creator()
{
return new pointOnMeshCommand;
}
bool pointOnMeshCommand::isUndoable() const
{
return true;
}
{
nodeCreated = positionSpecified = normalSpecified = faceIndexSpecified = relativeSpecified = parameterUSpecified = parameterVSpecified = false;
meshNodeName = pointOnMeshInfoName = "";
for (
unsigned i=0; i<args.
length(); i++)
{
pointOnMeshInfoName = args.
asString(++i);
positionSpecified = true;
normalSpecified = true;
{
faceIndexSpecified = true;
int temp = args.
asInt(++i);
if (temp<0)
{
displayError("Invalid faceIndex!");
return MS::kFailure;
}
faceIndex = temp;
}
{
relativeSpecified = true;
}
{
parameterUSpecified = true;
if ((temp<0) || (temp>1))
{
displayError("Invalid parameterU!");
return MS::kFailure;
}
parameterU = temp;
}
{
parameterVSpecified = true;
if ((temp<0) || (temp>1))
{
displayError("Invalid parameterV!");
return MS::kFailure;
}
parameterV = temp;
}
else if (i==(args.
length()-1))
else
{
MString errorMessage =
"Invalid flag: ";
displayError(errorMessage);
return MS::kFailure;
}
}
if (!faceIndexSpecified)
faceIndex = 0;
if (!relativeSpecified)
relative = true;
if (!parameterUSpecified)
parameterU = 0.5;
if (!parameterVSpecified)
parameterV = 0.5;
return redoIt();
}
MStatus pointOnMeshCommand::redoIt()
{
if (meshNodeName=="")
{
{
displayError("No mesh or mesh transform specified!");
return MS::kFailure;
}
}
else if (sList.
add(meshNodeName) == MS::kInvalidParameter)
{
displayError("Specified mesh does not exist!");
return MS::kFailure;
}
{
if (!positionSpecified && !normalSpecified)
{
nodeCreated = true;
if (pointOnMeshInfoName == "")
depNodeFn.
create(
"pointOnMeshInfo");
else
depNodeFn.
create(
"pointOnMeshInfo", pointOnMeshInfoName);
pointOnMeshInfoName = depNodeFn.
name();
if (faceIndexSpecified)
{
}
if (relativeSpecified)
{
}
if (parameterUSpecified)
{
}
if (parameterVSpecified)
{
}
MPlug worldMeshPlug, inMeshPlug;
inMeshPlug = depNodeFn.
findPlug(
"inMesh",
true);
worldMeshPlug = depNodeFn.
findPlug(
"worldMesh",
true);
dgModifier.
connect(worldMeshPlug, inMeshPlug);
setResult(pointOnMeshInfoName);
}
else
getPointAndNormal(meshDagPath, faceIndex, relative, parameterU, parameterV, point, normal);
}
{
if (!positionSpecified && !normalSpecified)
{
nodeCreated = true;
if (pointOnMeshInfoName == "")
depNodeFn.
create(
"pointOnMeshInfo");
else
depNodeFn.
create(
"pointOnMeshInfo", pointOnMeshInfoName);
pointOnMeshInfoName = depNodeFn.
name();
if (faceIndexSpecified)
{
}
if (relativeSpecified)
{
}
if (parameterUSpecified)
{
}
if (parameterVSpecified)
{
}
MPlug worldMeshPlug, inMeshPlug;
inMeshPlug = depNodeFn.
findPlug(
"inMesh",
true);
worldMeshPlug = depNodeFn.
findPlug(
"worldMesh",
true);
dgModifier.
connect(worldMeshPlug, inMeshPlug);
setResult(pointOnMeshInfoName);
}
else
getPointAndNormal(meshDagPath, faceIndex, relative, parameterU, parameterV, point, normal);
}
else
{
displayError("Invalid type! Only a mesh or its transform can be specified!");
}
if (positionSpecified)
{
}
if (normalSpecified)
{
}
setResult(result);
}
MStatus pointOnMeshCommand::undoIt()
{
if (nodeCreated)
{
deleteCmd += pointOnMeshInfoName;
}
}