#include <maya/MCallbackIdArray.h>
#include <maya/MDagMessage.h>
#include <maya/MDrawRegistry.h>
#include <maya/MFnDagNode.h>
#include <maya/MFnEnumAttribute.h>
#include <maya/MFnNumericAttribute.h>
#include <maya/MFnPlugin.h>
#include <maya/MFrameContext.h>
#include <maya/MItDag.h>
#include <maya/MPxDrawOverride.h>
#include <maya/MPxLocatorNode.h>
#include <maya/MVectorArray.h>
#include <stdio.h>
{
public:
enum ETransformType
{
kTranslate,
kRotate,
kScale,
kShear
};
static void* creator() { return new transformDrawNode(); }
static char* className;
static MString drawDbClassification;
private:
transformDrawNode();
~transformDrawNode() override;
static void AllDagChangesCallback(
void *clientData);
static void WorldMatrixModifiedCallback(
MDagMessage::MatrixModifiedFlags &modified,
void *clientData);
void processDagMessage(bool refreshWorldMatrixCbIds);
MCallbackId fAllDagChangesCbId;
};
char* transformDrawNode::className = "transformDrawNode";
MTypeId transformDrawNode::id(0x80034);
MString transformDrawNode::drawDbClassification(
"drawdb/geometry/transformDrawNode");
MString transformDrawNode::drawRegistrantId(transformDrawNode::className);
MObject transformDrawNode::aTextColor;
MObject transformDrawNode::aTransformType;
MStatus transformDrawNode::initialize()
{
aTransformType = eAttr.
create(
"transformType",
"tt", kTranslate);
eAttr.
addField(
"Translate", kTranslate);
return MS::kSuccess;
}
{
AllDagChangesCallback, this);
}
transformDrawNode::~transformDrawNode()
{
if (fWorldMatrixModifiedCbIds.length() > 0)
{
}
if (fAllDagChangesCbId != 0)
{
}
}
void transformDrawNode::processDagMessage(bool refreshWorldMatrixModifiedCbIds)
{
MRenderer::setGeometryDrawDirty(thisMObject());
if (refreshWorldMatrixModifiedCbIds)
{
if (status)
{
if (fWorldMatrixModifiedCbIds.length() > 0)
{
fWorldMatrixModifiedCbIds.clear();
}
for ( ;!dagIt.isDone(); dagIt.next() )
{
status = dagIt.getPath(dagPath);
if (status)
{
dagPath, WorldMatrixModifiedCallback, this);
fWorldMatrixModifiedCbIds.append(id);
}
}
}
}
}
void transformDrawNode::AllDagChangesCallback(
void *clientData)
{
transformDrawNode *node = static_cast<transformDrawNode*>(clientData);
if (node) node->processDagMessage(true);
}
void transformDrawNode::WorldMatrixModifiedCallback(
MDagMessage::MatrixModifiedFlags &modified,
void *clientData)
{
transformDrawNode *node = static_cast<transformDrawNode*>(clientData);
if (node) node->processDagMessage(false);
}
{
public:
transformDrawData()
, fTextColor(1.0f, 1.0f, 1.0f, 1.0f)
, fTransformType(transformDrawNode::kTranslate)
{
}
~transformDrawData() override {}
transformDrawNode::ETransformType fTransformType;
};
{
public:
{
return new transformDrawOverride(obj);
}
private:
~transformDrawOverride() override {}
};
MUserData* transformDrawOverride::prepareForDraw(
{
if (!status) return NULL;
transformDrawData* tdData = dynamic_cast<transformDrawData*>(oldData);
if (!tdData)
{
tdData = new transformDrawData();
}
{
MPlug plug(obj, transformDrawNode::aTextColor);
nData.getData(tdData->fTextColor.r, tdData->fTextColor.g, tdData->fTextColor.b);
}
{
MPlug plug(obj, transformDrawNode::aTransformType);
tdData->fTransformType = (transformDrawNode::ETransformType)plug.asInt();
}
tdData->fPositions.clear();
tdData->fVectors.clear();
if (status)
{
for ( ; !dagIt.isDone(); dagIt.next() )
{
status = dagIt.getPath(dagPath);
if (!status)
{
status.
perror(
"MItDag::getPath");
continue;
}
if (!status)
{
status.
perror(
"MDagPath::transform");
continue;
}
if (!status)
{
status.
perror(
"MFnDagNode constructor");
continue;
}
tdData->fPositions.append(vec);
double tmp[3];
switch (tdData->fTransformType)
{
case transformDrawNode::kRotate:
matrix.getRotation(tmp, order);
break;
case transformDrawNode::kScale:
break;
case transformDrawNode::kShear:
break;
default:
break;
}
tdData->fVectors.append(vec);
}
}
return tdData;
}
void transformDrawOverride::addUIDrawables(
{
const transformDrawData* tdData = dynamic_cast<const transformDrawData*>(data);
if (!tdData) return;
drawManager.
setColor(tdData->fTextColor);
for (unsigned int i = 0; i < tdData->fVectors.length(); i++)
{
MPoint pos(tdData->fPositions[i]);
char tmpStr[128] = {0};
sprintf(tmpStr, "(%.3f, %.3f, %.3f)", vec.x, vec.y, vec.z);
drawManager.
text(pos, text, MUIDrawManager::kCenter);
}
}
{
MFnPlugin plugin( obj, PLUGIN_COMPANY,
"1.0",
"Any" );
MStatus status = plugin.registerNode(
transformDrawNode::className,
transformDrawNode::id,
transformDrawNode::creator,
transformDrawNode::initialize,
&transformDrawNode::drawDbClassification);
if (!status)
{
status.
perror(
"registerNode");
return status;
}
status = MDrawRegistry::registerDrawOverrideCreator(
transformDrawNode::drawDbClassification,
transformDrawNode::drawRegistrantId,
transformDrawOverride::creator);
if (!status)
{
status.
perror(
"registerDrawOverrideCreator");
return status;
}
return status;
}
{
MStatus status = MDrawRegistry::deregisterDrawOverrideCreator(
transformDrawNode::drawDbClassification,
transformDrawNode::drawRegistrantId);
if (!status)
{
status.
perror(
"deregisterDrawOverrideCreator");
return status;
}
status = plugin.deregisterNode(transformDrawNode::id);
if (!status)
{
status.
perror(
"deregisterNode");
return status;
}
return status;
}