Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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 );
}
Ejemplo n.º 4
0
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;
}