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] = -1; edgeCount++; edge++; } if (i2 < i3) { edge->vertexIndex[0] = i2; edge->vertexIndex[1] = i3; edge->triangleIndex[0] = a; edge->triangleIndex[1] = -1; edgeCount++; edge++; } if (i3 < i1) { edge->vertexIndex[0] = i3; edge->vertexIndex[1] = i1; edge->triangleIndex[0] = a; edge->triangleIndex[1] = -1; 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[1] == -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[1] == -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[1] == -1)) { edge->triangleIndex[1] = a; break; } edge++; } } triangle++; } return (edgeCount); }