in Inc/DirectXCollision.inl [191:257]
inline XMVECTOR CalculateEigenVector(_In_ float m11, _In_ float m12, _In_ float m13,
_In_ float m22, _In_ float m23, _In_ float m33, _In_ float e) noexcept
{
float fTmp[3];
fTmp[0] = m12 * m23 - m13 * (m22 - e);
fTmp[1] = m13 * m12 - m23 * (m11 - e);
fTmp[2] = (m11 - e) * (m22 - e) - m12 * m12;
XMVECTOR vTmp = XMLoadFloat3(reinterpret_cast<const XMFLOAT3*>(fTmp));
if (XMVector3Equal(vTmp, XMVectorZero())) // planar or linear
{
float f1, f2, f3;
// we only have one equation - find a valid one
if ((m11 - e != 0) || (m12 != 0) || (m13 != 0))
{
f1 = m11 - e; f2 = m12; f3 = m13;
}
else if ((m12 != 0) || (m22 - e != 0) || (m23 != 0))
{
f1 = m12; f2 = m22 - e; f3 = m23;
}
else if ((m13 != 0) || (m23 != 0) || (m33 - e != 0))
{
f1 = m13; f2 = m23; f3 = m33 - e;
}
else
{
// error, we'll just make something up - we have NO context
f1 = 1.0f; f2 = 0.0f; f3 = 0.0f;
}
if (f1 == 0)
vTmp = XMVectorSetX(vTmp, 0.0f);
else
vTmp = XMVectorSetX(vTmp, 1.0f);
if (f2 == 0)
vTmp = XMVectorSetY(vTmp, 0.0f);
else
vTmp = XMVectorSetY(vTmp, 1.0f);
if (f3 == 0)
{
vTmp = XMVectorSetZ(vTmp, 0.0f);
// recalculate y to make equation work
if (m12 != 0)
vTmp = XMVectorSetY(vTmp, -f1 / f2);
}
else
{
vTmp = XMVectorSetZ(vTmp, (f2 - f1) / f3);
}
}
if (XMVectorGetX(XMVector3LengthSq(vTmp)) > 1e-5f)
{
return XMVector3Normalize(vTmp);
}
else
{
// Multiply by a value large enough to make the vector non-zero.
vTmp = XMVectorScale(vTmp, 1e5f);
return XMVector3Normalize(vTmp);
}
}