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