#include <maya/MPxLocatorNode.h>
#include <maya/MFnPlugin.h>
#include <maya/MFnEnumAttribute.h>
#include <maya/MFnNumericAttribute.h>
#include <maya/MFnTypedAttribute.h>
#include <maya/MFnStringData.h>
#include <maya/MFnPointArrayData.h>
#include <maya/MPointArray.h>
#include <maya/MUintArray.h>
#include <maya/MDrawRegistry.h>
#include <maya/MPxDrawOverride.h>
#include <maya/MUserData.h>
#include <algorithm>
using namespace MHWRender;
{
public:
enum EuiType {
kText,
kLine,
kPoint,
kRect,
kQuad,
kSphere,
kCircle,
kArc,
};
public:
uiDrawManager();
virtual ~uiDrawManager();
static void* creator();
static MObject aPrimitiveTransparency;
static MObject aTextBoxTransparency;
public:
static MString drawDbClassification;
};
MObject uiDrawManager::aPrimitiveColor;
MObject uiDrawManager::aPrimitiveTransparency;
MObject uiDrawManager::aTextAlignment;
MObject uiDrawManager::aTextBoxSize;
MObject uiDrawManager::aTextBoxColor;
MObject uiDrawManager::aTextBoxTransparency;
MObject uiDrawManager::aTextFontSize;
MObject uiDrawManager::aFontFaceName;
MObject uiDrawManager::aLineStartPoint;
MObject uiDrawManager::aLineEndPoint;
MObject uiDrawManager::aRectNormal;
MObject uiDrawManager::aQuadVertex[4];
MObject uiDrawManager::aCircleNormal;
MTypeId uiDrawManager::id(0x0008002A);
MString uiDrawManager::drawDbClassification(
"drawdb/geometry/uiDrawManager");
MString uiDrawManager::drawRegistrantId(
"uiDrawManagerPlugin");
uiDrawManager::uiDrawManager() {}
uiDrawManager::~uiDrawManager() {}
void* uiDrawManager::creator()
{
return new uiDrawManager();
}
{
public:
uiDrawManagerData();
virtual ~uiDrawManagerData() {};
uiDrawManager::EuiType fUIType;
float fLineWidth;
bool fIsFilled;
double fRadius;
bool fDraw2D;
unsigned int fTextFontSize;
unsigned int fFontFaceIndex;
int fTextBoxWidth;
int fTextBoxHeight;
float fPointSize;
double fRectScaleX;
double fRectScaleY;
};
uiDrawManagerData::uiDrawManagerData() :
MUserData(false)
, fUIType(uiDrawManager::kText)
, fColor(1.0f, 0.0f, 0.0f, 1.0f)
, fLineWidth(2.0f)
, fIsFilled(false)
, fRadius(1.0)
, fDraw2D(false)
, fPosition(0.0, 0.0, 0.001)
, fText("uiDrawManager-Text")
, fFontFaceIndex(0)
, fTextBoxWidth(0)
, fTextBoxHeight(0)
, fTextBoxColor(0.0f, 1.0f, 1.0f, 1.0f)
, fPointSize(2.0f)
, fLineStartPoint(0.0, 0.0, 0.0)
, fLineEndPoint(1.0, 1.0, 1.0)
, fRectUp(0.0, 1.0, 0.0)
, fRectNormal(0.0, 0.0, 1.0)
, fRectScaleX(1.0)
, fRectScaleY(1.0)
, fCircleNormal(0.0, 0.0, 1.0)
, fArcStart(1.0, 0.0, 0.0)
, fArcEnd(0.0, 1.0, 0.0)
, fArcNormal(0.0, 0.0, 1.0)
{
fQuadVertex[0] =
MPoint(0.0, 0.0, 0.0);
fQuadVertex[1] =
MPoint(1.0, 0.0, 0.0);
fQuadVertex[2] =
MPoint(1.0, 1.0, 0.0);
fQuadVertex[3] =
MPoint(0.0, 1.0, 0.0);
}
{
public:
{
return new uiDrawManagerDrawOverride(obj);
}
virtual ~uiDrawManagerDrawOverride();
protected:
private:
uiDrawManagerDrawOverride(
const MObject& obj);
};
uiDrawManagerDrawOverride::uiDrawManagerDrawOverride(
const MObject& obj)
{
}
uiDrawManagerDrawOverride::~uiDrawManagerDrawOverride()
{
}
DrawAPI uiDrawManagerDrawOverride::supportedDrawAPIs()
const
{
return (kOpenGL | kDirectX11);
}
bool uiDrawManagerDrawOverride::isBounded(
const MDagPath& ,
{
return false;
}
{
}
MUserData* uiDrawManagerDrawOverride::prepareForDraw(
{
uiDrawManagerData* data = dynamic_cast<uiDrawManagerData*>(oldData);
if (!data) {
data = new uiDrawManagerData();
}
if (status) {
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aUIType);
data->fUIType = (uiDrawManager::EuiType)plug.asShort();
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aPrimitiveColor);
nData.getData(data->fColor.r, data->fColor.g, data->fColor.b);
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aPrimitiveTransparency);
data->fColor.a = 1.0f - plug.asFloat();
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aLineWidth);
data->fLineWidth = plug.asFloat();
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aLineStyle);
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aIsFilled);
data->fIsFilled = plug.asBool();
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aRadius);
data->fRadius = plug.asDouble();
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aDraw2D);
data->fDraw2D = plug.asBool();
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aPosition);
nData.getData(data->fPosition.x, data->fPosition.y, data->fPosition.z);
data->fPosition.w = 1.0f;
}
switch (data->fUIType)
{
case uiDrawManager::kText:
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aText);
data->fText = plug.asString();
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aTextFontSize);
data->fTextFontSize = std::max(plug.asInt(), 0);
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aFontFaceName);
data->fFontFaceIndex = (unsigned int)plug.asInt();
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aTextAlignment);
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aTextBoxSize);
nData.getData(data->fTextBoxWidth, data->fTextBoxHeight);
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aTextBoxColor);
nData.getData(data->fTextBoxColor.r, data->fTextBoxColor.g, data->fTextBoxColor.b);
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aTextBoxTransparency);
data->fTextBoxColor.a = 1.0f - plug.asFloat();
}
break;
case uiDrawManager::kPoint:
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aPointSize);
data->fPointSize = plug.asFloat();
}
break;
case uiDrawManager::kLine:
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aLineStartPoint);
nData.getData(data->fLineStartPoint.x, data->fLineStartPoint.y, data->fLineStartPoint.z);
data->fLineStartPoint.w = 1.0f;
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aLineEndPoint);
nData.getData(data->fLineEndPoint.x, data->fLineEndPoint.y, data->fLineEndPoint.z);
data->fLineEndPoint.w = 1.0f;
}
break;
case uiDrawManager::kRect:
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aRectUp);
nData.getData(data->fRectUp.x, data->fRectUp.y, data->fRectUp.z);
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aRectNormal);
nData.getData(data->fRectNormal.x, data->fRectNormal.y, data->fRectNormal.z);
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aRectScale);
nData.getData(data->fRectScaleX, data->fRectScaleY);
}
break;
case uiDrawManager::kQuad:
{
for (int i = 0; i < 4; ++i)
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aQuadVertex[i]);
nData.getData(data->fQuadVertex[i].x, data->fQuadVertex[i].y, data->fQuadVertex[i].z);
}
}
break;
case uiDrawManager::kCircle:
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aCircleNormal);
nData.getData(data->fCircleNormal.x, data->fCircleNormal.y, data->fCircleNormal.z);
}
break;
case uiDrawManager::kArc:
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aArcStart);
nData.getData(data->fArcStart.x, data->fArcStart.y, data->fArcStart.z);
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aArcEnd);
nData.getData(data->fArcEnd.x, data->fArcEnd.y, data->fArcEnd.z);
}
{
MPlug plug(uiDrawManagerNode, uiDrawManager::aArcNormal);
nData.getData(data->fArcNormal.x, data->fArcNormal.y, data->fArcNormal.z);
}
break;
case uiDrawManager::kSphere:
break;
default:
perror("unhandled ui type.");
break;
}
}
return data;
}
void uiDrawManagerDrawOverride::addUIDrawables(
{
const uiDrawManagerData* thisdata = dynamic_cast<const uiDrawManagerData*>(data);
if (!thisdata) {
return;
}
switch (thisdata->fUIType)
{
case uiDrawManager::kText:
{
MString faceName = uiDrawManagerData::fFontList[thisdata->fFontFaceIndex];
int boxSize[] = { thisdata->fTextBoxWidth, thisdata->fTextBoxHeight };
if (thisdata->fDraw2D) {
drawManager.
text2d(thisdata->fPosition, thisdata->fText, thisdata->fTextAlignment,
boxSize[0]+boxSize[1] == 0 ? NULL : boxSize, &thisdata->fTextBoxColor, false);
}
else {
drawManager.
text(thisdata->fPosition, thisdata->fText, thisdata->fTextAlignment,
boxSize[0]+boxSize[1] == 0 ? NULL : boxSize, &thisdata->fTextBoxColor, false);
}
}
break;
case uiDrawManager::kLine:
{
if (thisdata->fDraw2D) {
drawManager.
line2d(thisdata->fLineStartPoint, thisdata->fLineEndPoint);
}
else {
drawManager.
line(thisdata->fLineStartPoint, thisdata->fLineEndPoint);
}
}
break;
case uiDrawManager::kPoint:
{
if (thisdata->fDraw2D) {
drawManager.
point2d(thisdata->fPosition);
}
else {
drawManager.
point(thisdata->fPosition);
}
}
break;
case uiDrawManager::kRect:
{
if (thisdata->fDraw2D) {
drawManager.
rect2d(thisdata->fPosition, thisdata->fRectUp,
thisdata->fRectScaleX, thisdata->fRectScaleY, thisdata->fIsFilled);
}
else {
drawManager.
rect(thisdata->fPosition, thisdata->fRectUp, thisdata->fRectNormal,
thisdata->fRectScaleX, thisdata->fRectScaleY, thisdata->fIsFilled);
}
}
break;
case uiDrawManager::kQuad:
{
thisdata->fIsFilled ? MUIDrawManager::kTriStrip : MUIDrawManager::kClosedLine;
for (int i = 0; i < 4; ++i) {
position.
append(thisdata->fQuadVertex[i]);
}
if (thisdata->fDraw2D) {
drawManager.
mesh2d(mode, position, NULL, thisdata->fIsFilled ? &index : NULL);
}
else {
drawManager.
mesh(mode, position, NULL, NULL, thisdata->fIsFilled ? &index : NULL);
}
}
break;
case uiDrawManager::kSphere:
{
drawManager.
sphere(thisdata->fPosition, thisdata->fRadius, thisdata->fIsFilled);
}
break;
case uiDrawManager::kCircle:
{
if (thisdata->fDraw2D) {
drawManager.
circle2d(thisdata->fPosition, thisdata->fRadius,
thisdata->fIsFilled);
}
else {
drawManager.
circle(thisdata->fPosition, thisdata->fCircleNormal, thisdata->fRadius,
thisdata->fIsFilled);
}
}
break;
case uiDrawManager::kArc:
{
if (thisdata->fDraw2D) {
drawManager.
arc2d(thisdata->fPosition, thisdata->fArcStart, thisdata->fArcEnd,
thisdata->fRadius, thisdata->fIsFilled);
}
else {
drawManager.
arc(thisdata->fPosition, thisdata->fArcStart, thisdata->fArcEnd,
thisdata->fArcNormal, thisdata->fRadius, thisdata->fIsFilled);
}
}
break;
default:
perror("unhandled ui types.");
break;
}
}
{
}
MStatus uiDrawManager::initialize()
{
aUIType = eAttr.
create(
"uiType",
"ut", uiDrawManager::kText);
eAttr.
addField(
"text", uiDrawManager::kText);
eAttr.
addField(
"line", uiDrawManager::kLine);
eAttr.
addField(
"point", uiDrawManager::kPoint);
eAttr.
addField(
"rect", uiDrawManager::kRect);
eAttr.
addField(
"quad", uiDrawManager::kQuad);
eAttr.
addField(
"sphere", uiDrawManager::kSphere);
eAttr.
addField(
"circle", uiDrawManager::kCircle);
eAttr.
addField(
"arc", uiDrawManager::kArc);
aLineStyle = eAttr.
create(
"lineStyle",
"ls", MUIDrawManager::kSolid);
eAttr.
addField(
"solid", MUIDrawManager::kSolid);
eAttr.
addField(
"shortdotted", MUIDrawManager::kShortDotted);
eAttr.
addField(
"shortdashed", MUIDrawManager::kShortDashed);
eAttr.
addField(
"dashed", MUIDrawManager::kDashed);
eAttr.
addField(
"dotted", MUIDrawManager::kDotted);
unsigned int nFont = MUIDrawManager::getFontList(uiDrawManagerData::fFontList);
if (nFont == 0)
{
perror("No font available!");
}
aFontFaceName = eAttr.
create(
"fontFaceName",
"ffn", 0);
for (unsigned int i = 0; i < nFont; i++)
{
MString str = uiDrawManagerData::fFontList[i];
}
aTextAlignment = eAttr.
create(
"textAlignment",
"ta", MUIDrawManager::kLeft);
eAttr.
addField(
"left", MUIDrawManager::kLeft);
eAttr.
addField(
"center", MUIDrawManager::kCenter);
eAttr.
addField(
"right", MUIDrawManager::kRight);
double defaultPosition[4][3] =
{
{0.0, 0.0, 0.0},
{1.0, 0.0, 0.0},
{1.0, 1.0, 0.0},
{0.0, 1.0, 0.0}
};
for (int i = 0; i < 4; ++i)
{
nAttr.
setDefault(defaultPosition[i][0], defaultPosition[i][1], defaultPosition[i][2]);
}
}
{
MFnPlugin plugin( obj, PLUGIN_COMPANY,
"3.0",
"Any");
status = plugin.registerNode(
"uiDrawManager",
uiDrawManager::id,
&uiDrawManager::creator,
&uiDrawManager::initialize,
&uiDrawManager::drawDbClassification);
if (!status) {
status.
perror(
"registerNode");
return status;
}
uiDrawManager::drawDbClassification,
uiDrawManager::drawRegistrantId,
uiDrawManagerDrawOverride::Creator);
if (!status) {
status.
perror(
"registerDrawOverrideCreator");
return status;
}
return status;
}
{
status = MDrawRegistry::deregisterGeometryOverrideCreator(
uiDrawManager::drawDbClassification,
uiDrawManager::drawRegistrantId);
if (!status) {
status.
perror(
"deregisterGeometryOverrideCreator");
return status;
}
status = plugin.deregisterNode( uiDrawManager::id );
if (!status) {
status.
perror(
"deregisterNode");
return status;
}
return status;
}