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