bool RenderTexTargetBinManager::setTargetSize(const Point2I &newTargetSize) { if( GFX->getAdapterType() != OpenGL && // Targets need to match up exactly in size on OpenGL. mTargetSize.x >= newTargetSize.x && mTargetSize.y >= newTargetSize.y ) return true; mTargetSize = newTargetSize; mNamedTarget.setViewport( RectI( Point2I::Zero, mTargetSize ) ); return _updateTargets(); }
bool RenderTexTargetBinManager::setTargetFormat(const GFXFormat &newTargetFormat) { if(mTargetFormat == newTargetFormat) return true; mTargetFormat = newTargetFormat; ConditionerFeature *conditioner = mNamedTarget.getConditioner(); if(conditioner) conditioner->setBufferFormat(mTargetFormat); return _updateTargets(); }
void RenderFormatToken::process(SceneState *state, RenderPassStateBin *callingBin) { switch(mFCState) { case FTSWaiting: { GFXDEBUGEVENT_SCOPE_EX(RFT_Waiting, ColorI::BLUE, avar("[%s Activate] (%s)", getName(), GFXStringTextureFormat[mColorFormat])); mFCState = FTSActive; mViewportRect = GFX->getViewport(); // Update targets _updateTargets(); // If we have a copy PostEffect then get the active backbuffer copy // now before we swap the render targets. GFXTexHandle curBackBuffer; if(mCopyPostEffect.isValid()) curBackBuffer = PFXMGR->getBackBufferTex(); // Push target GFX->pushActiveRenderTarget(); GFX->setActiveRenderTarget(mTargetChain[mTargetChainIdx]); // Set viewport GFX->setViewport(mViewportRect); // Clear GFX->clear(GFXClearTarget | GFXClearZBuffer | GFXClearStencil, gCanvasClearColor, 1.0f, 0); // Set active z target on render pass if(mTargetDepthStencilTexture[mTargetChainIdx].isValid()) { if(callingBin->getParentManager()->getDepthTargetTexture() != GFXTextureTarget::sDefaultDepthStencil) mStoredPassZTarget = callingBin->getParentManager()->getDepthTargetTexture(); else mStoredPassZTarget = NULL; callingBin->getParentManager()->setDepthTargetTexture(mTargetDepthStencilTexture[mTargetChainIdx]); } // Run the PostEffect which copies data into the new target. if ( mCopyPostEffect.isValid() ) mCopyPostEffect->process( state, curBackBuffer, &mViewportRect ); } break; case FTSActive: { GFXDEBUGEVENT_SCOPE_EX(RFT_Active, ColorI::BLUE, avar("[%s Deactivate]", getName())); mFCState = FTSComplete; // Pop target AssertFatal(GFX->getActiveRenderTarget() == mTargetChain[mTargetChainIdx], "Render target stack went wrong somewhere"); mTargetChain[mTargetChainIdx]->resolve(); GFX->popActiveRenderTarget(); // This is the GFX viewport when we were first processed. GFX->setViewport(mViewportRect); // Restore active z-target if(mTargetDepthStencilTexture[mTargetChainIdx].isValid()) { callingBin->getParentManager()->setDepthTargetTexture(mStoredPassZTarget.getPointer()); mStoredPassZTarget = NULL; } // Run the PostEffect which copies data to the backbuffer if(mResolvePostEffect.isValid()) { // Need to create a texhandle here, since inOutTex gets assigned during process() GFXTexHandle inOutTex = mTargetColorTexture[mTargetChainIdx]; mResolvePostEffect->process( state, inOutTex, &mViewportRect ); } } break; case FTSComplete: AssertFatal(false, "process() called on a RenderFormatToken which was already complete."); // fall through case FTSDisabled: break; } }