| 716 | } |
| 717 | |
| 718 | static void PipeForAllSceneModels(void (*pipeCB)(RpAtomic* data, U32 pipeFlags, U32 subObjects)) |
| 719 | { |
| 720 | // non-matching: wrong registers |
| 721 | |
| 722 | S32 i, j, k; |
| 723 | S32 numModels = xSTAssetCountByType('MODL'); |
| 724 | |
| 725 | for (i = 0; i < numModels; i++) |
| 726 | { |
| 727 | RpAtomic* model = (RpAtomic*)xSTFindAssetByType('MODL', i, NULL); |
| 728 | |
| 729 | if (model) |
| 730 | { |
| 731 | st_PKR_ASSET_TOCINFO ainfo; |
| 732 | U32 numSubObjects, remainSubObjBits, currSubObjBits; |
| 733 | RpAtomic* tempmodel; |
| 734 | |
| 735 | xSTGetAssetInfoByType('MODL', i, &ainfo); |
| 736 | |
| 737 | numSubObjects = 0; |
| 738 | tempmodel = model; |
| 739 | |
| 740 | do |
| 741 | { |
| 742 | numSubObjects++; |
| 743 | tempmodel = iModelFile_RWMultiAtomic(tempmodel); |
| 744 | } while (tempmodel); |
| 745 | |
| 746 | remainSubObjBits = (1 << numSubObjects) - 1; |
| 747 | |
| 748 | for (j = 0; j < xModelPipeNumTables; j++) |
| 749 | { |
| 750 | for (k = 0; k < xModelPipeCount[j]; k++) |
| 751 | { |
| 752 | if (ainfo.aid == xModelPipeData[j][k].ModelHashID) |
| 753 | { |
| 754 | currSubObjBits = remainSubObjBits & xModelPipeData[j][k].SubObjectBits; |
| 755 | |
| 756 | if (currSubObjBits) |
| 757 | { |
| 758 | pipeCB(model, xModelPipeData[j][k].PipeFlags, currSubObjBits); |
| 759 | } |
| 760 | |
| 761 | remainSubObjBits &= ~currSubObjBits; |
| 762 | |
| 763 | if (!remainSubObjBits) |
| 764 | { |
| 765 | goto loc_800B1698; |
| 766 | } |
| 767 | } |
| 768 | } |
| 769 | } |
| 770 | |
| 771 | if (remainSubObjBits) |
| 772 | { |
| 773 | pipeCB(model, 0, remainSubObjBits); |
| 774 | } |
| 775 | } |
no test coverage detected