inline bool CalculateEigenVectors()

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