void read_BigFloatAnimBlock(FILE *lk_m2_file, LKAnimationBlock *ptrBlock, AnimRefs *ptrAnimRefs, BigFloat_LKSubBlock **ptrDataBlock, LKModelAnimation *AnimList, FILE **anim_files) { if (ptrBlock->Times.n > 0) { //Layer 1 read_layer1(lk_m2_file, ptrBlock, ptrAnimRefs); //Layer 2 (*ptrDataBlock) = malloc( ptrBlock->Times.n * sizeof(BigFloat_LKSubBlock)); //Each Array_Ref leads to an array of elements (and there are Times.n of them, as seen previously) int j; for (j = 0; j < ptrBlock->Times.n; j++) { int real_pos = get_RealPos(j, AnimList); if ((AnimList[j].flags & 0x130) == 0) { //Open .anim file FILE *anim_file = anim_files[real_pos]; read_times(anim_file, ptrAnimRefs, &(*ptrDataBlock)[j].times, j, real_pos); if (ptrAnimRefs->keys[real_pos].n > 0) { (*ptrDataBlock)[j].keys = malloc( ptrAnimRefs->keys[real_pos].n * sizeof(BigFloat)); fseek(anim_file, ptrAnimRefs->keys[real_pos].ofs, SEEK_SET); fread((*ptrDataBlock)[j].keys, sizeof(BigFloat), ptrAnimRefs->keys[real_pos].n, anim_file); } } else { read_times(lk_m2_file, ptrAnimRefs, &(*ptrDataBlock)[j].times, j, real_pos); if (ptrAnimRefs->keys[real_pos].n > 0) { (*ptrDataBlock)[j].keys = malloc( ptrAnimRefs->keys[real_pos].n * sizeof(BigFloat)); fseek(lk_m2_file, ptrAnimRefs->keys[real_pos].ofs, SEEK_SET); fread((*ptrDataBlock)[j].keys, sizeof(BigFloat), ptrAnimRefs->keys[real_pos].n, lk_m2_file); } } } } }
int get_RealPos(int pos, LKModelAnimation *animations) { if((animations[pos].flags & 0x40) == 0){ return pos; } return get_RealPos(animations[pos].Index, animations); }