Exemplo n.º 1
0
    //-----------------------------------------------------------------------------------
    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 );
            }
        }
    }
Exemplo n.º 2
0
    //-----------------------------------------------------------------------------------
    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 );
            }
        }
    }
Exemplo n.º 3
0
    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 );
        }
    }
Exemplo n.º 4
0
 //-----------------------------------------------------------------------------------
 void CompositorPass::notifyDestroyed( const CompositorChannel &channel )
 {
     if( mTarget == calculateRenderTarget( mDefinition->getRtIndex(), channel ) )
         mTarget = 0;
 }
Exemplo n.º 5
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();
    }