| 6 | #include <string.h> |
| 7 | |
| 8 | xMorphSeqFile* xMorphSeqSetup(void* data, xMorphFindAssetCallback FindAssetCB) |
| 9 | { |
| 10 | S32 i, j; |
| 11 | RpAtomic* model; |
| 12 | xMorphTargetFile* mphtgt; |
| 13 | xMorphSeqFile* header; |
| 14 | F32* timelist; |
| 15 | xMorphFrame* framelist; |
| 16 | U32* assetlist; |
| 17 | char* namelist; |
| 18 | void* assetPtr; |
| 19 | U32 skipsize; |
| 20 | |
| 21 | header = (xMorphSeqFile*)data; |
| 22 | timelist = (F32*)(header + 1); |
| 23 | framelist = (xMorphFrame*)(timelist + header->TimeCount); |
| 24 | assetlist = (U32*)(framelist + header->TimeCount); |
| 25 | namelist = (char*)(assetlist + header->ModelCount * 2); |
| 26 | |
| 27 | if (header->Flags & 0x80000000) { |
| 28 | return header; |
| 29 | } |
| 30 | |
| 31 | header->Flags |= 0x80000000; |
| 32 | if (!(header->Flags & 0x1)) { |
| 33 | namelist = NULL; |
| 34 | } |
| 35 | |
| 36 | for (i = 0; i < (S32)header->ModelCount * 2; i++) { |
| 37 | if (assetlist[i]) { |
| 38 | assetPtr = FindAssetCB(assetlist[i], namelist); |
| 39 | assetlist[i] = (U32)assetPtr; |
| 40 | } |
| 41 | if (namelist) { |
| 42 | namelist = strlen(namelist) + 1 + namelist; |
| 43 | } |
| 44 | } |
| 45 | |
| 46 | for (i = 0; i < (S32)header->ModelCount; i++) { |
| 47 | if (assetlist[i*2+1]) { |
| 48 | model = (RpAtomic*)assetlist[i*2]; |
| 49 | mphtgt = (xMorphTargetFile*)assetlist[i*2+1]; |
| 50 | iMorphOptimize(model, mphtgt->Flags & 0x1); |
| 51 | } |
| 52 | } |
| 53 | |
| 54 | for (i = 0; i < (S32)header->TimeCount; i++) { |
| 55 | model = (RpAtomic*)assetlist[(U32)framelist[i].Model*2]; |
| 56 | mphtgt = (xMorphTargetFile*)assetlist[(U32)framelist[i].Model*2+1]; |
| 57 | framelist[i].Model = model; |
| 58 | for (j = 0; j < 4; j++) { |
| 59 | if ((U32)framelist[i].Targets[j] + 0x10000 == 0xFFFF) { |
| 60 | framelist[i].Targets[j] = NULL; |
| 61 | } else { |
| 62 | skipsize = (mphtgt->NumVerts * 3 + 7) & ~7; |
| 63 | if (mphtgt->Flags & 0x1) { |
| 64 | skipsize *= 2; |
| 65 | } |
no test coverage detected