struct Edge
{
unsigned short vertexIndex[2];
unsigned short triangleIndex[2];
};
struct Triangle
{
unsigned short index[3];
};
long BuildEdges(long triangleCount,
const Triangle *triangleArray, Edge **edgeArray)
{
// Allocate enough space to hold all edges
*edgeArray = new Edge[triangleCount * 3];
long edgeCount = 0;
Edge *edge = *edgeArray;
// First pass: find edges
const Triangle *triangle = triangleArray;
for (long a = 0; a < triangleCount; a++)
{
long i1 = triangle->index[0];
long i2 = triangle->index[1];
long i3 = triangle->index[2];
if (i1 < i2)
{
edge->vertexIndex[0] = i1;
edge->vertexIndex[1] = i2;
edge->triangleIndex[0] = a;
edge->triangleIndex[1] = a;
edgeCount++;
edge++;
}
if (i2 < i3)
{
edge->vertexIndex[0] = i2;
edge->vertexIndex[1] = i3;
edge->triangleIndex[0] = a;
edge->triangleIndex[1] = a;
edgeCount++;
edge++;
}
if (i3 < i1)
{
edge->vertexIndex[0] = i3;
edge->vertexIndex[1] = i1;
edge->triangleIndex[0] = a;
edge->triangleIndex[1] = a;
edgeCount++;
edge++;
}
triangle++;
}
// Second pass: match triangles to edges
triangle = triangleArray;
for (long a = 0; a < triangleCount; a++)
{
long i1 = triangle->index[0];
long i2 = triangle->index[1];
long i3 = triangle->index[2];
if (i1 > i2)
{
edge = *edgeArray;
for (long b = 0; b < edgeCount; b++)
{
if ((edge->vertexIndex[0] == i2) &&
(edge->vertexIndex[1] == i1) &&
(edge->triangleIndex[0] != edge->triangleIndex[1]))
{
edge->triangleIndex[1] = a;
break;
}
edge++;
}
}
if (i2 > i3)
{
edge = *edgeArray;
for (long b = 0; b < edgeCount; b++)
{
if ((edge->vertexIndex[0] == i3) &&
(edge->vertexIndex[1] == i2) &&
(edge->triangleIndex[0] != edge->triangleIndex[1]))
{
edge->triangleIndex[1] = a;
break;
}
edge++;
}
}
if (i3 > i1)
{
edge = *edgeArray;
for (long b = 0; b < edgeCount; b++)
{
if ((edge->vertexIndex[0] == i1) &&
(edge->vertexIndex[1] == i3) &&
(edge->triangleIndex[0] != edge->triangleIndex[1]))
{
edge->triangleIndex[1] = a;
break;
}
edge++;
}
}
triangle++;
}
return (edgeCount);
}
Visit http://www.terathon.com for information about the book and the C4 Engine.












