#include <maya/MPxLocatorNode.h>
#include <maya/MPlug.h>
#include <maya/MMatrix.h>
#include <maya/MPointArray.h>
#include <maya/MDataBlock.h>
#include <maya/MDataHandle.h>
#include <maya/MFnPlugin.h>
#include <maya/MFnNumericAttribute.h>
#include <maya/MFnTypedAttribute.h>
#include <maya/MFnNurbsSurface.h>
#include <maya/MFnNurbsSurfaceData.h>
#include <maya/MFnPointArrayData.h>
#include <maya/MFnMatrixData.h>
#include <maya/MPxDrawOverride.h>
#include <maya/MDrawRegistry.h>
#include <maya/MColorArray.h>
{
public:
cvColor() {}
~cvColor() override {}
static void * creator();
};
class cvColorDrawOverrideData :
public MUserData
{
public:
cvColorDrawOverrideData() :
MUserData(false) {}
~cvColorDrawOverrideData() override{}
bool enableDrawing = true;
float pointSize = 4.0f;
};
{
public:
static MPxDrawOverride* Creator(
const MObject& obj)
{
return new cvColorDrawOverride(obj);
}
~cvColorDrawOverride() override{}
private:
cvColorDrawOverride(
const MObject& obj);
};
{
if ( plug == cvLocations ) {
if (!stat) {
stat.
perror(
"cvColor::compute get inputSurface");
return stat;
}
if (!stat) {
stat.
perror(
"cvColor::compute surface creator");
return stat;
}
if (!stat) {
stat.
perror(
"cvColor::compute get cvLocations");
return stat;
}
if (!stat) {
stat.
perror(
"cvColor::compute point array data creator");
return stat;
}
if (!stat) {
stat.
perror(
"cvColor::compute getCVs");
return stat;
}
stat = cvData.
set ( cvArray );
if (!stat) {
stat.
perror(
"cvColor::compute setCVs");
return stat;
}
if (!stat) {
stat.
perror(
"cvColor::compute setClean");
return stat;
}
} else {
return MS::kUnknownParameter;
}
return MS::kSuccess;
}
bool cvColor::isBounded() const
{
return false;
}
void* cvColor::creator()
{
return new cvColor();
}
{
drawingEnabled = numericAttr.
create(
"drawingEnabled",
"en",
if (!stat) {
stat.
perror(
"create drawingEnabled attribute");
return stat;
}
pointSize = numericAttr.
create(
"pointSize",
"ps",
if (!stat) {
stat.
perror(
"create pointSize attribute");
return stat;
}
inputSurface = typedAttr.
create(
"inputSurface",
"is",
if (!stat) {
stat.
perror(
"create inputSurface attribute");
return stat;
}
cvLocations = typedAttr.
create(
"cvLocations",
"cv",
if (!stat) {
stat.
perror(
"create cvLocations attribute");
return stat;
}
defaultAttr = defaultArray.
create (defaultPoints);
if (!stat) {
stat.
perror(
"could not create default output attribute");
return stat;
}
stat = addAttribute (drawingEnabled);
if (!stat) { stat.
perror(
"addAttribute");
return stat;}
stat = addAttribute (pointSize);
if (!stat) { stat.
perror(
"addAttribute");
return stat;}
stat = addAttribute (inputSurface);
if (!stat) { stat.
perror(
"addAttribute");
return stat;}
stat = addAttribute (cvLocations);
if (!stat) { stat.
perror(
"addAttribute");
return stat;}
stat = attributeAffects( inputSurface, cvLocations );
if (!stat) { stat.
perror(
"attributeAffects");
return stat;}
stat = attributeAffects( drawingEnabled, cvLocations );
if (!stat) { stat.
perror(
"attributeAffects");
return stat;}
stat = attributeAffects( pointSize, cvLocations );
if (!stat) { stat.
perror(
"attributeAffects");
return stat;}
return MS::kSuccess;
}
cvColorDrawOverride::cvColorDrawOverride(
const MObject& obj)
:
MHWRender::MPxDrawOverride(obj, nullptr, false)
{
}
{
cvColorDrawOverrideData* cvColorData = dynamic_cast<cvColorDrawOverrideData*>(oldData);
if(!cvColorData)
{
cvColorData = new cvColorDrawOverrideData();
}
MPlug drawingEnabledPlug(locatorNode, cvColor::drawingEnabled);
MStatus stat = drawingEnabledPlug.getValue(cvColorData->enableDrawing);
if (!stat) {
stat.
perror(
"cvColorDrawOverride::prepareForDraw get drawingEnabled failed !");
}
MPlug pointSizePlug(locatorNode, cvColor::pointSize);
stat = pointSizePlug.getValue(cvColorData->pointSize);
if (!stat) {
stat.
perror(
"cvColorDrawOverride::prepareForDraw get pointSize failed !");
}
MPlug cvLocationsPlug(locatorNode, cvColor::cvLocations);
stat = cvLocationsPlug.getValue(cvLocationsObject);
if (!stat) {
stat.
perror(
"cvColorDrawOverride::prepareForDraw get cvObject failed !");
}
if (!stat) {
stat.
perror(
"cvColorDrawOverride::prepareForDraw get point array data failed !");
}
cvColorData->pointArray = cvData.array(&stat);
if (!stat) {
stat.
perror(
"cvColorDrawOverride::prepareForDraw get point array failed !");
}
MObject worldSpaceAttribute = fnLocatorNode.attribute(
"worldMatrix");
MPlug matrixPlug(locatorNode, worldSpaceAttribute);
matrixPlug = matrixPlug.elementByLogicalIndex(0);
stat = matrixPlug.getValue(matObject);
if (!stat) {
stat.
perror(
"cvColorDrawOverride::prepareForDraw get matObject failed !");
}
if (!stat) {
stat.
perror(
"cvColorDrawOverride::prepareForDraw get world matrix data failed !");
}
cvColorData->worldSpace = matrixData.matrix(&stat);
if (!stat) {
stat.
perror(
"cvColorDrawOverride::prepareForDraw get world matrix failed !");
}
return cvColorData;
}
{
cvColorDrawOverrideData* cvColorData = (cvColorDrawOverrideData*)data;
if (!cvColorData)
return;
if (!cvColorData->enableDrawing)
return;
const MColor red(1.0, 0.0f, 0.0f);
const MColor cyan(0.0, 1.0f, 1.0f);
const MColor blue(0.0, 0.0f, 1.0f);
const MColor yellow(1.0, 1.0f, 0.0f);
colorArray.
setLength(cvColorData->pointArray.length());
for(unsigned int i = 0; i < cvColorData->pointArray.length(); i++)
{
MPoint point = cvColorData->pointArray[i];
point *= cvColorData->worldSpace;
if (point.
x < 0 && point.
y < 0)
{
colorArray[i] = red;
}
else if (point.
x < 0 && point.
y >= 0)
{
colorArray[i] = cyan;
}
else if (point.
x >= 0 && point.
y < 0)
{
colorArray[i] = blue;
}
else if (point.
x >= 0 && point.
y >= 0)
{
colorArray[i] = yellow;
}
}
drawManager.
mesh(MHWRender::MUIDrawManager::Primitive::kPoints, cvColorData->pointArray,
nullptr, &colorArray,
nullptr,
nullptr);
}
namespace
{
const MString gDrawDbClassification(
"drawdb/geometry/cvColorDrawOverride");
const MString gDrawRegistrantId(
"cvColorPlugin");
}
{
MFnPlugin plugin( obj, PLUGIN_COMPANY,
"3.0",
"Any");
status = plugin.registerNode( "cvColor", cvColor::id,
&cvColor::creator, &cvColor::initialize,
if (!status) {
status.
perror(
"registerNode");
return status;
}
gDrawDbClassification,
gDrawRegistrantId,
cvColorDrawOverride::Creator);
if (!status) {
status.
perror(
"registerDrawOverrideCreator");
return status;
}
return status;
}
{
status = plugin.deregisterNode( cvColor::id );
if (!status) {
status.
perror(
"deregisterNode");
return status;
}
if (!status) {
status.
perror(
"deregisterDrawOverrideCreator");
return status;
}
return status;
}