void QSortFaces (int left, int right) { int l = left, r = right; tFaceRef *pf = faceRef [0]; CSegFace m = *pf [(l + r) / 2].faceP; do { while (QCmpFaces (pf [l].faceP, &m) < 0) l++; while (QCmpFaces (pf [r].faceP, &m) > 0) r--; if (l <= r) { if (l < r) { tFaceRef h = pf [l]; pf [l] = pf [r]; pf [r] = h; } l++; r--; } } while (l < r); if (l < right) QSortFaces (l, right); if (left < r) QSortFaces (left, r); }
int SortFaces (void) { tSegFaces *segFaceP; CSegFace *faceP; tFaceRef *ph, *pi, *pj; int h, i, j; short nSegment; for (h = i = 0, ph = faceRef [0]; i < gameData.render.mine.nRenderSegs; i++) { if (0 > (nSegment = gameData.render.mine.nSegRenderList [i])) continue; segFaceP = SEGFACES + nSegment; for (j = segFaceP->nFaces, faceP = segFaceP->faceP; j; j--, faceP++, h++, ph++) { ph->nSegment = nSegment; ph->faceP = faceP; } } tiRender.nFaces = h; if (h > 1) { if (RunRenderThreads (rtSortFaces)) { for (i = h / 2, j = h - i, ph = faceRef [1], pi = faceRef [0], pj = pi + h / 2; h; h--) { if (i && (!j || (QCmpFaces (pi->faceP, pj->faceP) <= 0))) { *ph++ = *pi++; i--; } else if (j) { *ph++ = *pj++; j--; } } } else QSortFaces (0, h - 1); } return tiRender.nFaces; }
void CMeshBox::SortFaceIndexByMaterials(void) { QSortFaces(mMeshDef.nIndexList, mMeshDef.nMeshInfoList); }