#include <stdio.h>
#include <maya/MString.h>
#include <maya/MViewport2Renderer.h>
#include <maya/MRenderTargetManager.h>
#include "viewRenderOverrideMRT.h"
viewRenderOverrideMRT::viewRenderOverrideMRT(
const MString& name)
: MRenderOverride(name)
, mUIName("Sample VP2 MRT Override")
{
unsigned int i = 0;
for (i=0; i<kOperationCount; i++)
{
mRenderOperations[i] = NULL;
}
mCurrentOperation = -1;
for (i=0; i<kShaderCount; i++)
{
mShaderInstances[i] = NULL;
}
unsigned int sampleCount = 1;
mTargetOverrideNames[kTempColor1] =
MString(
"_viewRenderOverrideMRT_MRT_Color_Target1__");
mTargetDescriptions [kTempColor1] =
mTargets [kTempColor1] = NULL;
mTargetOverrideNames[kTempColor2] =
MString(
"_viewRenderOverrideMRT_MRT_Color_Target2__");
mTargetDescriptions [kTempColor2] =
mTargets [kTempColor2] = NULL;
}
viewRenderOverrideMRT::~viewRenderOverrideMRT()
{
for (unsigned int i=0; i<kOperationCount; i++)
{
delete mRenderOperations[i];
mRenderOperations[i] = NULL;
}
if (theRenderer)
{
for (unsigned int i=0; i<kShaderCount; i++)
{
if (mShaderInstances[i])
{
if (shaderMgr)
mShaderInstances[i] = NULL;
}
}
for (unsigned int i=0; i<kTargetCount; i++)
{
if (mTargetDescriptions[i])
{
delete mTargetDescriptions[i];
mTargetDescriptions[i] = NULL;
}
if (mTargets[i])
{
if (targetManager)
{
}
mTargets[i] = NULL;
}
}
}
}
{
}
bool viewRenderOverrideMRT::startOperationIterator()
{
mCurrentOperation = 0;
return true;
}
{
if (mCurrentOperation >= 0 && mCurrentOperation < kOperationCount)
{
while(!mRenderOperations[mCurrentOperation] || !mRenderOperationEnabled[mCurrentOperation])
{
mCurrentOperation++;
if (mCurrentOperation >= kOperationCount)
{
return NULL;
}
}
if (mRenderOperations[mCurrentOperation])
{
return mRenderOperations[mCurrentOperation];
}
}
return NULL;
}
bool viewRenderOverrideMRT::nextRenderOperation()
{
mCurrentOperation++;
if (mCurrentOperation < kOperationCount)
{
return true;
}
return false;
}
MStatus viewRenderOverrideMRT::updateRenderOperations()
{
bool initOperations = true;
for (unsigned int i=0; i<kOperationCount; i++)
{
if (mRenderOperations[i])
initOperations = false;
}
if (initOperations)
{
mRenderOperationNames[kTargetClear] = "_viewRenderOverrideMRT_TargetClearMRT";
quadRenderMRT * quadOp = new quadRenderMRT (mRenderOperationNames[kTargetClear]);
mRenderOperations[kTargetClear] = quadOp ;
mRenderOperationEnabled[kTargetClear] = true;
mRenderOperationNames[kMaya3dSceneRender] = "_viewRenderOverrideMRT_SceneRenderMRT";
sceneRenderMRT * sceneOp = new sceneRenderMRT (mRenderOperationNames[kMaya3dSceneRender]);
mRenderOperations[kMaya3dSceneRender] = sceneOp;
mRenderOperationEnabled[kMaya3dSceneRender] = true;
mRenderOperationNames[kUserOp] = "_viewRenderOverrideMRT_UserOpMRT";
userOperationMRT * userOp = new userOperationMRT (mRenderOperationNames[kUserOp]);
mRenderOperations[kUserOp] = userOp;
mRenderOperationEnabled[kUserOp] = false;
mRenderOperationNames[kTargetPreview] = "_viewRenderOverrideMRT_TargetPreview";
quadRenderMRT * quadOp2 = new quadRenderMRT (mRenderOperationNames[kTargetPreview]);
mRenderOperations[kTargetPreview] = quadOp2;
mRenderOperationEnabled[kTargetPreview] = true;
mRenderOperationNames[kPresentOp] = "_viewRenderOverrideMRT_PresentTargetMRT";
mRenderOperations[kPresentOp] = new presentTargetMRT(mRenderOperationNames[kPresentOp]);
mRenderOperationEnabled[kPresentOp] = true;
}
mCurrentOperation = -1;
for (unsigned int i=0; i<kOperationCount; i++)
{
if (mRenderOperations[i])
}
return haveOperations;
}
{
if (!targetManager || !theRenderer)
unsigned int targetWidth = 256;
unsigned int targetHeight = 256;
static bool testTargetResize = false;
if (testTargetResize)
{
targetWidth *= 2;
targetHeight *= 1;
}
for (unsigned int targetId = 0; targetId < kTargetCount; ++targetId)
{
mTargetDescriptions[targetId]->setWidth( targetWidth );
mTargetDescriptions[targetId]->setHeight( targetHeight );
if (targetId > 0)
{
mTargetDescriptions[targetId]->setWidth( 100 );
if (! mTargetDescriptions[targetId]->compatibleWithDescription( *(mTargetDescriptions[0]) ))
mTargetDescriptions[targetId]->setWidth( targetWidth );
}
if (!mTargets[targetId])
else
}
quadRenderMRT * quadOp = (quadRenderMRT * )mRenderOperations[kTargetClear];
if (quadOp)
{
quadOp->useViewportRect(testTargetResize);
quadOp->setRenderTargets( mTargets, 2 );
}
sceneRenderMRT *sceneOp = (sceneRenderMRT *)mRenderOperations[kMaya3dSceneRender];
if (sceneOp)
{
sceneOp->useViewportRect(testTargetResize);
sceneOp->setRenderTargets( mTargets );
}
userOperationMRT * userOp = (userOperationMRT *)mRenderOperations[kUserOp];
if (userOp)
userOp->setRenderTargets( mTargets );
quadRenderMRT * quadOp2 = (quadRenderMRT * )mRenderOperations[kTargetPreview];
if (quadOp2)
{
quadOp2->useViewportRect(false);
quadOp2->setRenderTargets( NULL, 0 );
}
presentTargetMRT *presentOp = (presentTargetMRT *)mRenderOperations[kPresentOp];
if (presentOp)
presentOp->setRenderTargets( NULL );
}
{
if (!shaderInstance)
{
shaderInstance = mShaderInstances[kTargetClearShader] = shaderMgr->
getEffectsFileShader(
"mayaClearColorMRT",
"" );
if (shaderInstance)
{
const float target1Color[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
const float target2Color[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
shaderInstance->
setParameter(
"gTargetColor1", target1Color);
shaderInstance->
setParameter(
"gTargetColor2", target2Color);
}
}
quadRenderMRT * quadOp = (quadRenderMRT * )mRenderOperations[kTargetClear];
if (quadOp)
quadOp->setShader( mShaderInstances[kTargetClearShader] );
if (!shaderInstance1)
{
mShaderInstances[kSceneAttributeShader] = shaderInstance1;
}
sceneRenderMRT *sceneOp = (sceneRenderMRT *)mRenderOperations[kMaya3dSceneRender];
if (sceneOp)
{
sceneOp->setShader( shaderInstance1 );
}
if (!shaderInstance2)
{
mShaderInstances[kTargetPreviewShader] = shaderInstance2;
if (shaderInstance2)
{
const float borderClr[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
const float backGroundClr[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
shaderInstance2->
setParameter(
"gBackgroundColor", backGroundClr );
}
}
if (shaderInstance2)
{
unsigned int targetWidth = 0;
unsigned int targetHeight = 0;
if( theRenderer )
float vpSize[2] = { (float)targetWidth, (float)targetHeight };
shaderInstance2->
setParameter(
"gViewportSizePixels", vpSize );
float sourceSize[2] = { (float)targetWidth, (float)targetHeight };
shaderInstance2->
setParameter(
"gSourceSizePixels", sourceSize );
shaderInstance2->
setParameter(
"gBorderSizePixels", 0.00625f * targetWidth );
if (mTargets[0] && mTargets[1])
{
assignment.
target = mTargets[0];
assignment2.target = mTargets[1];
}
}
quadRenderMRT * quadOp2 = (quadRenderMRT * )mRenderOperations[kTargetPreview];
if (quadOp2)
quadOp2->setShader( mShaderInstances[kTargetPreviewShader] );
if (quadOp && shaderInstance && quadOp2 && shaderInstance2)
}
{
MStatus status = updateRenderOperations();
return status;
status = updateRenderTargets( renderer, targetManager );
return status;
status = updateShaders( shaderMgr );
return status;
}
MStatus viewRenderOverrideMRT::cleanup()
{
mCurrentOperation = -1;
quadRenderMRT * quadOp = (quadRenderMRT * )mRenderOperations[kTargetClear];
if (quadOp)
quadOp->setRenderTargets( NULL, 0);
sceneRenderMRT *sceneOp = (sceneRenderMRT *)mRenderOperations[kMaya3dSceneRender];
if (sceneOp)
sceneOp->setRenderTargets( NULL );
userOperationMRT * userOp = (userOperationMRT *)mRenderOperations[kUserOp];
if (userOp)
userOp->setRenderTargets( NULL );
quadRenderMRT * quadOp2 = (quadRenderMRT * )mRenderOperations[kTargetPreview];
if (quadOp2)
quadOp2->setRenderTargets( NULL, 0 );
presentTargetMRT *presentOp = (presentTargetMRT *)mRenderOperations[kPresentOp];
if (presentOp)
presentOp->setRenderTargets( NULL );
}
sceneRenderMRT ::sceneRenderMRT (
const MString& name)
: MSceneRender(name)
{
float val[4] = { 0.0f, 0.0f, 1.0f, 1.0f };
mClearOperation.setClearColor(val);
mTargets = NULL;
mShaderInstance = NULL;
mViewRectangle[0] = 0.1f;
mViewRectangle[1] = 0.1f;
mViewRectangle[2] = 0.8f;
mViewRectangle[3] = 0.8f;
mUseViewportRect = false;
}
sceneRenderMRT ::~sceneRenderMRT ()
{
mTargets = NULL;
mShaderInstance = NULL;
}
sceneRenderMRT::targetOverrideList(unsigned int &listSize)
{
if (mTargets)
{
listSize = 2;
return &mTargets[0];
}
return NULL;
}
sceneRenderMRT::clearOperation()
{
mClearOperation.
setMask( (
unsigned int)
return mClearOperation;
}
{
return mShaderInstance;
}
{
}
void
{
mTargets = targets;
}
sceneRenderMRT::viewportRectangleOverride()
{
if (mUseViewportRect)
return &mViewRectangle;
return NULL;
}
presentTargetMRT ::presentTargetMRT (
const MString& name)
: MPresentTarget(name)
{
mTargets = NULL;
}
presentTargetMRT ::~presentTargetMRT ()
{
mTargets = NULL;
}
presentTargetMRT::targetOverrideList(unsigned int &listSize)
{
if (mTargets)
{
listSize = 2;
return &mTargets[0];
}
listSize = 0;
return NULL;
}
void
{
mTargets = targets;
}
quadRenderMRT::quadRenderMRT(
const MString &name)
: MQuadRender( name )
, mShaderInstance(NULL)
{
mOutputTargetCount = 0;
mOutputTargets = NULL;
mViewRectangle[0] = 0.1f;
mViewRectangle[1] = 0.1f;
mViewRectangle[2] = 0.8f;
mViewRectangle[3] = 0.8f;
mUseViewportRect = false;
}
quadRenderMRT::~quadRenderMRT()
{
mOutputTargetCount = 0;
mOutputTargets = NULL;
mShaderInstance = NULL;
}
quadRenderMRT::shader()
{
return mShaderInstance;
}
quadRenderMRT::targetOverrideList(unsigned int &listSize)
{
if (mOutputTargets)
{
listSize = mOutputTargetCount;
return &mOutputTargets[0];
}
listSize = 0;
return NULL;
}
quadRenderMRT::viewportRectangleOverride()
{
if (mUseViewportRect)
return &mViewRectangle;
return NULL;
}
quadRenderMRT::clearOperation()
{
return mClearOperation;
}
userOperationMRT::userOperationMRT(
const MString &name)
: MUserRenderOperation( name )
{
mTargets = NULL;
}
userOperationMRT::~userOperationMRT()
{
mTargets = NULL;
}
{
}
userOperationMRT::targetOverrideList(unsigned int &listSize)
{
if (mTargets)
{
listSize = 2;
return &mTargets[0];
}
return NULL;
}