Ejemplo n.º 1
0
    //------------------------------------------------------------------------------
    //------------------------------------------------------------------------------
    Ray CameraComponent::Unproject(const Vector2 &invScreenPos)
    {
        Matrix4 matProj = Matrix4::Inverse((GetView() * GetProjection()));
        
        Vector2 vScreenSize = m_screen->GetResolution();
        //Normalise the screen space co-ordinates into clip space
        f32 nx = ((2.0f * (invScreenPos.x/vScreenSize.x)) - 1.0f);
        f32 ny = ((2.0f * (invScreenPos.y/vScreenSize.y)) - 1.0f);
        
        Vector4 vNear(nx, ny, -1.0f, 1.0f);
        Vector4 vFar(nx,ny, 1.0f, 1.0f);
        vNear = vNear * matProj;
        vFar = vFar * matProj;
        
        Ray cRay;
        
        vNear /= vNear.w;
        cRay.vOrigin = Vector3(vNear.x, vNear.y, vNear.z);

        vFar /= vFar.w;
        cRay.vDirection = Vector3(vFar.x, vFar.y, vFar.z) - cRay.vOrigin;
        
        cRay.fLength = cRay.vDirection.Length();
        cRay.vDirection /= cRay.fLength;
        
        return cRay;
    }
Ejemplo n.º 2
0
void TSRFrustum::ComputeFrustumPointsForProjectionMatrix( TSRMatrix4& _projection, TSRVector4* _pvCornerPointsWorld, float _fCascadeIntervalBegin, float _fCascadeIntervalEnd )
{

    TSRCascadeFrustum vViewFrust;
    vViewFrust.ComputeFrustumFromProjection( &_projection );
    vViewFrust.m_fNear = _fCascadeIntervalBegin;
    vViewFrust.m_fFar = _fCascadeIntervalEnd;

    static const unsigned int vGrabY[] = { 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000 };
    static const unsigned int vGrabX[] = { 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000 };

    TSRVector4 vRightTop( vViewFrust.m_fRightSlope, vViewFrust.m_fTopSlope, 1.0f, 1.0f );
    TSRVector4 vLeftBottom( vViewFrust.m_fLeftSlope, vViewFrust.m_fBottomSlope, 1.0f, 1.0f );
    TSRVector4 vNear( vViewFrust.m_fNear, vViewFrust.m_fNear, vViewFrust.m_fNear, 1.0f );
    TSRVector4 vFar( vViewFrust.m_fFar, vViewFrust.m_fFar, vViewFrust.m_fFar, 1.0f );

    TSRVector4 vRightTopNear = vRightTop * vNear;
    TSRVector4 vRightTopFar = vRightTop * vFar;
    TSRVector4 vLeftBottomNear = vLeftBottom * vNear;
    TSRVector4 vLeftBottomFar = vLeftBottom * vFar;

    _pvCornerPointsWorld[ 0 ] = vRightTopNear;
    _pvCornerPointsWorld[ 1 ] = Vector4SelectWithMask( vRightTopNear, vLeftBottomNear, vGrabX );
    _pvCornerPointsWorld[ 2 ] = vLeftBottomNear;
    _pvCornerPointsWorld[ 3 ] = Vector4SelectWithMask( vRightTopNear, vLeftBottomNear,vGrabY );

    _pvCornerPointsWorld[ 4 ] = vRightTopFar;
    _pvCornerPointsWorld[ 5 ] = Vector4SelectWithMask( vRightTopFar, vLeftBottomFar, vGrabX );
    _pvCornerPointsWorld[ 6 ] = vLeftBottomFar;
    _pvCornerPointsWorld[ 7 ] = Vector4SelectWithMask( vRightTopFar ,vLeftBottomFar, vGrabY );

}