//----------------------------------------------------------------------- void CompositorChain::setCompositorEnabled(size_t position, bool state) { CompositorInstance* inst = getCompositor(position); if (!state && inst->getEnabled()) { // If we're disabling a 'middle' compositor in a chain, we have to be // careful about textures which might have been shared by non-adjacent // instances which have now become adjacent. CompositorInstance* nextInstance = getNextInstance(inst, true); if (nextInstance) { CompositionTechnique::TargetPassIterator tpit = nextInstance->getTechnique()->getTargetPassIterator(); while(tpit.hasMoreElements()) { CompositionTargetPass* tp = tpit.getNext(); if (tp->getInputMode() == CompositionTargetPass::IM_PREVIOUS) { if (nextInstance->getTechnique()->getTextureDefinition(tp->getOutputName())->pooled) { // recreate nextInstance->freeResources(false, true); nextInstance->createResources(false); } } } } } inst->setEnabled(state); }
void TerrainManager::fixCompositorClearColor() { // hack // now with extensive error checking if (CompositorManager::getSingleton().hasCompositorChain(gEnv->mainCamera->getViewport())) { // //CompositorManager::getSingleton().getCompositorChain(gEnv->ogreCamera->getViewport())->getCompositor(0)->getTechnique()->getOutputTargetPass()->getPass(0)->setClearColour(fade_color); CompositorInstance *co = CompositorManager::getSingleton().getCompositorChain(gEnv->mainCamera->getViewport())->_getOriginalSceneCompositor(); if (co) { CompositionTechnique *ct = co->getTechnique(); if (ct) { CompositionTargetPass *ctp = ct->getOutputTargetPass(); if (ctp) { CompositionPass *p = ctp->getPass(0); if (p) { p->setClearColour(fade_color); } } } } } }
//----------------------------------------------------------------------------------- void Sample_Compositor::checkBoxToggled(OgreBites::CheckBox * box) { if (Ogre::StringUtil::startsWith(box->getName(), "Compositor_", false)) { String compositorName = box->getCaption(); String activeTex = mDebugTextureSelectMenu->getSelectedItem(); if (!box->isChecked()) { //Remove the items from the debug menu and remove debug texture if from disabled compositor bool debuggingRemovedTex = StringUtil::startsWith(activeTex, compositorName, false); if (debuggingRemovedTex) { mDebugTextureTUS->setContentType(TextureUnitState::CONTENT_NAMED); mDebugTextureSelectMenu->selectItem(0, true); } for (unsigned int i = 1; i < mDebugTextureSelectMenu->getNumItems(); i++) { if (StringUtil::startsWith(mDebugTextureSelectMenu->getItems()[i], compositorName, false)) { mDebugTextureSelectMenu->removeItem(i); i--; } } if (!debuggingRemovedTex) { //Selection clears itself when removing items. Restore. mDebugTextureSelectMenu->selectItem(activeTex, false); } } CompositorManager::getSingleton().setCompositorEnabled(mViewport, compositorName, box->isChecked()); if (box->isChecked()) { //Add the items to the selectable texture menu CompositorInstance* instance = CompositorManager::getSingleton().getCompositorChain(mViewport)->getCompositor(compositorName); if (instance) { CompositionTechnique::TextureDefinitionIterator it = instance->getTechnique()->getTextureDefinitionIterator(); while (it.hasMoreElements()) { CompositionTechnique::TextureDefinition* texDef = it.getNext(); size_t numTextures = texDef->formatList.size(); if (numTextures > 1) { for (size_t i=0; i<numTextures; i++) { //Dirty string composition. NOT ROBUST! mDebugTextureSelectMenu->addItem(compositorName + ";" + texDef->name + ";" + Ogre::StringConverter::toString((Ogre::uint32)i)); } } else { mDebugTextureSelectMenu->addItem(compositorName + ";" + texDef->name); } } mDebugTextureSelectMenu->selectItem(activeTex, false); } } } }