#include <stdio.h>
#include <maya/MString.h>
#include <maya/MViewport2Renderer.h>
#include <maya/MRenderTargetManager.h>
#include <maya/MTextureManager.h>
#include <maya/MDrawContext.h>
#include "viewRenderOverrideTargets.h"
viewRenderOverrideTargets::viewRenderOverrideTargets(
const MString& name)
: MRenderOverride(name)
, mUIName("VP2 Targets Copy Target Test")
{
unsigned int i = 0;
for (i=0; i<kOperationCount; i++)
{
mRenderOperations[i] = NULL;
}
mCurrentOperation = -1;
for (i=0; i<kShaderCount; i++)
{
mShaderInstances[i] = NULL;
}
}
viewRenderOverrideTargets::~viewRenderOverrideTargets()
{
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;
}
}
}
}
MHWRender::DrawAPI viewRenderOverrideTargets::supportedDrawAPIs() const
{
return (MHWRender::kOpenGL | MHWRender::kDirectX11 | MHWRender::kOpenGLCoreProfile);
}
bool viewRenderOverrideTargets::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 viewRenderOverrideTargets::nextRenderOperation()
{
mCurrentOperation++;
if (mCurrentOperation < kOperationCount)
{
return true;
}
return false;
}
MStatus viewRenderOverrideTargets::updateRenderOperations()
{
bool initOperations = true;
for (unsigned int i=0; i<kOperationCount; i++)
{
if (mRenderOperations[i])
initOperations = false;
}
if (initOperations)
{
mRenderOperationNames[kMaya3dSceneRender] = "_viewRenderOverrideTargets_SceneRenderTargets";
sceneRenderTargets * sceneOp = new sceneRenderTargets (mRenderOperationNames[kMaya3dSceneRender], this);
mRenderOperations[kMaya3dSceneRender] = sceneOp;
mRenderOperationEnabled[kMaya3dSceneRender] = true;
mRenderOperationNames[kTargetPreview] = "_viewRenderOverrideTargets_TargetPreview";
quadRenderTargets * quadOp2 = new quadRenderTargets (mRenderOperationNames[kTargetPreview], this);
mRenderOperations[kTargetPreview] = quadOp2;
mRenderOperationEnabled[kTargetPreview] = true;
mRenderOperationNames[kPresentOp] = "_viewRenderOverrideTargets_PresentTargetTargets";
mRenderOperations[kPresentOp] = new presentTargetTargets(mRenderOperationNames[kPresentOp]);
mRenderOperationEnabled[kPresentOp] = true;
}
mCurrentOperation = -1;
for (unsigned int i=0; i<kOperationCount; i++)
{
if (mRenderOperations[i])
}
return haveOperations;
}
{
if (!shaderInstance)
{
mShaderInstances[kTargetPreviewShader] = shaderInstance;
if (shaderInstance)
{
const float borderClr[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
const float backGroundClr[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
shaderInstance->
setParameter(
"gBackgroundColor", backGroundClr );
}
}
if (shaderInstance)
{
unsigned int targetWidth = 0;
unsigned int targetHeight = 0;
if( theRenderer )
float vpSize[2] = { (float)targetWidth, (float)targetHeight };
shaderInstance->
setParameter(
"gViewportSizePixels", vpSize );
float sourceSize[2] = { (float)targetWidth, (float)targetHeight };
shaderInstance->
setParameter(
"gSourceSizePixels", sourceSize );
shaderInstance->
setParameter(
"gBorderSizePixels", 0.00625f * targetWidth );
}
quadRenderTargets * quadOp = (quadRenderTargets * )mRenderOperations[kTargetPreview];
if (quadOp)
quadOp->setShader( mShaderInstances[kTargetPreviewShader] );
if (quadOp && shaderInstance)
}
{
MStatus status = updateRenderOperations();
return status;
status = updateShaders( shaderMgr );
return status;
}
MStatus viewRenderOverrideTargets::cleanup()
{
mCurrentOperation = -1;
quadRenderTargets *quadOp = (quadRenderTargets *)mRenderOperations[kTargetPreview];
if (quadOp)
quadOp->updateTargets( NULL, NULL );
sceneRenderTargets *sceneOp = (sceneRenderTargets *) mRenderOperations[kMaya3dSceneRender];
if (sceneOp)
sceneOp->releaseTargets();
}
sceneRenderTargets ::sceneRenderTargets (
const MString& name, viewRenderOverrideTargets *theOverride)
: MSceneRender(name)
, mOverride(theOverride)
{
float val[4] = { 0.0f, 0.0f, 1.0f, 1.0f };
mClearOperation.setClearColor(val);
mTempColourTarget = NULL;
mTempDepthTarget = NULL;
}
sceneRenderTargets ::~sceneRenderTargets ()
{
mOverride = NULL;
}
sceneRenderTargets::clearOperation()
{
return mClearOperation;
}
{
}
{
bool inColorPass = false;
bool inDisallowedPass = false;
for (
unsigned int i=0; i<passSem.
length(); i++)
{
inColorPass = true;
{
inDisallowedPass = true;
}
}
if (!inColorPass || inDisallowedPass)
{
return;
}
if (!theRenderer)
return;
quadRenderTargets *quadOp = NULL;
if (mOverride)
{
quadOp = (quadRenderTargets *)mOverride->getOperation( viewRenderOverrideTargets::kTargetPreview );
}
if (quadOp)
quadOp->updateTargets( mTempColourTarget, mTempDepthTarget );
}
void sceneRenderTargets::releaseTargets()
{
if (!theRenderer)
return;
if (!textureManager)
return;
if (mTempColourTarget)
{
mTempColourTarget = NULL;
}
if (mTempDepthTarget)
{
mTempDepthTarget = NULL;
}
}
presentTargetTargets ::presentTargetTargets (
const MString& name)
: MPresentTarget(name)
{
}
presentTargetTargets ::~presentTargetTargets ()
{
}
{
if (!mShaderInstance)
return;
mShaderInstance->setParameter("gSourceTex", texAssignment);
mShaderInstance->setParameter("gSourceTex2", texAssignment2);
}
quadRenderTargets::quadRenderTargets(
const MString &name, viewRenderOverrideTargets *theOverride)
: MQuadRender( name )
, mShaderInstance(NULL)
, mOverride(theOverride)
{
}
quadRenderTargets::~quadRenderTargets()
{
mShaderInstance = NULL;
mOverride = NULL;
}
quadRenderTargets::shader()
{
return mShaderInstance;
}
quadRenderTargets::clearOperation()
{
return mClearOperation;
}