in Inc/DirectXCollision.inl [260:352]
inline bool CalculateEigenVectors(_In_ float m11, _In_ float m12, _In_ float m13,
_In_ float m22, _In_ float m23, _In_ float m33,
_In_ float e1, _In_ float e2, _In_ float e3,
_Out_ XMVECTOR* pV1, _Out_ XMVECTOR* pV2, _Out_ XMVECTOR* pV3) noexcept
{
*pV1 = DirectX::Internal::CalculateEigenVector(m11, m12, m13, m22, m23, m33, e1);
*pV2 = DirectX::Internal::CalculateEigenVector(m11, m12, m13, m22, m23, m33, e2);
*pV3 = DirectX::Internal::CalculateEigenVector(m11, m12, m13, m22, m23, m33, e3);
bool v1z = false;
bool v2z = false;
bool v3z = false;
XMVECTOR Zero = XMVectorZero();
if (XMVector3Equal(*pV1, Zero))
v1z = true;
if (XMVector3Equal(*pV2, Zero))
v2z = true;
if (XMVector3Equal(*pV3, Zero))
v3z = true;
bool e12 = (fabsf(XMVectorGetX(XMVector3Dot(*pV1, *pV2))) > 0.1f); // check for non-orthogonal vectors
bool e13 = (fabsf(XMVectorGetX(XMVector3Dot(*pV1, *pV3))) > 0.1f);
bool e23 = (fabsf(XMVectorGetX(XMVector3Dot(*pV2, *pV3))) > 0.1f);
if ((v1z && v2z && v3z) || (e12 && e13 && e23) ||
(e12 && v3z) || (e13 && v2z) || (e23 && v1z)) // all eigenvectors are 0- any basis set
{
*pV1 = g_XMIdentityR0.v;
*pV2 = g_XMIdentityR1.v;
*pV3 = g_XMIdentityR2.v;
return true;
}
if (v1z && v2z)
{
XMVECTOR vTmp = XMVector3Cross(g_XMIdentityR1, *pV3);
if (XMVectorGetX(XMVector3LengthSq(vTmp)) < 1e-5f)
{
vTmp = XMVector3Cross(g_XMIdentityR0, *pV3);
}
*pV1 = XMVector3Normalize(vTmp);
*pV2 = XMVector3Cross(*pV3, *pV1);
return true;
}
if (v3z && v1z)
{
XMVECTOR vTmp = XMVector3Cross(g_XMIdentityR1, *pV2);
if (XMVectorGetX(XMVector3LengthSq(vTmp)) < 1e-5f)
{
vTmp = XMVector3Cross(g_XMIdentityR0, *pV2);
}
*pV3 = XMVector3Normalize(vTmp);
*pV1 = XMVector3Cross(*pV2, *pV3);
return true;
}
if (v2z && v3z)
{
XMVECTOR vTmp = XMVector3Cross(g_XMIdentityR1, *pV1);
if (XMVectorGetX(XMVector3LengthSq(vTmp)) < 1e-5f)
{
vTmp = XMVector3Cross(g_XMIdentityR0, *pV1);
}
*pV2 = XMVector3Normalize(vTmp);
*pV3 = XMVector3Cross(*pV1, *pV2);
return true;
}
if ((v1z) || e12)
{
*pV1 = XMVector3Cross(*pV2, *pV3);
return true;
}
if ((v2z) || e23)
{
*pV2 = XMVector3Cross(*pV3, *pV1);
return true;
}
if ((v3z) || e13)
{
*pV3 = XMVector3Cross(*pV1, *pV2);
return true;
}
return true;
}