예제 #1
0
파일: Channel.cpp 프로젝트: hernando/Livre
    void frameAssemble( const eq::Frames& frames )
    {
        eq::PixelViewport coveredPVP;
        eq::Frames dbFrames;

        // Make sure all frames are ready and gather some information on them
        prepareFramesAndSetPvp( frames, dbFrames, coveredPVP );
        coveredPVP.intersect( _channel->getPixelViewport( ));

        if( dbFrames.empty() || !coveredPVP.hasArea( ))
            return;

        if( useDBSelfAssemble( )) // add self to determine ordering
        {
            eq::FrameDataPtr data = _frame.getFrameData();
            _frame.clear( );
            _frame.setOffset( eq::Vector2i( 0, 0 ));
            data->setRange( _drawRange );
            data->setPixelViewport( coveredPVP );
            dbFrames.push_back( &_frame );
        }

        orderFrames( dbFrames, computeModelView( ));

        if( useDBSelfAssemble( )) // read back self frame
        {
            if( dbFrames.front() == &_frame ) // OPT: first in framebuffer!
                dbFrames.erase( dbFrames.begin( ));
            else
            {
                _frame.readback( _channel->getObjectManager(),
                                 _channel->getDrawableConfig(),
                                 _channel->getRegions( ));
                clearViewport( coveredPVP );
                // offset for assembly
                _frame.setOffset( eq::Vector2i( coveredPVP.x, coveredPVP.y ));
            }
        }

        LBINFO << "Frame order: ";
        for( const eq::Frame* frame : dbFrames )
            LBINFO << frame->getName() <<  " "
                   << frame->getFrameData()->getRange() << " : ";
        LBINFO << std::endl;

        try // blend DB frames in computed order
        {
            eq::Compositor::blendFrames( dbFrames, _channel, 0 );
        }
        catch( const std::exception& e )
        {
            LBWARN << e.what() << std::endl;
        }

        // Update draw range
        for( size_t i = 0; i < dbFrames.size(); ++i )
            _drawRange.merge( dbFrames[i]->getRange( ));
    }
예제 #2
0
void Channel::_orderFrames( eq::Frames& frames )
{
    eq::Matrix4f        modelviewM;   // modelview matrix
    eq::Matrix3f        modelviewITM; // modelview inversed transposed matrix
    const FrameData&    frameData = _getFrameData();
    const eq::Matrix4f& rotation  = frameData.getRotation();

    if( !useOrtho( ))
        _calcMVandITMV( modelviewM, modelviewITM );

    orderFrames( frames, modelviewM, modelviewITM, rotation, useOrtho( ));
}
예제 #3
0
void Channel::_orderFrames( eq::Frames& frames )
{
    const FrameData&    frameData = _getFrameData();
    const eq::Matrix4f& rotation  = frameData.getRotation();

    const eq::Matrix4f& modelView = useOrtho() ? eq::Matrix4f::IDENTITY :
                                                 _computeModelView();

    //calculate modelview inversed transposed matrix
    eq::Matrix3f modelviewITM;
    eq::Matrix4f modelviewIM;
    modelView.inverse( modelviewIM );
    eq::Matrix3f( modelviewIM ).transpose_to( modelviewITM );

    orderFrames( frames, modelView, modelviewITM, rotation, useOrtho( ));
}