| 1499 | static void GetEdge(int * i0_out, int * i1_out, int * edgenum_out, const int indices[], const int i0_in, const int i1_in); |
| 1500 | |
| 1501 | static void BuildNeighborsFast(STriInfo pTriInfos[], SEdge * pEdges, const int piTriListIn[], const int iNrTrianglesIn) |
| 1502 | { |
| 1503 | // build array of edges |
| 1504 | unsigned int uSeed = INTERNAL_RND_SORT_SEED; // could replace with a random seed? |
| 1505 | int iEntries=0, iCurStartIndex=-1, f=0, i=0; |
| 1506 | for (f=0; f<iNrTrianglesIn; f++) |
| 1507 | for (i=0; i<3; i++) |
| 1508 | { |
| 1509 | const int i0 = piTriListIn[f*3+i]; |
| 1510 | const int i1 = piTriListIn[f*3+(i<2?(i+1):0)]; |
| 1511 | pEdges[f*3+i].i0 = i0 < i1 ? i0 : i1; // put minimum index in i0 |
| 1512 | pEdges[f*3+i].i1 = !(i0 < i1) ? i0 : i1; // put maximum index in i1 |
| 1513 | pEdges[f*3+i].f = f; // record face number |
| 1514 | } |
| 1515 | |
| 1516 | // sort over all edges by i0, this is the pricy one. |
| 1517 | QuickSortEdges(pEdges, 0, iNrTrianglesIn*3-1, 0, uSeed); // sort channel 0 which is i0 |
| 1518 | |
| 1519 | // sub sort over i1, should be fast. |
| 1520 | // could replace this with a 64 bit int sort over (i0,i1) |
| 1521 | // with i0 as msb in the quicksort call above. |
| 1522 | iEntries = iNrTrianglesIn*3; |
| 1523 | iCurStartIndex = 0; |
| 1524 | for (i=1; i<iEntries; i++) |
| 1525 | { |
| 1526 | if (pEdges[iCurStartIndex].i0 != pEdges[i].i0) |
| 1527 | { |
| 1528 | const int iL = iCurStartIndex; |
| 1529 | const int iR = i-1; |
| 1530 | //const int iElems = i-iL; |
| 1531 | iCurStartIndex = i; |
| 1532 | QuickSortEdges(pEdges, iL, iR, 1, uSeed); // sort channel 1 which is i1 |
| 1533 | } |
| 1534 | } |
| 1535 | |
| 1536 | // sub sort over f, which should be fast. |
| 1537 | // this step is to remain compliant with BuildNeighborsSlow() when |
| 1538 | // more than 2 triangles use the same edge (such as a butterfly topology). |
| 1539 | iCurStartIndex = 0; |
| 1540 | for (i=1; i<iEntries; i++) |
| 1541 | { |
| 1542 | if (pEdges[iCurStartIndex].i0 != pEdges[i].i0 || pEdges[iCurStartIndex].i1 != pEdges[i].i1) |
| 1543 | { |
| 1544 | const int iL = iCurStartIndex; |
| 1545 | const int iR = i-1; |
| 1546 | //const int iElems = i-iL; |
| 1547 | iCurStartIndex = i; |
| 1548 | QuickSortEdges(pEdges, iL, iR, 2, uSeed); // sort channel 2 which is f |
| 1549 | } |
| 1550 | } |
| 1551 | |
| 1552 | // pair up, adjacent triangles |
| 1553 | for (i=0; i<iEntries; i++) |
| 1554 | { |
| 1555 | const int i0=pEdges[i].i0; |
| 1556 | const int i1=pEdges[i].i1; |
| 1557 | const int f = pEdges[i].f; |
| 1558 | tbool bUnassigned_A; |
no test coverage detected