inline XMVECTOR CalculateEigenVector()

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