#include <maya/MApiNamespace.h>
#include <maya/MArgDatabase.h>
#include <maya/MFnPlugin.h>
#include <maya/MGlobal.h>
#include <maya/MPxCommand.h>
#include <maya/MSyntax.h>
#include <maya/MAnimControl.h>
#include <maya/MTime.h>
#include <maya/MRenderTargetManager.h>
#include <maya/MViewport2Renderer.h>
#include <vector>
#define kCaptureFrame "-cf"
#define kCaptureFrameLong "-captureFrame"
#define kShowFrame "-sf"
#define kShowFrameLong "-showFrame"
class MayaViewportRenderData
{
public:
MayaViewportRenderData(
const MTime& renderTime,
bool outputColorTransform)
: mRenderTime(renderTime)
, mOutputColorTransform(outputColorTransform)
{
if (theRenderer)
{
if (!targetManager)
return;
MString(
"CapturedTarget") + mRenderTime.value());
}
mIsDone = false;
}
~MayaViewportRenderData()
{
if (theRenderer)
{
if (targetManager)
{
}
}
}
static void doRenderTask(void* clientData)
{
MayaViewportRenderData* renderData =
static_cast<MayaViewportRenderData*>(clientData);
if (!renderData)
return;
if (!theRenderer)
{
return;
}
if (!target)
{
return;
}
static const MString cmQR(
"colorManagementPrefs -q -outputTarget renderer -outputTransformEnabled");
static const MString cmER(
"colorManagementPrefs -e -outputTarget renderer -inhibitEvents -outputTransformEnabled ");
static const MString cmQP(
"colorManagementPrefs -q -outputTarget playblast -outputTransformEnabled");
static const MString cmEP(
"colorManagementPrefs -e -outputTarget playblast -inhibitEvents -outputTransformEnabled ");
int result = 0;
bool outputColorTransformR = (result != 0);
if (outputColorTransformR != renderData->mOutputColorTransform)
{
MString cmd = cmER + (renderData->mOutputColorTransform ? 1 : 0);
}
bool outputColorTransformP = (result != 0);
if (outputColorTransformP != renderData->mOutputColorTransform)
{
MString cmd = cmEP + (renderData->mOutputColorTransform ? 1 : 0);
}
theRenderer->
render(
"modelPanel4", &target, 1);
if (outputColorTransformR != renderData->mOutputColorTransform)
{
MString cmd = cmER + (outputColorTransformR ? 1 : 0);
}
if (outputColorTransformP != renderData->mOutputColorTransform)
{
MString cmd = cmEP + (outputColorTransformP ? 1 : 0);
}
renderData->mIsDone = true;
}
const MTime& renderTime()
const
{
return mRenderTime;
}
{
return mTarget;
}
bool isDone() const
{
return mIsDone;
}
private:
bool mOutputColorTransform;
bool mIsDone;
};
std::vector<MayaViewportRenderData*> gRenderData;
{
public:
captureViewRenderCmd()
{
}
~captureViewRenderCmd() override
{
}
static void* creator()
{
return new captureViewRenderCmd;
}
{
syntax.
addFlag(kCaptureFrame, kCaptureFrameLong,
}
};
{
if (!status)
return status;
if (argData.isFlagSet(kCaptureFrame))
{
for (unsigned int i = 0; i < gRenderData.size(); i++)
{
delete gRenderData[i];
}
bool outputColorTransform = false;
argData.getFlagArgument(kCaptureFrame, 0, startTime);
argData.getFlagArgument(kCaptureFrame, 1, endTime);
argData.getFlagArgument(kCaptureFrame, 2, outputColorTransform);
for (
MTime currentTime = startTime; currentTime <= endTime;
currentTime++)
{
MayaViewportRenderData* newRenderTask =
new MayaViewportRenderData(currentTime, outputColorTransform);
gRenderData.push_back(newRenderTask);
newRenderTask,
}
}
else if (argData.isFlagSet(kShowFrame))
{
argData.getFlagArgument(kShowFrame, 0, time);
unsigned int frameToShow = gRenderData.size();
for (unsigned int i = 0; i < gRenderData.size(); i++)
{
if (time == gRenderData[i]->renderTime())
{
frameToShow = i;
break;
}
}
if (frameToShow == gRenderData.size())
{
return MS::kFailure;
}
if (!gRenderData[frameToShow]->isDone())
{
return MS::kFailure;
}
MRenderer::theRenderer()->copyTargetToScreen(
gRenderData[frameToShow]->renderTarget());
}
return MS::kSuccess;
}
{
MFnPlugin plugin(_obj, PLUGIN_COMPANY,
"1.0");
MStatus stat = plugin.registerCommand(
"captureViewRender",
captureViewRenderCmd::creator,
captureViewRenderCmd::newSyntax);
if (!stat)
stat.
perror(
"registerCommand");
return stat;
}
{
MStatus stat = plugin.deregisterCommand(
"captureViewRender");
if (!stat)
stat.
perror(
"deregisterCommand");
for (unsigned int i = 0; i < gRenderData.size(); i++)
{
delete gRenderData[i];
}
gRenderData.clear();
return stat;
}