void CUVAtlasRepacker::UpdateSpaceInfo()

in UVAtlas/isochart/UVAtlasRepacker.cpp [1657:1764]


void CUVAtlasRepacker::UpdateSpaceInfo(int direction)
{
    int minX = (m_chartFromX < m_fromX) ? m_chartFromX : m_fromX;
    int minY = (m_chartFromY < m_fromY) ? m_chartFromY : m_fromY;
    int maxX = (m_chartToX > m_toX) ? m_chartToX : m_toX;
    int maxY = (m_chartToY > m_toY) ? m_chartToY : m_toY;

    switch (direction)
    {
    case UV_UPSIDE:
        if (m_chartFromY < m_fromY) {
            for (int i = m_fromX; i < m_chartFromX; i++)
                m_SpaceInfo[UV_UPSIDE][size_t(i)] += m_fromY - m_chartFromY;
            for (int i = m_chartToX; i < m_toX; i++)
                m_SpaceInfo[UV_UPSIDE][size_t(i)] += m_fromY - m_chartFromY;
        }
        for (int i = m_chartFromX; i < m_chartToX; i++)
        {
            int j = minY;
            while (j < maxY && m_UVBoard[size_t(j++)][size_t(i)] == 0);
            m_SpaceInfo[UV_UPSIDE][size_t(i)] = j - minY - 1;
        }
        for (int i = m_chartFromY; i < m_chartToY; i++)
        {
            int j = minX;
            while (j < maxX && m_UVBoard[size_t(i)][size_t(j++)] == 0);
            m_SpaceInfo[UV_LEFTSIDE][size_t(i)] = j - minX - 1;
            j = maxX;
            while (j > minX&& m_UVBoard[size_t(i)][size_t(--j)] == 0);
            m_SpaceInfo[UV_RIGHTSIDE][size_t(i)] = maxX - j - 1;
        }
        break;
    case UV_DOWNSIDE:
        if (m_toY < m_chartToY) {
            for (int i = m_fromX; i < m_chartFromX; i++)
                m_SpaceInfo[UV_DOWNSIDE][size_t(i)] += m_chartToY - m_toY;
            for (int i = m_chartToX; i < m_toX; i++)
                m_SpaceInfo[UV_DOWNSIDE][size_t(i)] += m_chartToY - m_toY;
        }
        for (int i = m_chartFromX; i < m_chartToX; i++)
        {
            int j = maxY;
            while (j > minY&& m_UVBoard[size_t(--j)][size_t(i)] == 0);
            m_SpaceInfo[UV_DOWNSIDE][size_t(i)] = maxY - j - 1;
        }
        for (int i = m_chartFromY; i < m_chartToY; i++)
        {
            int j = minX;
            while (j < maxX && m_UVBoard[size_t(i)][size_t(j++)] == 0);
            m_SpaceInfo[UV_LEFTSIDE][size_t(i)] = j - minX - 1;
            j = maxX;
            while (j > minX&& m_UVBoard[size_t(i)][size_t(--j)] == 0);
            m_SpaceInfo[UV_RIGHTSIDE][size_t(i)] = maxX - j - 1;
        }
        break;
    case UV_LEFTSIDE:
        if (m_chartFromX < m_fromX) {
            for (int i = m_fromY; i < m_chartFromY; i++)
                m_SpaceInfo[UV_LEFTSIDE][size_t(i)] += m_fromX - m_chartFromX;
            for (int i = m_chartToY; i < m_toY; i++)
                m_SpaceInfo[UV_LEFTSIDE][size_t(i)] += m_fromX - m_chartFromX;
        }
        for (int i = m_chartFromY; i < m_chartToY; i++)
        {
            int j = minX;
            while (j < maxX && m_UVBoard[size_t(i)][size_t(j++)] == 0);
            m_SpaceInfo[UV_LEFTSIDE][size_t(i)] = j - minX - 1;
        }
        for (int i = m_chartFromX; i < m_chartToX; i++)
        {
            int j = minY;
            while (j < maxY && m_UVBoard[size_t(j++)][size_t(i)] == 0);
            m_SpaceInfo[UV_UPSIDE][size_t(i)] = j - minY - 1;
            j = maxY;
            while (j > minY&& m_UVBoard[size_t(--j)][size_t(i)] == 0);
            m_SpaceInfo[UV_DOWNSIDE][size_t(i)] = maxY - j - 1;
        }
        break;
    case UV_RIGHTSIDE:
        if (m_chartToX > m_toX) {
            for (int i = m_fromY; i < m_chartFromY; i++)
                m_SpaceInfo[UV_RIGHTSIDE][size_t(i)] += m_chartToX - m_toX;
            for (int i = m_chartToY; i < m_toY; i++)
                m_SpaceInfo[UV_RIGHTSIDE][size_t(i)] += m_chartToX - m_toX;
        }
        for (int i = m_chartFromY; i < m_chartToY; i++)
        {
            int j = maxX;
            while (j > minX&& m_UVBoard[size_t(i)][size_t(--j)] == 0);
            m_SpaceInfo[UV_RIGHTSIDE][size_t(i)] = maxX - j - 1;
        }
        for (int i = m_chartFromX; i < m_chartToX; i++)
        {
            int j = minY;
            while (j < maxY && m_UVBoard[size_t(j++)][size_t(i)] == 0);
            m_SpaceInfo[UV_UPSIDE][size_t(i)] = j - minY - 1;
            j = maxY;
            while (j > minY&& m_UVBoard[size_t(--j)][size_t(i)] == 0);
            m_SpaceInfo[UV_DOWNSIDE][size_t(i)] = maxY - j - 1;
        }
        break;
    }

    m_fromX = minX;
    m_fromY = minY;
    m_toX = maxX;
    m_toY = maxY;
}