//----------------------------------------------------------------------- void CompositorChain::preViewportUpdate(const RenderTargetViewportEvent& evt) { // Only set up if there is at least one compositor enabled, and it's this viewport if(evt.source != mViewport || !mAnyCompositorsEnabled) return; // set original scene details from viewport CompositionPass* pass = mOriginalScene->getTechnique()->getOutputTargetPass()->getPass(0); CompositionTargetPass* passParent = pass->getParent(); if (pass->getClearBuffers() != mViewport->getClearBuffers() || pass->getClearColour() != mViewport->getBackgroundColour() || pass->getClearDepth() != mViewport->getDepthClear() || passParent->getVisibilityMask() != mViewport->getVisibilityMask() || passParent->getMaterialScheme() != mViewport->getMaterialScheme() || passParent->getShadowsEnabled() != mViewport->getShadowsEnabled()) { // recompile if viewport settings are different pass->setClearBuffers(mViewport->getClearBuffers()); pass->setClearColour(mViewport->getBackgroundColour()); pass->setClearDepth(mViewport->getDepthClear()); passParent->setVisibilityMask(mViewport->getVisibilityMask()); passParent->setMaterialScheme(mViewport->getMaterialScheme()); passParent->setShadowsEnabled(mViewport->getShadowsEnabled()); _compile(); } Camera *cam = mViewport->getCamera(); if (cam) { /// Prepare for output operation preTargetOperation(mOutputOperation, mViewport, cam); } }
//----------------------------------------------------------------------- void CompositorChain::_compile() { // remove original scene if it has the wrong material scheme if( mOriginalSceneScheme != mViewport->getMaterialScheme() ) { destroyOriginalScene(); createOriginalScene(); } clearCompiledState(); bool compositorsEnabled = false; // force default scheme so materials for compositor quads will determined correctly MaterialManager& matMgr = MaterialManager::getSingleton(); String prevMaterialScheme = matMgr.getActiveScheme(); matMgr.setActiveScheme(MaterialManager::DEFAULT_SCHEME_NAME); /// Set previous CompositorInstance for each compositor in the list CompositorInstance *lastComposition = mOriginalScene; mOriginalScene->mPreviousInstance = 0; CompositionPass* pass = mOriginalScene->getTechnique()->getOutputTargetPass()->getPass(0); pass->setClearBuffers(mViewport->getClearBuffers()); pass->setClearColour(mViewport->getBackgroundColour()); pass->setClearDepth(mViewport->getDepthClear()); for(Instances::iterator i=mInstances.begin(); i!=mInstances.end(); ++i) { if((*i)->getEnabled()) { compositorsEnabled = true; (*i)->mPreviousInstance = lastComposition; lastComposition = (*i); } } /// Compile misc targets lastComposition->_compileTargetOperations(mCompiledState); /// Final target viewport (0) mOutputOperation.renderSystemOperations.clear(); lastComposition->_compileOutputOperation(mOutputOperation); // Deal with viewport settings if (compositorsEnabled != mAnyCompositorsEnabled) { mAnyCompositorsEnabled = compositorsEnabled; if (mAnyCompositorsEnabled) { // Save old viewport clearing options mOldClearEveryFrameBuffers = mViewport->getClearBuffers(); // Don't clear anything every frame since we have our own clear ops mViewport->setClearEveryFrame(false); } else { // Reset clearing options mViewport->setClearEveryFrame(mOldClearEveryFrameBuffers > 0, mOldClearEveryFrameBuffers); } } // restore material scheme matMgr.setActiveScheme(prevMaterialScheme); mDirty = false; }