//----------------------------------------------------------------------------------- void CompositorPass::notifyRecreated( const CompositorChannel &oldChannel, const CompositorChannel &newChannel ) { const Real EPSILON = 1e-6f; if( mTarget == calculateRenderTarget( mDefinition->getRtIndex(), oldChannel ) ) { mTarget = calculateRenderTarget( mDefinition->getRtIndex(), newChannel ); mNumPassesLeft = mDefinition->mNumInitialPasses; mViewport = 0; const unsigned short numViewports = mTarget->getNumViewports(); for( unsigned short i=0; i<numViewports && !mViewport; ++i ) { Viewport *vp = mTarget->getViewport(i); if( Math::Abs( vp->getLeft() - mDefinition->mVpLeft ) < EPSILON && Math::Abs( vp->getTop() - mDefinition->mVpTop ) < EPSILON && Math::Abs( vp->getWidth() - mDefinition->mVpWidth ) < EPSILON && Math::Abs( vp->getHeight() - mDefinition->mVpHeight )<EPSILON && vp->getOverlaysEnabled() == mDefinition->mIncludeOverlays ) { mViewport = vp; } } if( !mViewport ) { mViewport = mTarget->addViewport( mDefinition->mVpLeft, mDefinition->mVpTop, mDefinition->mVpWidth, mDefinition->mVpHeight ); mViewport->setOverlaysEnabled( mDefinition->mIncludeOverlays ); } } }
//----------------------------------------------------------------------------------- void CompositorPass::notifyRecreated( const CompositorChannel &oldChannel, const CompositorChannel &newChannel ) { const Real EPSILON = 1e-6f; if( mTarget == calculateRenderTarget( mDefinition->getRtIndex(), oldChannel ) ) { mTarget = calculateRenderTarget( mDefinition->getRtIndex(), newChannel ); mNumPassesLeft = mDefinition->mNumInitialPasses; mViewport = 0; CompositorWorkspace *workspace = mParentNode->getWorkspace(); uint8 workspaceVpMask = workspace->getViewportModifierMask(); bool applyModifier = (workspaceVpMask & mDefinition->mViewportModifierMask) != 0; Vector4 vpModifier = applyModifier ? workspace->getViewportModifier() : Vector4( 0, 0, 1, 1 ); Real left = mDefinition->mVpLeft + vpModifier.x; Real top = mDefinition->mVpTop + vpModifier.y; Real width = mDefinition->mVpWidth * vpModifier.z; Real height = mDefinition->mVpHeight * vpModifier.w; Real scLeft = mDefinition->mVpScissorLeft + vpModifier.x; Real scTop = mDefinition->mVpScissorTop + vpModifier.y; Real scWidth = mDefinition->mVpScissorWidth * vpModifier.z; Real scHeight = mDefinition->mVpScissorHeight * vpModifier.w; const unsigned short numViewports = mTarget->getNumViewports(); for( unsigned short i=0; i<numViewports && !mViewport; ++i ) { Viewport *vp = mTarget->getViewport(i); if( Math::Abs( vp->getLeft() - left ) < EPSILON && Math::Abs( vp->getTop() - top ) < EPSILON && Math::Abs( vp->getWidth() - width ) < EPSILON && Math::Abs( vp->getHeight() - height )<EPSILON && Math::Abs( vp->getScissorLeft() - scLeft ) < EPSILON && Math::Abs( vp->getScissorTop() - scTop ) < EPSILON && Math::Abs( vp->getScissorWidth() - scWidth ) < EPSILON && Math::Abs( vp->getScissorHeight() - scHeight )<EPSILON && vp->getOverlaysEnabled() == mDefinition->mIncludeOverlays ) { mViewport = vp; } } if( !mViewport ) { mViewport = mTarget->addViewport( mDefinition->mVpLeft, mDefinition->mVpTop, mDefinition->mVpWidth, mDefinition->mVpHeight ); mViewport->setScissors( scLeft, scTop, scWidth, scHeight ); mViewport->setOverlaysEnabled( mDefinition->mIncludeOverlays ); } } }
CompositorPass::CompositorPass( const CompositorPassDef *definition, const CompositorChannel &target, CompositorNode *parentNode ) : mDefinition( definition ), mTarget( 0 ), mViewport( 0 ), mNumPassesLeft( definition->mNumInitialPasses ), mParentNode( parentNode ) { assert( definition->mNumInitialPasses && "Definition is broken, pass will never execute!" ); mTarget = calculateRenderTarget( mDefinition->getRtIndex(), target ); const Real EPSILON = 1e-6f; const unsigned short numViewports = mTarget->getNumViewports(); for( unsigned short i=0; i<numViewports && !mViewport; ++i ) { Viewport *vp = mTarget->getViewport(i); if( Math::Abs( vp->getLeft() - mDefinition->mVpLeft ) < EPSILON && Math::Abs( vp->getTop() - mDefinition->mVpTop ) < EPSILON && Math::Abs( vp->getWidth() - mDefinition->mVpWidth ) < EPSILON && Math::Abs( vp->getHeight() - mDefinition->mVpHeight )<EPSILON && vp->getOverlaysEnabled() == mDefinition->mIncludeOverlays ) { mViewport = vp; } } if( !mViewport ) { mViewport = mTarget->addViewport( mDefinition->mVpLeft, mDefinition->mVpTop, mDefinition->mVpWidth, mDefinition->mVpHeight ); mViewport->setOverlaysEnabled( mDefinition->mIncludeOverlays ); } }
//----------------------------------------------------------------------------------- void CompositorPass::notifyDestroyed( const CompositorChannel &channel ) { if( mTarget == calculateRenderTarget( mDefinition->getRtIndex(), channel ) ) mTarget = 0; }
CompositorPass::CompositorPass( const CompositorPassDef *definition, const CompositorChannel &target, CompositorNode *parentNode ) : mDefinition( definition ), mTarget( 0 ), mViewport( 0 ), mNumPassesLeft( definition->mNumInitialPasses ), mParentNode( parentNode ), mTargetTexture( IdString(), &target.textures ), mNumValidResourceTransitions( 0 ) { assert( definition->mNumInitialPasses && "Definition is broken, pass will never execute!" ); mTarget = calculateRenderTarget( mDefinition->getRtIndex(), target ); //TODO: Merging RenderTarget & Texture in a refactor would get rid of these missmatches //between a "target" and a "texture" in mTargetTexture. if( !target.textures.empty() ) mTargetTexture.name = IdString( target.textures[0]->getName() ); const Real EPSILON = 1e-6f; CompositorWorkspace *workspace = mParentNode->getWorkspace(); uint8 workspaceVpMask = workspace->getViewportModifierMask(); bool applyModifier = (workspaceVpMask & mDefinition->mViewportModifierMask) != 0; Vector4 vpModifier = applyModifier ? workspace->getViewportModifier() : Vector4( 0, 0, 1, 1 ); Real left = mDefinition->mVpLeft + vpModifier.x; Real top = mDefinition->mVpTop + vpModifier.y; Real width = mDefinition->mVpWidth * vpModifier.z; Real height = mDefinition->mVpHeight * vpModifier.w; Real scLeft = mDefinition->mVpScissorLeft + vpModifier.x; Real scTop = mDefinition->mVpScissorTop + vpModifier.y; Real scWidth = mDefinition->mVpScissorWidth * vpModifier.z; Real scHeight = mDefinition->mVpScissorHeight * vpModifier.w; const unsigned short numViewports = mTarget->getNumViewports(); for( unsigned short i=0; i<numViewports && !mViewport; ++i ) { Viewport *vp = mTarget->getViewport(i); if( Math::Abs( vp->getLeft() - left ) < EPSILON && Math::Abs( vp->getTop() - top ) < EPSILON && Math::Abs( vp->getWidth() - width ) < EPSILON && Math::Abs( vp->getHeight() - height )<EPSILON && Math::Abs( vp->getScissorLeft() - scLeft ) < EPSILON && Math::Abs( vp->getScissorTop() - scTop ) < EPSILON && Math::Abs( vp->getScissorWidth() - scWidth ) < EPSILON && Math::Abs( vp->getScissorHeight() - scHeight )<EPSILON && vp->getColourWrite() == mDefinition->mColourWrite && vp->getReadOnlyDepth() == mDefinition->mReadOnlyDepth && vp->getReadOnlStencil() == mDefinition->mReadOnlyStencil && vp->getOverlaysEnabled() == mDefinition->mIncludeOverlays ) { mViewport = vp; } } if( !mViewport ) { mViewport = mTarget->addViewport( left, top, width, height ); mViewport->setScissors( scLeft, scTop, scWidth, scHeight ); mViewport->setColourWrite( mDefinition->mColourWrite ); mViewport->setReadOnly( mDefinition->mReadOnlyDepth, mDefinition->mReadOnlyStencil ); mViewport->setOverlaysEnabled( mDefinition->mIncludeOverlays ); } populateTextureDependenciesFromExposedTextures(); }