static bool IsB1OnClockwiseDirOfB2AtEnd()

in UVAtlas/isochart/packingcharts.cpp [908:1037]


    static bool IsB1OnClockwiseDirOfB2AtEnd(
        VERTEX_ARRAY& border1,
        VERTEX_ARRAY& border2,
        bool& bIsDecided,
        float& fDotValue)
    {
        assert(border1[border1.size() - 1] ==
            border2[border2.size() - 1]);

        assert(border1.size() > 1);
        assert(border2.size() > 1);

        if (border1.size() <= 1 || border2.size() <= 1)
        {
            return false;
        }

        bIsDecided = true;
        size_t i = border1.size() - 2;
        size_t j = border2.size() - 2;
        float fZ = 0;
        ISOCHARTVERTEX* pOrigin = border1[border1.size() - 1];
        for (;;)
        {
            ISOCHARTVERTEX* pVertex1 = border1[i];
            ISOCHARTVERTEX* pVertex2 = border2[j];

            XMVECTOR vv1 = XMVectorSet(
                pVertex1->uv.x - pOrigin->uv.x,
                pVertex1->uv.y - pOrigin->uv.y,
                0, 0);

            XMVECTOR vv2 = XMVectorSet(
                pVertex2->uv.x - pOrigin->uv.x,
                pVertex2->uv.y - pOrigin->uv.y,
                0, 0);

            float f1 = XMVectorGetX(XMVector3LengthSq(vv1));
            float f2 = XMVectorGetX(XMVector3LengthSq(vv2));

            if (IsInZeroRange(f1) || IsInZeroRange(f2))
            {
                fZ = 0;
                fDotValue = 1;
            }
            else
            {
                vv1 = XMVector3Normalize(vv1);
                vv2 = XMVector3Normalize(vv2);
                fDotValue = XMVectorGetX(XMVector3Dot(vv1, vv2));
                XMFLOAT3 v1, v2;
                XMStoreFloat3(&v1, vv1);
                XMStoreFloat3(&v2, vv2);

                if (IsInZeroRange(v1.x) && IsInZeroRange(v2.x)
                    && fabsf(v1.y) > 0.1f && fabsf(v2.y) > 0.1f
                    && v1.y * v2.y < 0)
                {
                    if (v1.y > v2.y)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }

                if (IsInZeroRange(v1.y) && IsInZeroRange(v2.y)
                    && fabsf(v1.x) > 0.1f && fabsf(v2.x) > 0.1f
                    && v1.x * v2.x < 0)
                {
                    if (v1.x < v2.x)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }

                fZ = CalculateZOfVec3Cross(&v1, &v2);
            }
            // pOrigin, pVertex1, pVertex2 in the same line,
            // need to move origin forward, and Calculate again
            if (fabsf(fZ) < ISOCHART_ZERO_EPS)
            {
                if (f1 < f2)
                {
                    pOrigin = border1[i];
                    if (i > 0) i--;
                    else break;
                }
                else if (f1 > f2)
                {
                    pOrigin = border2[j];
                    if (j > 0) j--;
                    else break;
                }
                else
                {
                    if (i > 0) i--;
                    else break;

                    if (j > 0) j--;
                    else break;
                    pOrigin = border1[i];
                }
            }
            else
            {
                break;
            }
        }

        if (fZ > ISOCHART_ZERO_EPS)
        {
            return false;
        }
        else if (fZ < -ISOCHART_ZERO_EPS)
        {
            return true;
        }
        else
        {
            bIsDecided = false;
            return true;
        }
    }