void CFVec4::SetXYZ( CFVec3Arg fv3Source ) { const XMVECTOR& v3V = *reinterpret_cast<const XMVECTOR*>( &fv3Source ); XMVECTOR& v4V = *reinterpret_cast<XMVECTOR*>(this); v4V = XMVectorSetX( v4V, XMVectorGetX( v3V ) ); v4V = XMVectorSetY( v4V, XMVectorGetY( v3V ) ); v4V = XMVectorSetZ( v4V, XMVectorGetZ( v3V ) ); }
void CFVec4::Z( FLOAT32 fVal ) { XMVECTOR& V4 = *reinterpret_cast<XMVECTOR*>(this); V4 = XMVectorSetZ( V4, fVal ); }
void CFVec4::ZAdd( FLOAT32 fVal ) { XMVECTOR& v4V = *reinterpret_cast<XMVECTOR*>(this); v4V = XMVectorSetZ( v4V, XMVectorGetZ( v4V ) + fVal ); }
void Frustum::CreateFrustum(float screenDepth, XMMATRIX viewMatrix, XMMATRIX projMatrix) { float zMinimum, r; XMFLOAT4X4 projMatrixFloat; XMFLOAT4X4 frustumMatrix; XMStoreFloat4x4(&projMatrixFloat, projMatrix); // Calculate the minimum Z distance in the frustum. zMinimum = -projMatrixFloat._43 / projMatrixFloat._33; r = screenDepth / (screenDepth - zMinimum); projMatrixFloat._33 = r; projMatrixFloat._43 = -r * zMinimum; XMMATRIX updatedProjMatrix = XMLoadFloat4x4(&projMatrixFloat); //Create the frustum from the viewMatrix and updated projectionMatrix XMStoreFloat4x4(&frustumMatrix, XMMatrixMultiply(viewMatrix, updatedProjMatrix)); ; //Calculate near plane of frustum XMVectorSetX(this->planes[0], frustumMatrix._14 + frustumMatrix._13); XMVectorSetY(this->planes[0], frustumMatrix._24 + frustumMatrix._23); XMVectorSetZ(this->planes[0], frustumMatrix._34 + frustumMatrix._33); XMVectorSetW(this->planes[0], frustumMatrix._44 + frustumMatrix._43); this->planes[0] = XMPlaneNormalize(this->planes[0]); //this->planes[0] = XMVector3Normalize(this->planes[0]); //Calculate far plane of frustum XMVectorSetX(this->planes[1], frustumMatrix._14 - frustumMatrix._13); XMVectorSetY(this->planes[1], frustumMatrix._24 - frustumMatrix._23); XMVectorSetZ(this->planes[1], frustumMatrix._34 - frustumMatrix._33); XMVectorSetW(this->planes[1], frustumMatrix._44 - frustumMatrix._43); this->planes[1] = XMPlaneNormalize(this->planes[1]); //this->planes[1] = XMVector3Normalize(this->planes[1]); //Calculate left plane of frustum XMVectorSetX(this->planes[2], frustumMatrix._14 + frustumMatrix._11); XMVectorSetY(this->planes[2], frustumMatrix._24 + frustumMatrix._21); XMVectorSetZ(this->planes[2], frustumMatrix._34 + frustumMatrix._31); XMVectorSetW(this->planes[2], frustumMatrix._44 + frustumMatrix._41); this->planes[2] = XMPlaneNormalize(this->planes[2]); //this->planes[2] = XMVector3Normalize(this->planes[2]); //Calculate right plane of frustum XMVectorSetX(this->planes[3], frustumMatrix._14 - frustumMatrix._11); XMVectorSetY(this->planes[3], frustumMatrix._24 - frustumMatrix._21); XMVectorSetZ(this->planes[3], frustumMatrix._34 - frustumMatrix._31); XMVectorSetW(this->planes[3], frustumMatrix._44 - frustumMatrix._41); this->planes[3] = XMPlaneNormalize(this->planes[3]); //this->planes[3] = XMVector3Normalize(this->planes[3]); //Calculate top plane of frustum XMVectorSetX(this->planes[4], frustumMatrix._14 - frustumMatrix._12); XMVectorSetY(this->planes[4], frustumMatrix._24 - frustumMatrix._22); XMVectorSetZ(this->planes[4], frustumMatrix._34 - frustumMatrix._32); XMVectorSetW(this->planes[4], frustumMatrix._44 - frustumMatrix._42); this->planes[4] = XMPlaneNormalize(this->planes[4]); //this->planes[4] = XMVector3Normalize(this->planes[4]); //Calculate bottom plane of frustum XMVectorSetX(this->planes[5], frustumMatrix._14 + frustumMatrix._12); XMVectorSetY(this->planes[5], frustumMatrix._24 + frustumMatrix._22); XMVectorSetZ(this->planes[5], frustumMatrix._34 + frustumMatrix._32); XMVectorSetW(this->planes[5], frustumMatrix._44 + frustumMatrix._42); this->planes[5] = XMPlaneNormalize(this->planes[5]); //this->planes[5] = XMVector3Normalize(this->planes[5]); /*for (int i = 0; i < 6; i++) { float denom = 1.0f / XMVectorGetX(XMVector3Length(this->planes[i])); XMVectorSetX(this->planes[i], XMVectorGetX(this->planes[i]) * denom); XMVectorSetY(this->planes[i], XMVectorGetY(this->planes[i]) * denom); XMVectorSetZ(this->planes[i], XMVectorGetZ(this->planes[i]) * denom); XMVectorSetW(this->planes[i], XMVectorGetW(this->planes[i]) * denom); }*/ return; }