void Viewport::applyView( const Viewport& segmentVP, const Viewport& viewVP, const PixelViewport& pvp, const Vector4i& overdraw ) { // part of view covered by segment/view channel Viewport contribution( segmentVP ); contribution.intersect( viewVP ); contribution.transform( viewVP ); // extend by overdraw percentage EQASSERT( pvp.hasArea( )); const float xDelta(( static_cast< float >( overdraw.x() + pvp.w ) / static_cast< float >( pvp.w ) - 1.0f ) * contribution.w ); contribution.x -= xDelta; contribution.w += (( static_cast< float >( overdraw.z() + pvp.w ) / static_cast< float >( pvp.w ) - 1.0f ) * contribution.w ); contribution.w += xDelta; const float yDelta(( static_cast< float >( overdraw.y() + pvp.h ) / static_cast< float >( pvp.h ) - 1.0f ) * contribution.h ); contribution.y -= yDelta; contribution.h += (( static_cast< float >( overdraw.w() + pvp.h ) / static_cast< float >( pvp.h ) - 1.0f ) * contribution.h ); contribution.h += yDelta; x = contribution.x + x * contribution.w; y = contribution.y + y * contribution.h; w *= contribution.w; h *= contribution.h; }
void ROIFinder::_updateSubArea( const uint8_t type ) { LBASSERT( type <= 16 ); if( type == 0 ) return; PixelViewport pvp; switch( type ) { case 1: pvp = PixelViewport( _dim.x1,_dim.y2,_dim.w1,_dim.h2 ); break; case 2: pvp = PixelViewport( _dim.x2,_dim.y3,_dim.w2,_dim.h3 ); break; case 3: pvp = PixelViewport( _dim.x3,_dim.y2,_dim.w3,_dim.h2 ); break; case 4: pvp = PixelViewport( _dim.x2,_dim.y1,_dim.w2,_dim.h1 ); break; case 5: pvp = PixelViewport( _dim.x1,_dim.y1,_dim.w1,_dim.h4 ); break; case 6: pvp = PixelViewport( _dim.x1,_dim.y3,_dim.w4,_dim.h3 ); break; case 7: pvp = PixelViewport( _dim.x3,_dim.y2,_dim.w3,_dim.h5 ); break; case 8: pvp = PixelViewport( _dim.x2,_dim.y1,_dim.w5,_dim.h1 ); break; case 9: pvp = PixelViewport( _dim.x1,_dim.y2,_dim.w1,_dim.h5 ); break; case 10: pvp = PixelViewport( _dim.x2,_dim.y3,_dim.w5,_dim.h3 ); break; case 11: pvp = PixelViewport( _dim.x3,_dim.y1,_dim.w3,_dim.h4 ); break; case 12: pvp = PixelViewport( _dim.x1,_dim.y1,_dim.w4,_dim.h1 ); break; case 13: pvp = PixelViewport( _dim.x1,_dim.y1,_dim.w1,_dim.h6 ); break; case 14: pvp = PixelViewport( _dim.x3,_dim.y1,_dim.w3,_dim.h6 ); break; case 15: pvp = PixelViewport( _dim.x1,_dim.y3,_dim.w6,_dim.h3 ); break; case 16: pvp = PixelViewport( _dim.x1,_dim.y1,_dim.w6,_dim.h1 ); break; default: LBUNIMPLEMENTED; } LBASSERT( pvp.hasArea( )); LBASSERT( pvp.x >=0 && pvp.y >=0 && pvp.x+pvp.w <=_w && pvp.y+pvp.h <=_h ); Area& a = _tmpAreas[type]; a.pvp = _getObjectPVP( pvp, &_mask[0] ); a.hole = _emptyFinder.getLargestEmptyArea( a.pvp ); a.emptySize = pvp.getArea() - a.pvp.getArea() + a.hole.getArea(); #ifndef NDEBUG LBASSERT( !a.valid ); a.valid = true; #endif }
void CompoundUpdateOutputVisitor::_generateTiles( TileQueue* queue, Compound* compound ) { const Vector2i& tileSize = queue->getTileSize(); const PixelViewport pvp = compound->getInheritPixelViewport(); if( !pvp.hasArea( )) return; const Vector2i dim( pvp.w / tileSize.x() + ((pvp.w%tileSize.x()) ? 1 : 0), pvp.h / tileSize.y() + ((pvp.h%tileSize.y()) ? 1 : 0)); std::vector< Vector2i > tiles; tiles.reserve( dim.x() * dim.y() ); tiles::TILE_STRATEGY strategy; strategy( tiles, dim ); _addTilesToQueue( queue, compound, tiles ); }
Images FrameData::startReadback( const Frame& frame, util::ObjectManager& glObjects, const DrawableConfig& config, const PixelViewports& regions ) { if( _impl->data.buffers == Frame::BUFFER_NONE ) return Images(); const Zoom& zoom = frame.getZoom(); if( !zoom.isValid( )) { LBWARN << "Invalid zoom factor, skipping frame" << std::endl; return Images(); } const eq::PixelViewport& framePVP = getPixelViewport(); const PixelViewport absPVP = framePVP + frame.getOffset(); if( !absPVP.isValid( )) return Images(); Images images; // readback the whole screen when using textures if( getType() == eq::Frame::TYPE_TEXTURE ) { Image* image = newImage( getType(), config ); if( image->startReadback( getBuffers(), absPVP, zoom, glObjects )) images.push_back( image ); image->setOffset( 0, 0 ); return images; } //else read only required regions #if 0 // TODO: issue #85: move automatic ROI detection to eq::Channel PixelViewports regions; if( _impl->data.buffers & Frame::BUFFER_DEPTH && zoom == Zoom::NONE ) regions = _impl->roiFinder->findRegions( _impl->data.buffers, absPVP, zoom, frame.getAssemblyStage(), frame.getFrameID(), glObjects); else regions.push_back( absPVP ); #endif LBASSERT( getType() == eq::Frame::TYPE_MEMORY ); const eq::Pixel& pixel = getPixel(); for( uint32_t i = 0; i < regions.size(); ++i ) { PixelViewport pvp = regions[ i ] + frame.getOffset(); pvp.intersect( absPVP ); if( !pvp.hasArea( )) continue; Image* image = newImage( getType(), config ); if( image->startReadback( getBuffers(), pvp, zoom, glObjects )) images.push_back( image ); pvp -= frame.getOffset(); pvp.apply( zoom ); image->setOffset( (pvp.x - framePVP.x) * pixel.w, (pvp.y - framePVP.y) * pixel.h ); } return images; }