Esempio n. 1
0
void PinchViewport::scrollIntoView(const FloatRect& rect)
{
    if (!mainFrame() || !mainFrame()->view())
        return;

    FrameView* view = mainFrame()->view();

    float centeringOffsetX = (visibleRect().width() - rect.width()) / 2;
    float centeringOffsetY = (visibleRect().height() - rect.height()) / 2;

    FloatPoint targetOffset(
        rect.x() - centeringOffsetX - visibleRect().x(),
        rect.y() - centeringOffsetY - visibleRect().y());

    view->setScrollPosition(flooredIntPoint(targetOffset));

    FloatPoint remainder = FloatPoint(targetOffset - view->scrollPosition());
    move(remainder);
}
LayoutRect RootFrameViewport::scrollIntoView(const LayoutRect& rectInContent, const ScrollAlignment& alignX, const ScrollAlignment& alignY)
{
    // We want to move the rect into the viewport that excludes the scrollbars so we intersect
    // the visual viewport with the scrollbar-excluded frameView content rect. However, we don't
    // use visibleContentRect directly since it floors the scroll position. Instead, we use
    // FrameView::scrollPositionDouble and construct a LayoutRect from that (the FrameView size
    // is always integer sized.

    LayoutRect frameRectInContent = LayoutRect(
        layoutViewport().scrollPositionDouble(),
        layoutViewport().visibleContentRect().size());
    LayoutRect visualRectInContent = LayoutRect(
        layoutViewport().scrollPositionDouble() + toDoubleSize(visualViewport().scrollPositionDouble()),
        visualViewport().visibleContentRect().size());

    LayoutRect viewRectInContent = intersection(visualRectInContent, frameRectInContent);
    LayoutRect targetViewport =
        ScrollAlignment::getRectToExpose(viewRectInContent, rectInContent, alignX, alignY);

    // visualViewport.scrollIntoView will attempt to center the given rect within the viewport
    // so to prevent it from adjusting r's coordinates the rect must match the viewport's size
    // i.e. add the subtracted scrollbars from above back in.
    // FIXME: This is hacky and required because getRectToExpose doesn't naturally account
    // for the two viewports. crbug.com/449340.
    targetViewport.setSize(LayoutSize(visualViewport().visibleContentRect().size()));

    // Snap the visible rect to layout units to match the calculated target viewport rect.
    FloatRect visible =
        LayoutRect(visualViewport().scrollPositionDouble(), visualViewport().visibleContentRect().size());

    float centeringOffsetX = (visible.width() - targetViewport.width()) / 2;
    float centeringOffsetY = (visible.height() - targetViewport.height()) / 2;

    DoublePoint targetOffset(
        targetViewport.x() - centeringOffsetX,
        targetViewport.y() - centeringOffsetY);

    setScrollPosition(targetOffset, ProgrammaticScroll);

    // RootFrameViewport only changes the viewport relative to the document so we can't change the input
    // rect's location relative to the document origin.
    return rectInContent;
}
Esempio n. 3
0
void Mission::ThirdPersonCamera::onUpdateActivity(float dt)
{
        assert( _scene );

        _positionModeTimeout -= dt;
        _positionModeTimeout = _positionModeTimeout < 0 ? 0 : _positionModeTimeout;

        // retrieve action channels
        ActionChannel* headLeft  = Gameplay::iGameplay->getActionChannel( iaHeadLeft );
        ActionChannel* headRight = Gameplay::iGameplay->getActionChannel( iaHeadRight );
        ActionChannel* headUp    = Gameplay::iGameplay->getActionChannel( iaHeadUp );
        ActionChannel* headDown  = Gameplay::iGameplay->getActionChannel( iaHeadDown );
        ActionChannel* zoomIn    = Gameplay::iGameplay->getActionChannel( iaZoomIn );
        ActionChannel* zoomOut   = Gameplay::iGameplay->getActionChannel( iaZoomOut );    

        if( _positionMode )
        {
                // field of view
                _cameraFOV = ( 60.0f - 55.0f * ( zoomIn->getAmplitude() ) ) * CAMERA_FOV_MULTIPLIER;

                // target position
                Matrix4f targetPose( 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1 );
                if( _target ) targetPose = _target->getPose();    
                Vector3f targetPos( targetPose[3][0], targetPose[3][1], targetPose[3][2] );

                if( dynamic_cast<Jumper*>( _target ) )
                {
                        Jumper* j = dynamic_cast<Jumper*>( _target );
                        j->getClump()->getFrame()->getLTM();
                        engine::IFrame* backBone = Jumper::getBackBone( j->getClump() );
                        targetPos = backBone->getPos();
                }

                // camera direction
                Vector3f cameraAt = _cameraPos - targetPos;
                cameraAt.normalize();        

                // camera right
                Vector3f cameraRight; 
                cameraRight.cross( Vector3f(0,1,0), cameraAt );
                cameraRight.normalize();

                // camera up
                Vector3f cameraUp;
                cameraUp.cross( cameraAt, cameraRight );
                cameraUp.normalize();

                // camera matrix
                _cameraMatrix.set( 
                        cameraRight[0], cameraRight[1], cameraRight[2], 0.0f,
                        cameraUp[0], cameraUp[1], cameraUp[2], 0.0f,
                        cameraAt[0], cameraAt[1], cameraAt[2], 0.0f,
                        _cameraPos[0], _cameraPos[1], _cameraPos[2], 1.0f
                        );
        }
        else
        {
                // camera offset 
                _cameraDistance -= dt * 500.0f * zoomIn->getAmplitude();
                _cameraDistance += dt * 500.0f * zoomOut->getAmplitude();
                if( _cameraDistance < TPSM_MINIMAL_DISTANCE ) _cameraDistance = TPSM_MINIMAL_DISTANCE;

                // rotate camera    
                _cameraTurn += 180 * dt * headLeft->getAmplitude();
                _cameraTurn -= 180 * dt * headRight->getAmplitude();
                _cameraTilt += 180 * dt * headUp->getAmplitude();
                _cameraTilt -= 180 * dt * headDown->getAmplitude();
                if( _cameraTilt < -89 ) _cameraTilt = -89;
                if( _cameraTilt > 89 ) _cameraTilt = 89;

                Matrix4f targetPose( 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1 );
                if( _target ) targetPose = _target->getPose();

                Vector3f targetPos( targetPose[3][0], targetPose[3][1], targetPose[3][2] );
                Vector3f targetOffset( 0,150,0 );

                if( dynamic_cast<Jumper*>( _target ) )
                {
                        Jumper* j = dynamic_cast<Jumper*>( _target );
                        j->getClump()->getFrame()->getLTM();
                        engine::IFrame* backBone = Jumper::getBackBone( j->getClump() );
                        targetPos = backBone->getPos();
                        targetOffset.set( 0,75, 0 );
                }

                // calculate camera matrix        
                _cameraMatrix.set( 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1 );
                _cameraMatrix = Gameplay::iEngine->rotateMatrix( _cameraMatrix, Vector3f( 1,0,0 ), _cameraTilt );
                _cameraMatrix = Gameplay::iEngine->rotateMatrix( _cameraMatrix, Vector3f( 0,1,0 ), _cameraTurn );
                Vector3f at( _cameraMatrix[2][0], _cameraMatrix[2][1], _cameraMatrix[2][2] );

                // possible camera position
                Vector3f cameraPos = targetPos + targetOffset + at * _cameraDistance;

                // clip camera distance
                float clipDistance = _cameraDistance;
                if( _scene->clipCameraRay( targetPos, cameraPos, clipDistance ) )
                {
                        _cameraDistance = clipDistance;
                        cameraPos = targetPos + targetOffset + at * _cameraDistance;
                }        

                // finalize camera matrix (translation component)
                _cameraMatrix = Gameplay::iEngine->translateMatrix( _cameraMatrix, cameraPos );
        }

        // camera is actual now
        Gameplay::iEngine->getDefaultCamera()->setFOV( _cameraFOV );
        Gameplay::iEngine->getDefaultCamera()->getFrame()->setMatrix( _cameraMatrix );
        _scene->getScenery()->happen( this, EVENT_CAMERA_IS_ACTUAL );
        if( _scene->getTopMode() ) _scene->getTopMode()->happen( this, EVENT_CAMERA_IS_ACTUAL );

        // RT-RS pass
        bool flares = ( _scene->getLocation()->getWeather() == ::wtSunny ) || ( _scene->getLocation()->getWeather() == ::wtVariable );
        Gameplay::iGameplay->getRenderTarget()->render( _scene, _cameraMatrix, _cameraFOV, flares, false );
        // GUI
        Gameplay::iEngine->getDefaultCamera()->beginScene( 0, Vector4f( 0,0,0,0 ) );    
        if( _scene->isHUDEnabled() ) Gameplay::iGui->render();
        Gameplay::iEngine->getDefaultCamera()->endScene();
        // present result
        Gameplay::iEngine->present();
}