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( )); }
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( )); }
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( )); }