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