//----------------------------------------------------------------------- void CompositorChain::_compile() { 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()); 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; }
//----------------------------------------------------------------------- void CompositorChain::destroyResources(void) { clearCompiledState(); if (mViewport) { mViewport->getTarget()->removeListener(this); mViewport->removeListener(this); removeAllCompositors(); destroyOriginalScene(); mViewport = 0; } }
//----------------------------------------------------------------------- void CompositorChain::destroyResources(void) { clearCompiledState(); if (mViewport) { removeAllCompositors(); /// Destroy "original scene" compositor instance if (mOriginalScene) { mViewport->getTarget()->removeListener(this); OGRE_DELETE mOriginalScene; mOriginalScene = 0; } mViewport = 0; } }