#include <stdio.h>
#include <maya/MString.h>
#include <maya/MFnDependencyNode.h>
#include <maya/MFnPlugin.h>
#include <maya/MViewport2Renderer.h>
#include <maya/MItDag.h>
#include <maya/MUintArray.h>
#include <maya/MPointArray.h>
#include <maya/MDrawRegistry.h>
#include <maya/MPxDrawOverride.h>
#include "spReticleLoc.h"
#define McheckStatus(stat,msg) \
if (!stat) { \
stat.perror(msg); \
return stat; \
}
#define McheckVoid(stat,msg) \
if (!stat) { \
stat.perror(msg); \
return; \
}
MTypeId spReticleLoc::id( 0x00000502 );
MString spReticleLoc::drawDbClassification(
"drawdb/geometry/spReticleLoc");
MString spReticleLoc::drawRegistrantId(
"spReticleLocPlugin");
MObject spReticleLoc::DrawingEnabled;
MObject spReticleLoc::EnableTextDrawing;
MObject spReticleLoc::FilmbackAperture;
MObject spReticleLoc::HorizontalFilmAperture;
MObject spReticleLoc::VerticalFilmAperture;
MObject spReticleLoc::SoundTrackWidth;
MObject spReticleLoc::DisplayFilmGate;
MObject spReticleLoc::ProjectionGate;
MObject spReticleLoc::HorizontalProjectionGate;
MObject spReticleLoc::VerticalProjectionGate;
MObject spReticleLoc::DisplayProjectionGate;
MObject spReticleLoc::HorizontalSafeAction;
MObject spReticleLoc::VerticalSafeAction;
MObject spReticleLoc::DisplaySafeAction;
MObject spReticleLoc::HorizontalSafeTitle;
MObject spReticleLoc::VerticalSafeTitle;
MObject spReticleLoc::DisplaySafeTitle;
MObject spReticleLoc::AspectRatios;
MObject spReticleLoc::AspectMaskColor;
MObject spReticleLoc::AspectMaskTrans;
MObject spReticleLoc::AspectLineColor;
MObject spReticleLoc::AspectLineTrans;
MObject spReticleLoc::AspectDisplaySafeAction;
MObject spReticleLoc::AspectDisplaySafeTitle;
MObject spReticleLoc::PanScanAspectRatio;
MObject spReticleLoc::PanScanDisplayMode;
MObject spReticleLoc::PanScanDisplaySafeTitle;
MObject spReticleLoc::PanScanDisplaySafeAction;
MObject spReticleLoc::PanScanRatio;
MObject spReticleLoc::PanScanOffset;
MObject spReticleLoc::PanScanMaskColor;
MObject spReticleLoc::PanScanMaskTrans;
MObject spReticleLoc::PanScanLineColor;
MObject spReticleLoc::PanScanLineTrans;
MObject spReticleLoc::FilmGateColor;
MObject spReticleLoc::FilmGateTrans;
MObject spReticleLoc::ProjGateColor;
MObject spReticleLoc::ProjGateTrans;
MObject spReticleLoc::UseSpReticle;
MObject spReticleLoc::DisplayLineH;
MObject spReticleLoc::DisplayLineV;
MObject spReticleLoc::DisplayThirdsH;
MObject spReticleLoc::DisplayThirdsV;
MObject spReticleLoc::DisplayCrosshair;
MObject spReticleLoc::MiscTextColor;
MObject spReticleLoc::MiscTextTrans;
MObject spReticleLoc::DriveCameraAperture;
MObject spReticleLoc::MaximumDistance;
MObject spReticleLoc::PadDisplayMode;
MObject spReticleLoc::PadMaskColor;
MObject spReticleLoc::PadMaskTrans;
MObject spReticleLoc::PadLineColor;
MObject spReticleLoc::PadLineTrans;
spReticleLoc::spReticleLoc() {}
spReticleLoc::~spReticleLoc() {}
{
p = (ncp + v) * wim;
return p;
}
{
p =
MPlug( thisNode, colorObj );
McheckStatus (stat, (
"spReticleLoc::getColor getting red plug from "+p.
name() ) );
McheckStatus ( c.
getValue ( color.
r ), (
"spReticleLoc::getColor getting red from "+p.
name() ) );
McheckStatus (stat, (
"spReticleLoc::getColor getting green plug from "+p.
name() ) );
McheckStatus ( c.
getValue ( color.
g ), (
"spReticleLoc::getColor getting green from "+p.
name() ) );
McheckStatus (stat, (
"spReticleLoc::getColor getting blue plug from "+p.
name() ) );
McheckStatus ( c.
getValue ( color.
b ), (
"spReticleLoc::getColor getting blue from "+p.
name() ) );
p =
MPlug( thisNode, transObj );
McheckStatus ( p.
getValue ( color.
a ), (
"spReticleLoc::getColor gettings transparency from "+p.
name() ) );
}
{
MObject matrixAttribute = fnThisNode.attribute( matrixStr, &stat );
if (!stat)
{
stat.
perror(
"spReticleLoc::getMatrix getting attribute : "+matrixStr);
}
MPlug matrixPlug( thisNode, matrixAttribute);
if (matrixPlug.isNull())
{
stat.
perror(
"spReticleLoc::getting plug for attribute : "+matrixStr);
}
if (matrixPlug.isArray())
{
matrixPlug = matrixPlug.elementByLogicalIndex (0, &stat);
if (!stat)
{
stat.
perror(
"spReticleLoc::getMatrix setting logical index to 0 for "+matrixStr);
}
}
stat = matrixPlug.getValue(matObject);
if (!stat)
{
stat.
perror(
"spReticleLoc::getMatrix getting value for "+matrixStr);
}
if (!stat)
{
stat.
perror(
"spReticleLoc::getMatrix getting MfnMatrixData");
}
matrix = matrixData.
matrix( &stat );
if (!stat)
{
stat.
perror(
"spReticleLoc::getMatrix getting matrix");
}
return matrix;
}
void spReticleLoc::printAspectRatio(Aspect_Ratio & ar)
{
cerr << "-------------------------------------------------" << endl;
cerr << "aspect ratio : " << ar.aspectRatio << endl;
cerr << "displayMode : " << ar.displayMode << endl;
cerr << "maskColor : " << ar.aspectGeom.maskColor << endl;
cerr << "lineColor : " << ar.aspectGeom.lineColor << endl;
}
void spReticleLoc::printPanScan(PanScan & ps)
{
printAspectRatio( ps );
cerr << "panScanRatio : " << ps.panScanRatio << endl;
cerr << "panScanOffset : " << ps.panScanOffset << endl;
cerr << "displaySafeTitle : " << ps.displaySafeTitle << endl;
cerr << "displaySafeAction : " << ps.displaySafeAction << endl;
}
void spReticleLoc::printText(TextData & td)
{
cerr << "-------------------------------------------------" << endl;
cerr << "text type : " << td.textType << endl;
cerr << "text string : " << td.textStr << endl;
cerr << "text align : " << td.textAlign << endl;
cerr << "text pos : " << td.textPosX << ", " << td.textPosY << endl;
cerr << "text pos rel : " << td.textPosRel << endl;
cerr << "text level : " << td.textLevel << endl;
cerr << "text ar level : " << td.textARLevel << endl;
}
void spReticleLoc::printGeom(Geom & g)
{
cerr << "-------------------------------------------------" << endl;
cerr << "x : " << g.x << endl;
cerr << "y : " << g.y << endl;
cerr << "x1 : " << g.x1 << endl;
cerr << "x2 : " << g.x2 << endl;
cerr << "y1 : " << g.y1 << endl;
cerr << "y2 : " << g.y2 << endl;
cerr << "mc : " << g.maskColor << endl;
cerr << "lc : " << g.lineColor << endl;
cerr << "iv : " << g.isValid << endl;
}
void spReticleLoc::printOptions(Options& opt)
{
cerr << "-------------------------------------------------" << endl;
cerr << "useSpRet : " << opt.useSpRet << endl;
cerr << "displayLineH : " << opt.displayLineH << endl;
cerr << "displayLineV : " << opt.displayLineV << endl;
cerr << "displayThirdsH : " << opt.displayThirdsH << endl;
cerr << "displayThirdsV : " << opt.displayThirdsV << endl;
cerr << "displayCrosshair : " << opt.displayCrosshair << endl;
cerr << "driveCameraAperture : " << opt.driveCameraAperture << endl;
cerr << "maximumDistance : " << opt.maximumDistance << endl;
cerr << "useOverscan : " << opt.useOverscan << endl;
}
MStatus spReticleLoc::getPadData( spReticleLocData& drawData )
{
p =
MPlug ( thisNode, UsePad );
McheckStatus ( p.
getValue ( drawData.pad.usePad ),
"spReticleLoc::getPadData pad");
p =
MPlug ( thisNode, PadAmountX );
McheckStatus ( p.getValue ( drawData.pad.padAmountX ), "spReticleLoc::getPadData padAmountX");
p =
MPlug ( thisNode, PadAmountY );
McheckStatus ( p.getValue ( drawData.pad.padAmountY ), "spReticleLoc::getPadData padAmountX");
drawData.pad.isPadded = (drawData.pad.padAmountX != 0 && drawData.pad.padAmountY != 0);
if (drawData.pad.usePad && drawData.pad.isPadded)
{
p =
MPlug ( thisNode, PadDisplayMode );
McheckStatus ( p.getValue ( drawData.pad.displayMode ), "spReticleLoc::getPadData padDisplayMode");
stat = getColor( PadMaskColor, PadMaskTrans, drawData.pad.padGeom.maskColor );
McheckStatus ( stat, "spReticleLoc::getPadData get padMaskColor");
stat = getColor(PadLineColor, PadLineTrans, drawData.pad.padGeom.lineColor );
McheckStatus ( stat, "spReticleLoc::getPadData get padLineColor");
}
}
MStatus spReticleLoc::getFilmbackData( spReticleLocData& drawData )
{
p =
MPlug( thisNode, HorizontalFilmAperture );
McheckStatus ( p.
getValue ( drawData.filmback.horizontalFilmAperture ),
"spReticleLoc::getFilmbackData get horizontalFilmAperture");
p =
MPlug( thisNode, VerticalFilmAperture );
McheckStatus ( p.getValue ( drawData.filmback.verticalFilmAperture ), "spReticleLoc::getFilmbackData get verticalFilmAperture");
p =
MPlug( thisNode, SoundTrackWidth );
McheckStatus ( p.getValue ( drawData.filmback.soundTrackWidth ), "spReticleLoc::getFilmbackData get soundTrackWidth");
p =
MPlug( thisNode,DisplayFilmGate );
McheckStatus ( p.getValue ( drawData.filmback.displayFilmGate ), "spReticleLoc::getFilmbackData get displayFilmGate");
stat = getColor( FilmGateColor,FilmGateTrans, drawData.filmback.filmbackGeom.lineColor );
McheckStatus ( stat, "spReticleLoc::getFilmbackData get filmGateColor");
}
MStatus spReticleLoc::getProjectionData( spReticleLocData& drawData )
{
p =
MPlug( thisNode, DisplayProjectionGate );
McheckStatus ( p.
getValue ( drawData.filmback.displayProjGate ),
"spReticleLoc::getProjectionData get displayProjectionGate");
if ( drawData.filmback.displayProjGate )
{
p =
MPlug( thisNode, HorizontalProjectionGate );
McheckStatus ( p.
getValue ( drawData.filmback.horizontalProjectionGate ),
"spReticleLoc::getProjectionData get horizontalProjectionGate");
p =
MPlug( thisNode, VerticalProjectionGate );
McheckStatus ( p.getValue ( drawData.filmback.verticalProjectionGate ), "spReticleLoc::getProjectionData get verticalProjectionGate");
stat = getColor( ProjGateColor, ProjGateTrans, drawData.filmback.projGeom.lineColor );
McheckStatus ( stat, "spReticleLoc::getProjectionData get projGateColor");
}
}
MStatus spReticleLoc::getSafeActionData( spReticleLocData& drawData )
{
p =
MPlug( thisNode,DisplaySafeAction );
McheckStatus ( p.
getValue ( drawData.filmback.displaySafeAction ),
"spReticleLoc::getSafeActionData get displaySafeAction");
p =
MPlug( thisNode, HorizontalSafeAction );
McheckStatus ( p.getValue ( drawData.filmback.horizontalSafeAction ), "spReticleLoc::getSafeActionData get horizontalSafeAction");
p =
MPlug( thisNode,VerticalSafeAction );
McheckStatus ( p.getValue ( drawData.filmback.verticalSafeAction ), "spReticleLoc::getSafeActionData get verticalSafeAction");
drawData.filmback.safeActionGeom.lineColor = drawData.filmback.filmbackGeom.lineColor;
}
MStatus spReticleLoc::getSafeTitleData( spReticleLocData& drawData )
{
p =
MPlug( thisNode, DisplaySafeTitle );
McheckStatus ( p.
getValue ( drawData.filmback.displaySafeTitle ),
"spReticleLoc::getSafeTitleData get displaySafeTitle");
p =
MPlug( thisNode, HorizontalSafeTitle );
McheckStatus ( p.getValue ( drawData.filmback.horizontalSafeTitle ), "spReticleLoc::getSafeTitleData get horizontalSafeTitle");
p =
MPlug( thisNode, VerticalSafeTitle );
McheckStatus ( p.getValue ( drawData.filmback.verticalSafeTitle ), "spReticleLoc::getSafeTitleData get verticalSafeTitle");
drawData.filmback.safeTitleGeom.lineColor = drawData.filmback.filmbackGeom.lineColor;
}
MStatus spReticleLoc::getAspectRatioChildren(
MPlug arPlug, Aspect_Ratio & ar)
{
p = arPlug.
child( 0 , &stat );
McheckStatus( p.
getValue( ar.aspectRatio ),
"spReticleLoc::getAspectRatioChildren - aspectRatio" );
p = arPlug.
child( 1 , &stat );
McheckStatus( p.getValue( ar.displayMode ), "spReticleLoc::getAspectRatioChildren - displayMode" );
if (ar.displayMode != 0)
{
p = arPlug.
child( 2 , &stat );
McheckStatus( c.
getValue( ar.aspectGeom.maskColor.r ),
"spReticleLoc::getAspectRatioChildren - aspectMaskColorR" );
McheckStatus( c.getValue( ar.aspectGeom.maskColor.g ), "spReticleLoc::getAspectRatioChildren - aspectMaskColorG" );
McheckStatus( c.getValue( ar.aspectGeom.maskColor.b ), "spReticleLoc::getAspectRatioChildren - aspectMaskColorB" );
p = arPlug.
child( 3 , &stat );
McheckStatus( p.getValue( ar.aspectGeom.maskColor.a ), "spReticleLoc::getAspectRatioChildren - aspectMaskTrans" );
p = arPlug.
child( 4 , &stat );
McheckStatus( c.getValue( ar.aspectGeom.lineColor.r ), "spReticleLoc::getAspectRatioChildren - aspectLineColorR" );
McheckStatus( c.getValue( ar.aspectGeom.lineColor.g ), "spReticleLoc::getAspectRatioChildren - aspectLineColorG" );
McheckStatus( c.getValue( ar.aspectGeom.lineColor.b ), "spReticleLoc::getAspectRatioChildren - aspectLineColorB" );
p = arPlug.
child( 5 , &stat );
McheckStatus( p.getValue( ar.aspectGeom.lineColor.a ), "spReticleLoc::getAspectRatioChildren - aspectLineTrans" );
p = arPlug.
child( 6 , &stat );
McheckStatus( p.getValue( ar.displaySafeAction ), "spReticleLoc::getAspectRatioChildren - displaySafeAction" );
p = arPlug.
child( 7 , &stat );
McheckStatus( p.getValue( ar.displaySafeTitle ), "spReticleLoc::getAspectRatioChildren - displaySafeTitle" );
}
}
bool spReticleLoc::aspectRatioSortPredicate(const Aspect_Ratio & lhs,
const Aspect_Ratio & rhs)
{
return lhs.aspectRatio < rhs.aspectRatio;
}
MStatus spReticleLoc::getAspectRatioData( spReticleLocData& drawData )
{
for (int i = 0; i < numPlugs; i++)
{
McheckStatus( stat, "spReticleLoc::getAspectRatioData - cannot get index" );
Aspect_Ratio ar;
stat = getAspectRatioChildren( p, ar );
McheckStatus( stat, "spReticleLoc::getAspectRatioData - cannot get children" );
drawData.ars.push_back( ar );
}
drawData.numAspectRatios = (int)drawData.ars.size();
std::sort(drawData.ars.begin(),drawData.ars.end(),aspectRatioSortPredicate);
}
bool spReticleLoc::needToUpdateAspectRatios( spReticleLocData& drawData )
{
return (drawData.ars.size() != arsPlug.
numElements() );
}
MStatus spReticleLoc::getPanScanData( PanScan & ps )
{
MPlug psPlug( thisNode, PanScanAttr );
MStatus stat = getAspectRatioChildren( psPlug, ps );
McheckStatus( stat, "spReticleLoc::getPanScanData - cannot get children" );
if (ps.displayMode != 0)
{
p = psPlug.
child( 8 , &stat );
McheckStatus( p.
getValue( ps.panScanRatio ),
"spReticleLoc::getPanScanData - panScanRatio" );
p = psPlug.
child( 9 , &stat );
McheckStatus( p.getValue( ps.panScanOffset ), "spReticleLoc::getPanScanData - panScanOffset" );
}
}
MStatus spReticleLoc::getTextChildren(
MPlug tPlug, TextData & td)
{
p = tPlug.
child( 0 , &stat );
McheckStatus( p.
getValue( td.textType ),
"spReticleLoc::getTextChildren - textType" );
p = tPlug.
child( 1 , &stat );
McheckStatus( p.getValue( td.textStr ), "spReticleLoc::getTextChildren - textStr" );
p = tPlug.
child( 2 , &stat );
McheckStatus( p.getValue( td.textAlign ), "spReticleLoc::getTextChildren - textAlign" );
p = tPlug.
child( 3 , &stat );
McheckStatus( c.
getValue( td.textPosX ),
"spReticleLoc::getTextChildren - textPosX" );
McheckStatus( c.getValue( td.textPosY ), "spReticleLoc::getTextChildren - textPosY" );
p = tPlug.
child( 4 , &stat );
McheckStatus( p.getValue( td.textPosRel ), "spReticleLoc::getTextChildren - textPosRel" );
p = tPlug.
child( 5 , &stat );
McheckStatus( p.getValue( td.textLevel ), "spReticleLoc::getTextChildren - textLevel" );
p = tPlug.
child( 6 , &stat );
McheckStatus( p.getValue( td.textARLevel ), "spReticleLoc::getTextChildren - textARLevel" );
p = tPlug.
child( 7 , &stat );
McheckStatus( c.getValue( td.textColor.r ), "spReticleLoc::getTextChildren - textColorR" );
McheckStatus( c.getValue( td.textColor.g ), "spReticleLoc::getTextChildren - textColorG" );
McheckStatus( c.getValue( td.textColor.b ), "spReticleLoc::getTextChildren - textColorB" );
p = tPlug.
child( 8 , &stat );
McheckStatus( p.getValue( td.textColor.a ), "spReticleLoc::getTextChildren - textTrans" );
}
MStatus spReticleLoc::getTextData( spReticleLocData& drawData )
{
p =
MPlug( thisNode, Text );
for (int i = 0; i < numPlugs && i < 10; i++ )
{
TextData td;
McheckStatus( stat, "spReticleLoc::getTextData - cannot get index" );
stat = getTextChildren( tp, td );
McheckStatus( stat, "spReticleLoc::getTextData - cannot get children" );
drawData.text.push_back( td );
}
}
void spReticleLoc::getCustomTextElement(spReticleLocData& drawData)
{
TextData td;
char buff[255];
double maximumDist = drawData.maximumDist ;
Options options = drawData.options ;
Camera cameraData = drawData.cameraData ;
int numAspectRatios = drawData.numAspectRatios ;
Geom portGeom = drawData.portGeom ;
std::vector<TextData> text = drawData.text ;
std::vector<Aspect_Ratio> ars = drawData.ars ;
PadOptions pad = drawData.pad ;
Filmback filmback = drawData.filmback ;
PanScan panScan = drawData.panScan ;
MString nodeName = drawData.nodeName ;
drawData.textWhenDraw.
clear();
for (int i = 0; i < (int)text.size(); i++)
{
td = text[i];
MColor textColor = options.textColor;
switch (td.textType)
{
case 0:
break;
case 1:
if (td.textStr == "")
sprintf(buff,td.textStr.asChar(),camera.
focalLength() );
break;
case 2:
if (td.textStr == "")
td.textStr = camera.
name();
else
{
sprintf(buff,td.textStr.asChar(),camera.
name().
asChar() );
}
break;
case 3:
{
{
}
McheckVoid ( p.
getValue ( time ),
"spReticleLoc::drawCustomTextElements get time");
if (td.textStr == "")
sprintf(buff,td.textStr.asChar(),time.
value() );
break;
}
case 4:
{
int level = td.textARLevel;
if (level < 0 || level >= numAspectRatios)
{
continue;
}
if (td.textStr == "")
sprintf(buff,td.textStr.asChar(),ars[level].aspectRatio );
break;
}
case 5:
if (options.maximumDistance <= 0)
continue;
if (td.textStr == "")
td.textStr =
MString(
"max. dist %1.0f");
textColor = (maximumDist >= options.maximumDistance) ?
MColor(1,1,1,0) : textColor;
sprintf(buff, td.textStr.asChar(), maximumDist );
break;
case 6:
{
if (!filmback.displayProjGate)
continue;
double aspectRatio = (filmback.horizontalProjectionGate/filmback.verticalProjectionGate);
if (td.textStr == "")
sprintf(buff, td.textStr.asChar(), aspectRatio);
break;
}
case 7:
{
if (td.textStr == "")
sprintf(buff, td.textStr.asChar(), getenv("SHOW"));
break;
}
case 8:
{
if (td.textStr == "")
sprintf(buff, td.textStr.asChar(), getenv("SHOT"));
break;
}
case 9:
{
if (td.textStr == "")
sprintf(buff, td.textStr.asChar(), getenv("SHOW"),getenv("SHOT"));
break;
}
case 10:
{
if (td.textStr == "")
sprintf(buff, td.textStr.asChar(), getenv("FS"));
break;
}
case 11:
{
if (td.textStr == "")
sprintf(buff, td.textStr.asChar(), getenv("FE"));
break;
}
case 12:
{
if (td.textStr == "")
sprintf(buff, td.textStr.asChar(), getenv("FS"), getenv("FE"));
break;
}
case 13:
{
if (td.textStr == "")
sprintf(buff, td.textStr.asChar(), getenv("USER"));
break;
}
case 14:
{
if (td.textStr == "")
break;
}
case 15:
{
if (td.textStr == "")
sprintf(buff, td.textStr.asChar(), fo.
path().
asChar() );
break;
}
case 16:
{
if (td.textStr == "")
sprintf(buff, td.textStr.asChar(), fo.
name().
asChar() );
break;
}
case 17:
if (td.textStr == "")
sprintf(buff, td.textStr.asChar(), panScan.panScanRatio );
break;
case 18:
if (td.textStr == "")
sprintf(buff, td.textStr.asChar(), panScan.panScanOffset );
break;
case 19:
if (td.textStr == "")
td.textStr = "safe action";
break;
case 20:
if (td.textStr == "")
td.textStr = "safe title";
break;
default:
continue;
}
Geom g;
switch (td.textLevel)
{
case 0:
g = portGeom;
break;
case 1:
g = pad.padGeom;
break;
case 2:
{
switch (td.textType)
{
case 19:
if (!filmback.safeActionGeom.isValid)
drawData.calcFilmbackSafeActionGeom();
g = filmback.safeActionGeom;
break;
case 20:
if (!filmback.safeTitleGeom.isValid)
drawData.calcFilmbackSafeTitleGeom();
g = filmback.safeTitleGeom;
break;
default:
g = filmback.filmbackGeom;
break;
}
}
break;
case 3:
if (!filmback.displayProjGate)
{
continue;
}
g = filmback.projGeom;
break;
case 4:
{
int level = td.textARLevel;
if (level < 0 || level >= numAspectRatios)
{
MGlobal::displayError( nodeName +
" invalid aspect ratio level (" + td.textARLevel +
") for text item " + i);
continue;
}
if (!ars[level].aspectGeom.isValid)
continue;
switch (td.textType)
{
case 19:
if (!ars[level].safeActionGeom.isValid)
drawData.calcSafeActionGeom(ars[level]);
g = ars[level].safeActionGeom;
break;
case 20:
if (!ars[level].safeTitleGeom.isValid)
drawData.calcSafeTitleGeom(ars[level]);
g = ars[level].safeTitleGeom;
break;
default:
g = ars[level].aspectGeom;
break;
}
}
break;
case 5:
{
if (!panScan.aspectGeom.isValid)
drawData.calcPanScanGeom( panScan );
switch (td.textType)
{
case 19:
if (!panScan.safeActionGeom.isValid)
drawData.calcSafeActionGeom(panScan);
g = panScan.safeActionGeom;
break;
case 20:
if (!panScan.safeTitleGeom.isValid)
drawData.calcSafeTitleGeom(panScan);
g = panScan.safeTitleGeom;
break;
default:
g = panScan.aspectGeom;
break;
}
}
break;
default:
break;
}
double x,y;
switch (td.textPosRel)
{
case 0:
x = g.x1;
y = g.y1;
break;
case 1:
x = (g.x1 + g.x2 ) / 2;
y = g.y1;
break;
case 2:
x = g.x2;
y = g.y1;
break;
case 3:
x = g.x1;
y = (g.y1 + g.y2 ) / 2;
break;
case 4:
x = (g.x1 + g.x2 ) / 2;
y = (g.y1 + g.y2 ) / 2;
break;
case 5:
x = g.x2;
y = (g.y1 + g.y2 ) / 2;
break;
case 6:
x = g.x1;
y = g.y2;
break;
case 7:
x = (g.x1 + g.x2 ) / 2;
y = g.y2;
break;
case 8:
x = g.x2;
y = g.y2;
break;
default:
MGlobal::displayError( nodeName +
" invalid text relative position (" + td.textPosRel +
") for text item " + i);
continue;
}
x += td.textPosX;
y += td.textPosY;
TextData newTd = td;
newTd.textPosX = x;
newTd.textPosY = y;
drawData.textWhenDraw.push_back(newTd);
}
}
bool spReticleLoc::needToUpdateTextData( spReticleLocData& drawData )
{
}
MStatus spReticleLoc::getOptions( Options& options )
{
p =
MPlug ( thisNode, DrawingEnabled );
McheckStatus ( p.
getValue ( options.drawingEnabled ),
"spReticleLoc::getOptions drawingEnabled" );
if (options.drawingEnabled)
{
p =
MPlug ( thisNode, EnableTextDrawing );
McheckStatus ( p.
getValue( options.enableTextDrawing),
"spReticleLoc::getOptions enableTextDrawing" );
p =
MPlug ( thisNode, UseSpReticle );
McheckStatus ( p.getValue ( options.useSpRet ), "spReticleLoc::getOptions useSpReticle");
p =
MPlug ( thisNode, DisplayLineH );
McheckStatus ( p.getValue ( options.displayLineH ), "spReticleLoc::getOptions displayLineH");
p =
MPlug ( thisNode, DisplayLineV );
McheckStatus ( p.getValue ( options.displayLineV ), "spReticleLoc::getOptions displayLineV");
p =
MPlug ( thisNode, DisplayThirdsH );
McheckStatus ( p.getValue ( options.displayThirdsH ), "spReticleLoc::getOptions displayThirdsH");
p =
MPlug ( thisNode, DisplayThirdsV );
McheckStatus ( p.getValue ( options.displayThirdsV ), "spReticleLoc::getOptions displayThirdsV");
p =
MPlug ( thisNode, DisplayCrosshair );
McheckStatus ( p.getValue ( options.displayCrosshair ), "spReticleLoc::getOptions displayCrosshair");
stat = getColor (MiscTextColor, MiscTextTrans, options.textColor );
McheckStatus ( stat, "spReticleLoc::getOptions textColor");
stat = getColor ( LineColor, LineTrans, options.lineColor );
McheckStatus ( stat, "spReticleLoc::getOptions lineColor");
p =
MPlug ( thisNode, DriveCameraAperture );
McheckStatus ( p.getValue ( options.driveCameraAperture ), "spReticleLoc::getOptions driveCameraAperture");
p =
MPlug ( thisNode, MaximumDistance );
McheckStatus ( p.getValue ( options.maximumDistance ), "spReticleLoc::getOptions maximumDistance");
p =
MPlug ( thisNode, UseOverscan );
McheckStatus ( p.getValue ( options.useOverscan ), "spReticleLoc::getOptions useOverscan");
}
}
bool spReticleLoc::setInternalValueInContext(
const MPlug & plug,
{
if (plug == worldInverseMatrix || plug == isTemplated)
return false;
needRefresh = true;
return false;
}
void spReticleLoc::drawMask( Geom g1, Geom g2,
MColor color,
bool sides,
double ncp )
{
double z = -ncp;
glDisable( GL_DEPTH_TEST );
glDepthMask( GL_FALSE );
glBegin( GL_QUADS );
glColor4f( color.
r, color.
g, color.
b, 1-color.
a );
glVertex3d( g1.x1, g1.y1, z );
glVertex3d( g1.x2, g1.y1, z );
glVertex3d( g2.x2, g2.y1, z );
glVertex3d( g2.x1, g2.y1, z );
glVertex3d( g2.x1, g2.y2, z );
glVertex3d( g2.x2, g2.y2, z );
glVertex3d( g1.x2, g1.y2, z );
glVertex3d( g1.x1, g1.y2, z );
if (sides)
{
glVertex3d( g1.x1, g1.y1, z );
glVertex3d( g2.x1, g2.y1, z );
glVertex3d( g2.x1, g2.y2, z );
glVertex3d( g1.x1, g1.y2, z );
glVertex3d( g2.x2, g2.y1, z );
glVertex3d( g1.x2, g1.y1, z );
glVertex3d( g1.x2, g1.y2, z );
glVertex3d( g2.x2, g2.y2, z );
}
glEnd();
glDepthMask( GL_TRUE );
glEnable( GL_DEPTH_TEST );
}
void spReticleLoc::drawLine(
double x1,
double x2,
double y1,
double y2,
MColor color,
bool stipple,
double ncp )
{
double z = -ncp;
glDisable( GL_DEPTH_TEST );
glDepthMask( GL_FALSE );
if (stipple)
{
glEnable (GL_LINE_STIPPLE);
glLineStipple(2,0x00FF);
}
glBegin( GL_LINES );
glColor4f( color.
r, color.
g, color.
b, 1-color.
a );
glVertex3d( x1, y1, z );
glVertex3d( x2, y2, z );
glEnd();
if (stipple)
glDisable (GL_LINE_STIPPLE);
glDepthMask( GL_TRUE );
glEnable( GL_DEPTH_TEST );
}
void spReticleLoc::drawLines( Geom g,
MColor color,
bool sides,
bool stipple,
double ncp )
{
double z = -ncp;
glDisable( GL_DEPTH_TEST );
glDepthMask( GL_FALSE );
if (stipple)
{
glEnable (GL_LINE_STIPPLE);
glLineStipple(2,0x00FF);
}
GLenum mode = ( sides ) ? GL_LINE_LOOP : GL_LINES;
glBegin( mode );
glColor4f( color.
r, color.
g, color.
b, 1-color.
a );
glVertex3d( g.x1, g.y1, z );
glVertex3d( g.x2, g.y1, z );
glVertex3d( g.x2, g.y2, z );
glVertex3d( g.x1, g.y2, z );
glEnd( );
if (stipple)
glDisable (GL_LINE_STIPPLE);
glDepthMask( GL_TRUE );
glEnable( GL_DEPTH_TEST );
}
void spReticleLoc::drawText(
MString text,
double tx,
double ty,
{
glDisable( GL_DEPTH_TEST );
glDepthMask( GL_FALSE );
MPoint textPos = getPoint((
float)tx, (
float)ty, view, wim);
glColor4f( textColor.
r, textColor.
g, textColor.
b, 1-textColor.
a );
view.
drawText(text, textPos, textAlign);
glFlush();
glDepthMask( GL_TRUE );
glEnable( GL_DEPTH_TEST );
}
void spReticleLoc::drawCustomTextElements( std::vector<TextData> textWhenDraw,
MMatrix wim,
M3dView & view )
{
for(unsigned int i = 0; i < textWhenDraw.size(); ++i)
{
TextData td = textWhenDraw[i];
drawText( td.textStr, td.textPosX, td.textPosY, td.textColor, (
M3dView::TextPosition)td.textAlign, view, wim);
}
}
{
spReticleLocData drawData;
if (!drawData.options.drawingEnabled)
return;
if (drawData.cameraData.isOrtho)
return;
if(drawData.options.useSpRet){
if (!drawData.useReticle)
return;
}
double ncp =drawData.ncp;
double maximumDist =drawData.maximumDist;
Options options =drawData.options;
int numAspectRatios =drawData.numAspectRatios;
Geom portGeom =drawData.portGeom;
std::vector<Aspect_Ratio> ars =drawData.ars;
PadOptions pad =drawData.pad;
Filmback filmback =drawData.filmback;
PanScan panScan =drawData.panScan;
std::vector<TextData> textWhenDraw =drawData.textWhenDraw;
glPushAttrib( GL_ALL_ATTRIB_BITS );
glMatrixMode( GL_MODELVIEW );
glPushMatrix();
glMatrixMode( GL_PROJECTION );
glPushMatrix();
glLoadIdentity();
glOrtho(
drawData.cameraData.nearClippingPlane, drawData.cameraData.farClippingPlane
);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glEnable(GL_BLEND);
GLint blendAttrs[2];
glGetIntegerv(GL_BLEND_SRC, & blendAttrs[0]);
glGetIntegerv(GL_BLEND_DST, & blendAttrs[1]);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Geom aspectContainerGeom;
if (pad.usePad && pad.isPadded)
{
if (pad.displayMode == 2)
drawMask(portGeom, pad.padGeom, pad.padGeom.maskColor, true, ncp);
aspectContainerGeom = pad.padGeom;
}
else
{
aspectContainerGeom = portGeom;
}
Aspect_Ratio ar;
for (int i = 0; i < numAspectRatios; i++ )
{
ar = ars[i];
if (ar.displayMode == 2)
{
Geom g = (i == 0)?aspectContainerGeom:ars[i-1].aspectGeom;
MColor maskColor = ar.aspectGeom.maskColor;
if (options.maximumDistance > 0 &&
fabs(maximumDist) >= options.maximumDistance)
{
if (i == 0)
{
maskColor =
MColor(1,0,0,maskColor.
a);
}
else
{
maskColor *=
MColor(1.5,0.5,0.5,1);
}
}
drawMask(g, ar.aspectGeom, maskColor, i == 0, ncp);
}
}
for (int i = 0; i < numAspectRatios; i++ )
{
ar = ars[i];
if (ar.displayMode != 0)
{
bool sides = (i == 0 || ar.aspectGeom.x != ars[i].aspectGeom.x);
drawLines(ar.aspectGeom, ar.aspectGeom.lineColor, sides, 0, ncp);
if (ar.displaySafeAction)
drawLines( ar.safeActionGeom, ar.safeActionGeom.lineColor, 1, 1, ncp);
if (ar.displaySafeTitle)
drawLines( ar.safeTitleGeom, ar.safeTitleGeom.lineColor, 1, 1, ncp);
}
}
if ( panScan.displayMode != 0 )
{
if (panScan.displayMode == 2)
drawMask(ars[0].aspectGeom, panScan.aspectGeom, panScan.aspectGeom.maskColor, true, ncp);
drawLines(panScan.aspectGeom, panScan.aspectGeom.lineColor, 1, 0, ncp);
if (panScan.displaySafeAction)
{
drawLines( panScan.safeActionGeom, panScan.safeActionGeom.lineColor, 1, 1, ncp);
}
if (panScan.displaySafeTitle)
{
drawLines( panScan.safeTitleGeom, panScan.safeTitleGeom.lineColor, 1, 1, ncp);
}
}
if ( filmback.displayFilmGate )
{
drawLines(filmback.filmbackGeom, filmback.filmbackGeom.lineColor, 1, 0, ncp);
if ( filmback.soundTrackWidth != 0 )
drawLine(filmback.imageGeom.x1, filmback.imageGeom.x1, filmback.imageGeom.y1, filmback.imageGeom.y2, filmback.imageGeom.lineColor, 0, ncp);
}
if (filmback.displaySafeAction)
{
drawLines( filmback.safeActionGeom, filmback.safeActionGeom.lineColor, 1, 1, ncp);
}
if (filmback.displaySafeTitle)
{
drawLines( filmback.safeTitleGeom, filmback.safeTitleGeom.lineColor, 1, 1, ncp);
}
if ( filmback.displayProjGate )
{
drawLines(filmback.projGeom, filmback.projGeom.lineColor, 1, 1, ncp);
}
if ( options.displayLineH )
{
drawLine( filmback.imageGeom.x1, filmback.imageGeom.x2, portGeom.y, portGeom.y, options.lineColor, 0, ncp);
}
if ( options.displayLineV )
{
double cx = ( filmback.imageGeom.x1 + filmback.imageGeom.x2 ) / 2;
drawLine( cx, cx, filmback.imageGeom.y1, filmback.imageGeom.y2, options.lineColor, 0, ncp);
}
if ( options.displayThirdsH)
{
Geom g = (numAspectRatios > 0)?ars[0].aspectGeom:portGeom;
double y1 = g.y1+ ( ( g.y2 - g.y1 ) * 0.33 );
double y2 = g.y1+ ( ( g.y2 - g.y1 ) * 0.66 );
drawLine( g.x1, g.x2, y1, y1, options.lineColor, 0, ncp);
drawLine( g.x1, g.x2, y2, y2, options.lineColor, 0, ncp);
}
if ( options.displayThirdsV)
{
Geom g = (numAspectRatios > 0)?ars[0].aspectGeom:portGeom;
double x1 = g.x1+ ( ( g.x2 - g.x1 ) * 0.33 );
double x2 = g.x1+ ( ( g.x2 - g.x1 ) * 0.66 );
drawLine( x1, x1, g.y1, g.y2, options.lineColor, 0, ncp);
drawLine( x2, x2, g.y1, g.y2, options.lineColor, 0, ncp);
}
if ( options.displayCrosshair )
{
double cx = ( filmback.imageGeom.x1 + filmback.imageGeom.x2 ) / 2;
drawLine( cx-25, cx-5, portGeom.y, portGeom.y, options.lineColor, 0 ,ncp);
drawLine( cx+25, cx+5, portGeom.y, portGeom.y, options.lineColor, 0 ,ncp);
drawLine( cx, cx, portGeom.y-25, portGeom.y-5, options.lineColor, 0 ,ncp);
drawLine( cx, cx, portGeom.y+25, portGeom.y+5, options.lineColor, 0 ,ncp);
}
if (pad.usePad && pad.isPadded && pad.displayMode > 0)
{
drawLines(pad.padGeom, pad.padGeom.lineColor, 1, 0, ncp);
}
if ( options.enableTextDrawing)
drawCustomTextElements(textWhenDraw,wim,view);
glDisable(GL_BLEND);
glBlendFunc(blendAttrs[0], blendAttrs[1]);
glMatrixMode( GL_PROJECTION );
glPopMatrix();
glMatrixMode( GL_MODELVIEW );
glPopMatrix();
glPopAttrib();
}
{
MPoint(1000000,1000000,1000000));
}
bool spReticleLoc::excludeAsLocator() const
{
MPlug p(thisNode, HideLocator);
bool hideLocator;
MStatus stat = p.getValue(hideLocator);
if (!stat)
stat.
perror(
"spReticleLoc::excludeAsLocator hideLocator");
return hideLocator;
}
void spReticleLoc::postConstructor()
{
#if MAYA_API_VERSION < 850
#ifndef WIN32
setTranspHandler( (TranspHandler)(&spReticleLoc::isTransparent) );
#endif
#endif
loadDefault = 1;
needRefresh = true;
}
void * spReticleLoc::creator()
{
return new spReticleLoc();
}
{
McheckStatus(stat,"create drawingEnabled attribute");
McheckStatus(stat,"create enableTextDrawing attribute");
McheckStatus(stat,"create horizontalFilmAperture attribute");
McheckStatus(stat,"create verticalFilmAperture attribute");
FilmbackAperture = nAttr.
create(
"filmbackAperture",
"cap", HorizontalFilmAperture, VerticalFilmAperture,
MObject::kNullObj, &stat );
McheckStatus(stat,"create soundTrackWidth attribute");
McheckStatus(stat,"create displayFilmGate attribute");
McheckStatus(stat,"create horizontalProjectionGate attribute");
McheckStatus(stat,"create verticalProjectionGate attribute");
ProjectionGate = nAttr.
create(
"projectionGate",
"pg", HorizontalProjectionGate, VerticalProjectionGate,
MObject::kNullObj, &stat );
McheckStatus(stat,"create displayProjGate attribute");
McheckStatus(stat,"create horizontalSafeAction attribute");
McheckStatus(stat,"create verticalSafeAction attribute");
SafeAction = nAttr.
create(
"safeAction",
"sa", HorizontalSafeAction, VerticalSafeAction,
MObject::kNullObj, &stat );
McheckStatus(stat,"create displaySafeAction attribute");
McheckStatus(stat,"create horizontalSafeTitle attribute");
McheckStatus(stat,"create verticalSafeTitle attribute");
McheckStatus(stat,"create displaySafeTitle attribute");
McheckStatus(stat,"create aspectRatio attribute");
DisplayMode = eAttr.
create(
"displayMode",
"dm", 2, &stat );
McheckStatus(stat, "create displayMode attribute");
AspectMaskColor = nAttr.
createColor(
"aspectMaskColor",
"amc", &stat );
McheckStatus(stat,"create aspectMaskTrans attribute");
AspectLineColor = nAttr.
createColor(
"aspectLineColor",
"alc", &stat );
McheckStatus(stat,"create aspectLineTrans attribute");
McheckStatus(stat,"create aspectDisplaySafeTitle attribute");
McheckStatus(stat,"create aspectDisplaySafeAction attribute");
AspectRatios = cAttr.
create(
"aspectRatios",
"ars", &stat );
McheckStatus(stat,"create aspectRatios attribute");
cAttr.
addChild( AspectDisplaySafeAction );
cAttr.
addChild( AspectDisplaySafeTitle );
McheckStatus(stat,"create panScanAspectRatio attribute");
PanScanDisplayMode = eAttr.
create(
"panScanDisplayMode",
"psdm", 0, &stat );
McheckStatus(stat, "create panScanDisplayMode attribute");
McheckStatus(stat,"create panScanDisplaySafeTitle attribute");
McheckStatus(stat,"create panScanDisplaySafeAction attribute");
PanScanMaskColor = nAttr.
createColor(
"panScanMaskColor",
"psmc", &stat );
McheckStatus(stat,"create panScanMaskTrans attribute");
PanScanLineColor = nAttr.
createColor(
"panScanLineColor",
"pslc", &stat );
McheckStatus(stat,"create panScanLineTrans attribute");
McheckStatus(stat, "create panScanRatio attribute");
McheckStatus(stat, "create panScanOffset attribute");
PanScanAttr = cAttr.
create(
"panScan",
"ps", &stat );
McheckStatus(stat,"create panScan attribute");
cAttr.
addChild( PanScanDisplaySafeAction );
cAttr.
addChild( PanScanDisplaySafeTitle );
TextType = eAttr.
create(
"textType",
"ttyp", 0, &stat );
McheckStatus(stat, "create textType attribute");
eAttr.
addField(
"Pan/Scan Aspect Ratio",17);
McheckStatus(stat,"create textStr attribute");
TextAlign = eAttr.
create(
"textAlign",
"ta", 0, &stat );
McheckStatus(stat, "create textAlign attribute");
McheckStatus(stat, "create textPosX attribute");
McheckStatus(stat, "create textPosX attribute");
McheckStatus(stat, "create textPos attribute");
TextPosRel = eAttr.
create(
"textPosRel",
"tpr", 0, &stat );
McheckStatus(stat, "create textPosRel attribute");
TextLevel = eAttr.
create(
"textLevel",
"tl", 0, &stat );
McheckStatus(stat, "create textLevel attribute");
McheckStatus(stat, "create textARLevel attribute");
TextColor = nAttr.
createColor(
"textColor",
"tc", &stat );
McheckStatus(stat,"create textColor attribute");
McheckStatus(stat,"create textTrans attribute");
Text = cAttr.
create(
"text",
"txt", &stat );
McheckStatus(stat,"create text attribute");
MiscTextColor = nAttr.
createColor(
"miscTextColor",
"mtc", &stat );
McheckStatus(stat,"create miscTextColor attribute");
McheckStatus(stat,"create miscTextTrans attribute");
LineColor = nAttr.
createColor(
"lineColor",
"lc", &stat );
McheckStatus(stat,"create lineTrans attribute");
FilmGateColor = nAttr.
createColor(
"filmGateColor",
"fg", &stat );
McheckStatus(stat,"create filmGateTrans attribute");
ProjGateColor = nAttr.
createColor(
"projGateColor",
"pgc", &stat );
McheckStatus(stat,"create projGateTrans attribute");
McheckStatus(stat,"create hideLocator attribute");
McheckStatus(stat,"create useSpReticle attribute");
McheckStatus(stat,"create displayLineH attribute");
McheckStatus(stat,"create displayLineV attribute");
McheckStatus(stat,"create displayThirdsH attribute");
McheckStatus(stat,"create displayThirdsV attribute");
McheckStatus(stat,"create displayCrosshair attribute");
McheckStatus(stat,"create time attribute");
McheckStatus(stat,"create driveCameraAperture attribute");
McheckStatus(stat,"create maximumDistance attribute");
McheckStatus(stat,"create useOverscan attribute");
McheckStatus(stat,"create usePad attribute");
McheckStatus(stat,"create padAmountX attribute");
McheckStatus(stat,"create padAmountY attribute");
PadDisplayMode = eAttr.
create(
"padDisplayMode",
"pdm", 2, &stat );
McheckStatus(stat, "create panScanDisplayMode attribute");
PadMaskColor = nAttr.
createColor(
"padMaskColor",
"pmc", &stat );
McheckStatus(stat,"create padMaskColor attribute");
McheckStatus(stat,"create padMaskTrans attribute");
PadLineColor = nAttr.
createColor(
"padLineColor",
"plc", &stat );
McheckStatus(stat,"create padLineColor attribute");
McheckStatus(stat,"create padLineTrans attribute");
Pad = cAttr.
create(
"pad",
"pad", &stat );
McheckStatus(stat,"create pad attribute");
McheckStatus(stat,"create tag attribute");
stat = addAttribute(EnableTextDrawing);
McheckStatus(stat,"addAttribute enableTextDrawing");
stat = addAttribute (DrawingEnabled);
McheckStatus(stat,"addAttribute drawingEnabled");
stat = addAttribute (FilmbackAperture);
McheckStatus(stat,"addAttribute filmbackAperture");
stat = addAttribute (SoundTrackWidth);
McheckStatus(stat,"addAttribute soundTrackWidth");
stat = addAttribute (DisplayFilmGate);
McheckStatus(stat,"addAttribute displayFilmGate");
stat = addAttribute (ProjectionGate);
McheckStatus(stat,"addAttribute projectionGate");
stat = addAttribute (DisplayProjectionGate);
McheckStatus(stat,"addAttribute displayProjectionGate");
stat = addAttribute (SafeAction);
McheckStatus(stat,"addAttribute safeAction");
stat = addAttribute (DisplaySafeAction);
McheckStatus(stat,"addAttribute displaySafeAction");
stat = addAttribute (SafeTitle);
McheckStatus(stat,"addAttribute safeTitle");
stat = addAttribute (DisplaySafeTitle);
McheckStatus(stat,"addAttribute displaySafeTitle");
stat = addAttribute (PanScanAttr);
McheckStatus(stat,"addAttribute panScan");
stat = addAttribute (AspectRatios);
McheckStatus(stat,"addAttribute aspectRatios");
stat = addAttribute (Text);
McheckStatus(stat,"addAttribute text");
stat = addAttribute (MiscTextColor);
McheckStatus(stat,"addAttribute miscTextColor");
stat = addAttribute (MiscTextTrans);
McheckStatus(stat,"addAttribute miscTextTrans");
stat = addAttribute (LineColor);
McheckStatus(stat,"addAttribute lineColor");
stat = addAttribute (LineTrans);
McheckStatus(stat,"addAttribute lineTrans");
stat = addAttribute (FilmGateColor);
McheckStatus(stat,"addAttribute filmGateColor");
stat = addAttribute (FilmGateTrans);
McheckStatus(stat,"addAttribute filmGateTrans");
stat = addAttribute (ProjGateColor);
McheckStatus(stat,"addAttribute projGateColor");
stat = addAttribute (ProjGateTrans);
McheckStatus(stat,"addAttribute projGateTrans");
stat = addAttribute (HideLocator);
McheckStatus(stat,"addAttribute hideLocator");
stat = addAttribute (UseSpReticle);
McheckStatus(stat,"addAttribute useSpReticle");
stat = addAttribute (DisplayLineH);
McheckStatus(stat,"addAttribute displayLineH");
stat = addAttribute (DisplayLineV);
McheckStatus(stat,"addAttribute displayLineV");
stat = addAttribute (DisplayThirdsH);
McheckStatus(stat,"addAttribute displayThirdsH");
stat = addAttribute (DisplayThirdsV);
McheckStatus(stat,"addAttribute displayThirdsV");
stat = addAttribute (DisplayCrosshair);
McheckStatus(stat,"addAttribute displayCrosshair");
stat = addAttribute (Time);
McheckStatus(stat,"addAttribute time");
stat = addAttribute (DriveCameraAperture);
McheckStatus(stat,"addAttribute driveCameraAperture");
stat = addAttribute (MaximumDistance);
McheckStatus(stat,"addAttribute maximumDistance");
stat = addAttribute (UseOverscan);
McheckStatus(stat,"addAttribute useOverscan");
stat = addAttribute (Pad);
McheckStatus(stat,"addAttribute pad");
stat = addAttribute (Tag);
McheckStatus(stat,"addAttribute tag");
}
{
MStatus status = plugin.registerNode(
"spReticleLoc", spReticleLoc::id,
&spReticleLoc::creator, &spReticleLoc::initialize,
&spReticleLoc::drawDbClassification);
if (!status)
{
status.
perror(
"registerNode");
return status;
}
spReticleLoc::drawDbClassification,
spReticleLoc::drawRegistrantId,
spReticleLocDrawOverride::Creator);
if (!status) {
status.
perror(
"registerDrawOverrideCreator");
return status;
}
return status;
}
{
spReticleLoc::drawDbClassification,
spReticleLoc::drawRegistrantId);
if (!status) {
status.
perror(
"deregisterGeometryOverrideCreator");
return status;
}
status = plugin.deregisterNode( spReticleLoc::id );
if (!status)
{
status.
perror(
"deregisterNode");
return status;
}
return status;
}
void spReticleLoc::getDrawData( spReticleLocData& drawData,
const MDagPath &cameraPath,
const double& portHeight,
const double& portWidth )
{
drawData = spReticleLocData();
thisNode = thisMObject();
drawData.nodeName = name();
drawData.maximumDist = 0;
if (loadDefault == 1)
{
p =
MPlug ( thisNode,Tag );
McheckVoid ( p.
getValue ( tag ),
"spReticleLoc::draw get tag");
MString cmd =
"if (exists(\"spReticleLocSetDefault\")) spReticleLocSetDefault(\""+ name()+
"\",\""+tag+
"\")";
loadDefault = 0;
}
if(needRefresh)
getOptions(drawData.options);
if (!drawData.options.drawingEnabled)
return;
drawData.cameraData.isOrtho = camera.
isOrtho();
drawData.cameraData.cameraPath = cameraPath;
if (drawData.cameraData.isOrtho)
return;
if (drawData.options.useSpRet)
{
drawData.useReticle = false;
{
McheckVoid ( useReticlePlug.
getValue( drawData.useReticle ),
"spReticleLoc::draw get useSpReticle plug");
}
if (!drawData.useReticle)
return;
}
if (drawData.options.maximumDistance > 0)
{
double maxDist = std::max(wm[3][0],std::max(wm[3][1],wm[3][2]));
double minDist = std::min(wm[3][0],std::min(wm[3][1],wm[3][2]));
drawData.maximumDist = (fabs(maxDist) > fabs(minDist)) ? maxDist : minDist;
}
drawData.overscan = (drawData.options.useOverscan) ? 1.0 : camera.
overscan();
drawData.portHeight = portHeight;
drawData.portWidth = portWidth;
drawData.wim = getMatrix("worldInverseMatrix");
drawData.calcPortGeom();
if (needToUpdateTextData(drawData) || needRefresh)
{
getTextData(drawData);
}
if (needToUpdateAspectRatios(drawData) || needRefresh)
{
getAspectRatioData(drawData);
}
if (needRefresh)
{
getPadData(drawData);
getFilmbackData(drawData);
getProjectionData(drawData);
getSafeActionData(drawData);
getSafeTitleData(drawData);
getPanScanData(drawData.panScan );
drawData.oFilmback = drawData.filmback;
}
drawData.doCompute();
if ( drawData.options.enableTextDrawing)
getCustomTextElement(drawData);
}
void spReticleLocData::calcPortGeom()
{
portGeom.x1 = 0;
portGeom.x2 = portWidth;
portGeom.y1 = 0;
portGeom.y2 = portHeight;
portGeom.x = portWidth / 2;
portGeom.y = portHeight / 2;
portGeom.isValid = true;
}
void spReticleLocData::calcFilmbackGeom()
{
filmback = oFilmback;
bool useCameraFilmback = filmback.horizontalFilmAperture == -1;
if (useCameraFilmback)
{
}
double hfa = filmback.horizontalFilmAperture;
double vfa = filmback.verticalFilmAperture;
double aspectRatio = hfa/vfa;
double nonPaddedAspectRatio = aspectRatio;
if (pad.usePad && pad.isPadded)
{
filmback.horizontalFilmAperture -= pad.padAmountX;
filmback.verticalFilmAperture -= pad.padAmountY;
nonPaddedAspectRatio = filmback.horizontalFilmAperture / filmback.verticalFilmAperture;
if (! pad.usePad)
{
hfa = filmback.horizontalFilmAperture;
vfa = filmback.verticalFilmAperture;
aspectRatio = nonPaddedAspectRatio;
}
}
if (!useCameraFilmback && options.driveCameraAperture)
{
}
double portAspectRatio = double(portWidth)/double(portHeight);
bool portHoriz = portAspectRatio > aspectRatio;
{
if (portHoriz)
else
}
{
if (portHoriz)
else
}
switch ( filmFit )
{
filmback.filmbackGeom.x = (portWidth / overscan);
if (pad.usePad && pad.isPadded)
{
pad.padGeom.x = filmback.filmbackGeom.x;
pad.padGeom.y = pad.padGeom.x / aspectRatio;
filmback.filmbackGeom.x /= hfa / filmback.horizontalFilmAperture;
}
filmback.filmbackGeom.y = filmback.filmbackGeom.x / nonPaddedAspectRatio;
break;
filmback.filmbackGeom.y = (portHeight / overscan);
if (pad.usePad && pad.isPadded)
{
pad.padGeom.y = filmback.filmbackGeom.y;
pad.padGeom.x = pad.padGeom.y * aspectRatio;
filmback.filmbackGeom.y /= vfa / filmback.verticalFilmAperture;
}
filmback.filmbackGeom.x = filmback.filmbackGeom.y * nonPaddedAspectRatio;
break;
default:
break;
}
filmback.filmbackGeom.x1 = portGeom.x - (filmback.filmbackGeom.x / 2);
filmback.filmbackGeom.x2 = portGeom.x + (filmback.filmbackGeom.x / 2);
filmback.filmbackGeom.y1 = portGeom.y - (filmback.filmbackGeom.y / 2);
filmback.filmbackGeom.y2 = portGeom.y + (filmback.filmbackGeom.y / 2);
filmback.filmbackGeom.isValid = true;
filmback.horizontalImageAperture = filmback.horizontalFilmAperture;
filmback.verticalImageAperture = filmback.verticalFilmAperture;
filmback.imageGeom = filmback.filmbackGeom;
if (filmback.soundTrackWidth != 0)
{
filmback.horizontalImageAperture -= filmback.soundTrackWidth;
filmback.imageGeom.x = filmback.filmbackGeom.x * (filmback.horizontalImageAperture/filmback.horizontalFilmAperture);
filmback.imageGeom.x1 = filmback.filmbackGeom.x1+(filmback.filmbackGeom.x-filmback.imageGeom.x);
}
if (pad.usePad && pad.isPadded)
{
pad.padGeom.x1 = portGeom.x - (pad.padGeom.x / 2);
pad.padGeom.x2 = portGeom.x + (pad.padGeom.x / 2);
pad.padGeom.y1 = portGeom.y - (pad.padGeom.y / 2);
pad.padGeom.y2 = portGeom.y + (pad.padGeom.y / 2);
pad.padGeom.isValid = true;
}
else
{
pad.padGeom = filmback.filmbackGeom;
pad.padGeom.isValid = false;
}
filmback.safeActionGeom.isValid = false;
filmback.safeTitleGeom.isValid = false;
}
void spReticleLocData::calcFilmbackSafeActionGeom()
{
calcMaskGeom(filmback.safeActionGeom,filmback.horizontalSafeAction,filmback.verticalSafeAction,filmback.imageGeom,filmback.horizontalImageAperture,filmback.verticalImageAperture);
filmback.safeActionGeom.isValid = true;
}
void spReticleLocData::calcFilmbackSafeTitleGeom(){
calcMaskGeom(filmback.safeTitleGeom,filmback.horizontalSafeTitle,filmback.verticalSafeTitle,filmback.imageGeom,filmback.horizontalImageAperture,filmback.verticalImageAperture);
filmback.safeTitleGeom.isValid = true;
}
void spReticleLocData::calcMaskGeom(Geom & g, double w, double h, Geom & gSrc,
double wSrc, double hSrc)
{
double pw = (w != -1)?((wSrc-w)/2)/wSrc:(1-wSrc)/2;
double ph = (h != -1)?((hSrc-h)/2)/hSrc:(1-hSrc)/2;
g.x = gSrc.x*pw;
g.y = gSrc.y*ph;
g.x1 = gSrc.x1+g.x;
g.x2 = gSrc.x2-g.x;
g.y1 = gSrc.y1+g.y;
g.y2 = gSrc.y2-g.y;
}
void spReticleLocData::calcSafeActionGeom( Aspect_Ratio & ar )
{
if ( ar.aspectGeom.isValid )
{
ar.safeActionGeom = ar.aspectGeom;
calcMaskGeom(ar.safeActionGeom, -1, -1, ar.aspectGeom, 0.9, 0.9);
ar.safeActionGeom.isValid = true;
}
else
{
ar.safeActionGeom.isValid = false;
}
}
void spReticleLocData::calcSafeTitleGeom( Aspect_Ratio & ar )
{
if (ar.aspectGeom.isValid)
{
ar.safeTitleGeom = ar.aspectGeom;
calcMaskGeom(ar.safeTitleGeom, -1, -1, ar.aspectGeom, 0.8, 0.8);
ar.safeTitleGeom.isValid = true;
}
else
{
ar.safeTitleGeom.isValid = false;
}
}
void spReticleLocData::calcAspectGeom( Aspect_Ratio & ar )
{
ar.aspectGeom.x = filmback.imageGeom.x;
ar.aspectGeom.y = ar.aspectGeom.x / ar.aspectRatio;
ar.aspectGeom.x1 = filmback.imageGeom.x1;
ar.aspectGeom.x2 = filmback.imageGeom.x2;
ar.aspectGeom.y1 = portGeom.y - (ar.aspectGeom.y / 2);
ar.aspectGeom.y2 = portGeom.y + (ar.aspectGeom.y / 2);
ar.aspectGeom.isValid = true;
ar.safeActionGeom.isValid = false;
ar.safeTitleGeom.isValid = false;
if (ar.displaySafeAction)
calcSafeActionGeom(ar);
if (ar.displaySafeTitle)
calcSafeTitleGeom(ar);
}
void spReticleLocData::calcPanScanGeom( PanScan & ps )
{
if (ps.aspectRatio == -1)
ps.aspectRatio = filmback.horizontalFilmAperture / filmback.verticalFilmAperture;
ps.aspectGeom.y = filmback.imageGeom.x / ps.aspectRatio;
ps.aspectGeom.x = ps.aspectGeom.y * ps.panScanRatio;
ps.aspectGeom.x1 = filmback.imageGeom.x1+ ( ((ps.panScanOffset+1)/2)*(filmback.imageGeom.x-ps.aspectGeom.x) );
ps.aspectGeom.x2 = ps.aspectGeom.x1+ps.aspectGeom.x;
ps.aspectGeom.y1 = portGeom.y - (ps.aspectGeom.y / 2);
ps.aspectGeom.y2 = portGeom.y + (ps.aspectGeom.y / 2);
ps.aspectGeom.isValid = true;
ps.safeActionGeom.isValid = false;
ps.safeTitleGeom.isValid = false;
if (ps.displaySafeAction)
calcSafeActionGeom( ps );
if (ps.displaySafeTitle)
calcSafeTitleGeom( ps );
}
void spReticleLocData::doCompute()
{
calcFilmbackGeom();
if (filmback.displayProjGate)
calcMaskGeom(filmback.projGeom,filmback.horizontalProjectionGate,filmback.verticalProjectionGate,filmback.imageGeom,filmback.horizontalImageAperture,filmback.verticalImageAperture);
if (filmback.displaySafeAction)
calcFilmbackSafeActionGeom();
if (filmback.displaySafeTitle)
calcFilmbackSafeTitleGeom();
if (panScan.displayMode != 0)
calcPanScanGeom( panScan );
for (int i = 0; i < numAspectRatios; i++ )
{
if (ars[i].displayMode != 0)
{
calcAspectGeom( ars[i] );
}
}
}
spReticleLocDrawOverride::spReticleLocDrawOverride(
const MObject& obj )
,mCustomBoxDraw(false)
{
}
spReticleLocDrawOverride::~spReticleLocDrawOverride()
{
}
{
}
bool spReticleLocDrawOverride::isBounded(
const MDagPath& objPath,
const MDagPath& cameraPath )
const
{
return true;
}
{
MPoint(1000000,1000000,1000000));
}
{
spReticleLocData* data = dynamic_cast<spReticleLocData*>(oldData);
if(!data) {
data = new spReticleLocData();
if(data == NULL) {
return NULL;
}
loadDefault = 1;
needRefresh = true;
}
int oX,oy,portWidth,portHeight;
spReticleLoc* pSpReticleNode = dynamic_cast<spReticleLoc*>(depNodeFn.userNode(&status));
return data;
}
pSpReticleNode->getDrawData(*data, cameraPath, portHeight,portWidth);
return data;
}
{
const spReticleLocData* reticleData = dynamic_cast<const spReticleLocData*>(data);
if(!reticleData) {
return;
}
if (!reticleData->options.drawingEnabled)
return;
if (reticleData->cameraData.isOrtho)
return;
if(reticleData->options.useSpRet){
if (!reticleData->useReticle)
return;
}
Options options = reticleData->options ;
int numAspectRatios = reticleData->numAspectRatios ;
Geom portGeom = reticleData->portGeom ;
std::vector<Aspect_Ratio> ars = reticleData->ars ;
PadOptions pad = reticleData->pad ;
Filmback oFilmback = reticleData->oFilmback ;
Filmback filmback = reticleData->filmback ;
PanScan panScan = reticleData->panScan ;
std::vector<TextData> textWhenDraw = reticleData->textWhenDraw ;
double maximumDist = reticleData->maximumDist ;
Geom aspectContainerGeom;
if (pad.usePad && pad.isPadded)
{
if (pad.displayMode == 2)
drawMask(portGeom, pad.padGeom, pad.padGeom.maskColor, true, drawManager);
aspectContainerGeom = pad.padGeom;
}
else
{
aspectContainerGeom = portGeom;
}
Aspect_Ratio ar;
for (int i = 0; i < numAspectRatios; i++ )
{
ar = ars[i];
if (ar.displayMode == 2)
{
Geom g = (i == 0)?aspectContainerGeom:ars[i-1].aspectGeom;
MColor maskColor = ar.aspectGeom.maskColor;
if (options.maximumDistance > 0 &&
fabs(maximumDist) >= options.maximumDistance)
{
if (i == 0)
{
maskColor =
MColor(1,0,0,maskColor.
a);
}
else
{
maskColor *=
MColor(1.5,0.5,0.5,1);
}
}
drawMask(g, ar.aspectGeom, maskColor, i == 0, drawManager);
}
}
for (int i = 0; i < numAspectRatios; i++ )
{
ar = ars[i];
if (ar.displayMode != 0)
{
bool sides = (i == 0 || ar.aspectGeom.x != ars[i].aspectGeom.x);
drawLines(ar.aspectGeom, ar.aspectGeom.lineColor, sides, 0, drawManager);
if (ar.displaySafeAction)
drawLines( ar.safeActionGeom, ar.safeActionGeom.lineColor, 1, 1, drawManager);
if (ar.displaySafeTitle)
drawLines( ar.safeTitleGeom, ar.safeTitleGeom.lineColor, 1, 1, drawManager);
}
}
if ( panScan.displayMode != 0 )
{
if (panScan.displayMode == 2){
drawMask(ars[0].aspectGeom, panScan.aspectGeom, panScan.aspectGeom.maskColor, true, drawManager);
}
drawLines(panScan.aspectGeom, panScan.aspectGeom.lineColor, 1, 0,drawManager);
if (panScan.displaySafeAction)
{
drawLines( panScan.safeActionGeom, panScan.safeActionGeom.lineColor, 1, 1,drawManager);
}
if (panScan.displaySafeTitle)
{
drawLines( panScan.safeTitleGeom, panScan.safeTitleGeom.lineColor, 1, 1,drawManager);
}
}
if ( filmback.displayFilmGate )
{
drawLines(filmback.filmbackGeom, filmback.filmbackGeom.lineColor, 1, 0,drawManager);
if ( filmback.soundTrackWidth != 0 )
drawLine(filmback.imageGeom.x1, filmback.imageGeom.x1, filmback.imageGeom.y1, filmback.imageGeom.y2, filmback.imageGeom.lineColor, 0,drawManager);
}
if (filmback.displaySafeAction)
{
drawLines( filmback.safeActionGeom, filmback.safeActionGeom.lineColor, 1, 1, drawManager);
}
if (filmback.displaySafeTitle)
{
drawLines( filmback.safeTitleGeom, filmback.safeTitleGeom.lineColor, 1, 1,drawManager);
}
if ( filmback.displayProjGate )
{
drawLines(filmback.projGeom, filmback.projGeom.lineColor, 1, 1,drawManager);
}
if ( options.displayLineH )
{
drawLine( filmback.imageGeom.x1, filmback.imageGeom.x2, portGeom.y, portGeom.y, options.lineColor, 0,drawManager );
}
if ( options.displayLineV )
{
double cx = ( filmback.imageGeom.x1 + filmback.imageGeom.x2 ) / 2;
drawLine( cx, cx, filmback.imageGeom.y1, filmback.imageGeom.y2, options.lineColor, 0, drawManager );
}
if ( options.displayThirdsH)
{
Geom g = (numAspectRatios > 0)?ars[0].aspectGeom:portGeom;
double y1 = g.y1+ ( ( g.y2 - g.y1 ) * 0.33 );
double y2 = g.y1+ ( ( g.y2 - g.y1 ) * 0.66 );
drawLine( g.x1, g.x2, y1, y1, options.lineColor, 0, drawManager);
drawLine( g.x1, g.x2, y2, y2, options.lineColor, 0, drawManager);
}
if ( options.displayThirdsV)
{
Geom g = (numAspectRatios > 0)?ars[0].aspectGeom:portGeom;
double x1 = g.x1+ ( ( g.x2 - g.x1 ) * 0.33 );
double x2 = g.x1+ ( ( g.x2 - g.x1 ) * 0.66 );
drawLine( x1, x1, g.y1, g.y2, options.lineColor, 0, drawManager);
drawLine( x2, x2, g.y1, g.y2, options.lineColor, 0, drawManager);
}
if ( options.displayCrosshair )
{
double cx = ( filmback.imageGeom.x1 + filmback.imageGeom.x2 ) / 2;
drawLine( cx-25, cx-5, portGeom.y, portGeom.y, options.lineColor, 0, drawManager );
drawLine( cx+25, cx+5, portGeom.y, portGeom.y, options.lineColor, 0, drawManager );
drawLine( cx, cx, portGeom.y-25, portGeom.y-5, options.lineColor, 0, drawManager );
drawLine( cx, cx, portGeom.y+25, portGeom.y+5, options.lineColor, 0, drawManager );
}
if (pad.usePad && pad.isPadded && pad.displayMode > 0)
{
drawLines(pad.padGeom, pad.padGeom.lineColor, 1, 0, drawManager);
}
if ( options.enableTextDrawing){
drawCustomTextElements(textWhenDraw, drawManager);
}
}
{
if (sides)
{
}
}
{
if(stipple) {
}
}
{
if(stipple) {
}
if(sides) {
drawManager.
rect2d(
MPoint ((g.x1 + g.x2)/2, (g.y1 + g.y2)/2),
fabs(g.x1-g.x2)/2,fabs(g.y1-g.y2)/2);
} else {
}
}
{
}
void spReticleLocDrawOverride::drawCustomTextElements( std::vector<TextData> textWhenDraw,
MHWRender::MUIDrawManager& drawManager )
{
for(unsigned int i = 0; i < textWhenDraw.size(); ++i) {
TextData td = textWhenDraw[i];
color.
a = 1.0f - color.
a;
}
}