#include <stdio.h>
#include <stdlib.h>
#include <maya/MString.h>
#include <maya/MViewport2Renderer.h>
#include <maya/MRenderTargetManager.h>
#include <maya/MTextureManager.h>
#include <maya/MDrawContext.h>
#include <maya/MAnimControl.h>
#include "viewRenderOverrideFrameCache.h"
#include <maya/MHardwareRenderer.h>
#include <maya/MGLFunctionTable.h>
#include <maya/MImage.h>
viewRenderOverrideFrameCache::viewRenderOverrideFrameCache(
const MString& name)
: MRenderOverride(name)
, mUIName("VP2 Frame Caching Override")
, mAllowCaching(false)
, mCacheToDisk(false)
, mPerformCapture(false)
, mCachedTexture(NULL)
, mCurrentTime(0)
, mSubFrameSamples(10.0)
{
unsigned int i = 0;
for (i=0; i<kOperationCount; i++)
{
mRenderOperations[i] = NULL;
}
mCurrentOperation = -1;
for (i=0; i<kShaderCount; i++)
{
mShaderInstances[i] = NULL;
}
}
viewRenderOverrideFrameCache::~viewRenderOverrideFrameCache()
{
releaseCachedTextures();
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;
}
}
}
}
void viewRenderOverrideFrameCache::releaseCachedTextures()
{
printf("viewRenderOverrideFrameCache : Reset frame cache.\n");
if (!renderer) return;
if (!textureManager) return;
for (std::map<unsigned int,MHWRender::MTexture*>::iterator it=mCachedTargets.begin(); it!=mCachedTargets.end(); ++it)
{
if (NULL != texture)
{
it->second = NULL;
}
}
mCachedTargets.clear();
}
{
}
bool viewRenderOverrideFrameCache::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 viewRenderOverrideFrameCache::nextRenderOperation()
{
mCurrentOperation++;
if (mCurrentOperation < kOperationCount)
{
return true;
}
return false;
}
MStatus viewRenderOverrideFrameCache::updateRenderOperations()
{
bool initOperations = true;
for (unsigned int i=0; i<kOperationCount; i++)
{
if (mRenderOperations[i])
initOperations = false;
}
if (initOperations)
{
mRenderOperationNames[kMaya3dSceneRender] = "_viewRenderOverrideFrameCache_SceneRender";
SceneRenderOperation * sceneOp = new SceneRenderOperation (mRenderOperationNames[kMaya3dSceneRender], this);
mRenderOperations[kMaya3dSceneRender] = sceneOp;
mRenderOperationEnabled[kMaya3dSceneRender] = false;
mRenderOperationNames[kTargetCapture] = "_viewRenderOverrideFrameCache_TargetCapture";
CaptureTargetsOperation* captureOp = new CaptureTargetsOperation(mRenderOperationNames[kTargetCapture], this);
mRenderOperations[kTargetCapture] = captureOp;
mRenderOperationEnabled[kTargetCapture] = false;
mRenderOperationNames[kTargetPreview] = "_viewRenderOverrideFrameCache_TargetPreview";
PreviewTargetsOperation * previewOp = new PreviewTargetsOperation (mRenderOperationNames[kTargetPreview], this);
mRenderOperations[kTargetPreview] = previewOp;
mRenderOperationEnabled[kTargetPreview] = false;
mRenderOperationNames[kPresentOp] = "_viewRenderOverrideFrameCache_PresentTarget";
mRenderOperations[kPresentOp] = new presentTargets(mRenderOperationNames[kPresentOp]);
mRenderOperationEnabled[kPresentOp] = true;
}
mCurrentOperation = -1;
for (unsigned int i=0; i<kOperationCount; i++)
{
if (!mRenderOperations[i])
{
break;
}
}
return haveOperations;
mCachedTexture = NULL;
std::map<unsigned int,MHWRender::MTexture*>::iterator iter = mCachedTargets.find( mCurrentTime );
if (iter != mCachedTargets.end())
{
mCachedTexture = iter->second;
}
mPerformCapture = (NULL == mCachedTexture) && mAllowCaching;
CaptureTargetsOperation* captureOp = (CaptureTargetsOperation *)mRenderOperations[kTargetCapture];
captureOp->setTexture(NULL);
captureOp->setCurrentTime( mCurrentTime );
captureOp->setDumpImageToDisk( mCacheToDisk );
if (mPerformCapture)
{
printf("viewRenderOverrideFrameCache : Mode = capturing texture at time %g\n", (double)mCurrentTime / mSubFrameSamples );
mRenderOperationEnabled[kMaya3dSceneRender] = true;
mRenderOperationEnabled[kTargetCapture] = true;
mRenderOperationEnabled[kTargetPreview] = false;
}
else
{
if (mCachedTexture)
{
printf("viewRenderOverrideFrameCache : Mode = preview cached texture at time %g\n", (double)mCurrentTime / mSubFrameSamples );
mRenderOperationEnabled[kMaya3dSceneRender] = false;
mRenderOperationEnabled[kTargetCapture] = false;
mRenderOperationEnabled[kTargetPreview] = true;
}
else
{
printf("viewRenderOverrideFrameCache : Caching disabled and no frame to draw. Use regular refresh at time %g\n", (double)mCurrentTime / mSubFrameSamples );
mRenderOperationEnabled[kMaya3dSceneRender] = true;
mRenderOperationEnabled[kTargetCapture] = false;
mRenderOperationEnabled[kTargetPreview] = false;
}
}
return haveOperations;
}
{
if (!shaderInstance)
{
mShaderInstances[kTargetPreviewShader] = shaderInstance;
if (shaderInstance)
{
}
}
texAssignment.
texture = mCachedTexture;
PreviewTargetsOperation * quadOp = (PreviewTargetsOperation * )mRenderOperations[kTargetPreview];
if (quadOp)
{
quadOp->setShader( mShaderInstances[kTargetPreviewShader] );
}
if (quadOp && shaderInstance)
}
MStatus viewRenderOverrideFrameCache::setup(
const MString& destination)
{
MStatus status = updateRenderOperations();
return status;
status = updateShaders( shaderMgr );
return status;
}
MStatus viewRenderOverrideFrameCache::cleanup()
{
CaptureTargetsOperation* captureOp = (CaptureTargetsOperation* ) mRenderOperations[kTargetCapture];
if (captureOp)
{
if (texture)
{
printf("viewRenderOverrideFrameCache : Cache a new texture at time %g\n", (double)mCurrentTime / mSubFrameSamples);
std::pair<std::map<unsigned int,MHWRender::MTexture*>::iterator,bool> val;
val = mCachedTargets.insert( std::pair<unsigned int,MHWRender::MTexture*>(mCurrentTime, texture) );
if (val.second == false)
{
printf("viewRenderOverrideFrameCache : Failed to insert texture into cache. Already have element in cache !\n");
}
captureOp->setTexture( NULL );
}
}
mCurrentOperation = -1;
mPerformCapture = true;
mCachedTexture = NULL;
}
SceneRenderOperation ::SceneRenderOperation (
const MString& name, viewRenderOverrideFrameCache *theOverride)
: MSceneRender(name)
, mOverride(theOverride)
{
}
SceneRenderOperation ::~SceneRenderOperation ()
{
mOverride = NULL;
}
presentTargets ::presentTargets (
const MString& name)
: MPresentTarget(name)
{
}
presentTargets ::~presentTargets ()
{
}
PreviewTargetsOperation::PreviewTargetsOperation(
const MString &name, viewRenderOverrideFrameCache *theOverride)
: MQuadRender( name )
, mShaderInstance(NULL)
, mTexture(NULL)
, mOverride(theOverride)
{
}
PreviewTargetsOperation::~PreviewTargetsOperation()
{
mShaderInstance = NULL;
mTexture = NULL;
mOverride = NULL;
}
{
return mShaderInstance;
}
PreviewTargetsOperation::clearOperation()
{
return mClearOperation;
}
CaptureTargetsOperation::CaptureTargetsOperation(
const MString &name, viewRenderOverrideFrameCache *
override)
, mOverride(override)
, mTexture(NULL)
, mDumpImageToDisk(false)
{
}
CaptureTargetsOperation::~CaptureTargetsOperation()
{
mOverride = NULL;
mTexture = NULL;
}
{
if (mTexture)
{
const char *tmpDir = getenv("TMPDIR");
if (mDumpImageToDisk && tmpDir)
{
outputName = tmpDir;
outputName += "/viewCachedImage.";
outputName += ((float)mCurrentTime / 10.0f);
outputName += ".exr";
if (textureMgr)
{
printf(
"viewRenderOverrideFrameCache : Saved copied cached image to disk (%s) = %d\n", outputName.
asChar(), (status ==
MStatus::kSuccess));
}
}
}
}