#include "devil1tex.h" #include #include #include void printtph (struct TexturePack *tp) { if (tp != NULL) { printf("id: \t %c %c %c %c \n", tp -> id[3], tp -> id[2], tp -> id[1], tp -> id[0]); printf("batch#: \t %i \n", tp -> batchNumber); printf("1st batch: \t %i \n", tp -> firstBatchOffset); printf("unknownA: \t %i\n", tp -> unknownA); } return; } void printtbd(struct TextureBatchDescriptor *bd) { if (bd != NULL) { printf("batch index: \t %i \n", bd -> batchIdx); printf("hash: \t %u \n", bd -> hash); printf("textures: \t %i\n", bd -> texNumber); } } // get texture pack descriptors void gettbd (struct TextureBatchDescriptor **descriptors, const char *filedata, unsigned int filesize) { if (descriptors == NULL || filedata == NULL || filesize <= 0) { return; } struct TexturePack *tp = NULL; tp = (struct TexturePack*)filedata; if (filesize <= (sizeof(struct TextureBatchDescriptor) * tp -> batchNumber + sizeof(struct TexturePack))){ fprintf(stderr, "File Error: file size to struct sizes ratio.\n"); return; } unsigned int index = sizeof(struct TexturePack); // Batch Descriptors are structured one after another. // therefore the next one is at // current index + sizeof(TextureBatchDescriptor) unsigned int i = 0; do { index = sizeof(struct TextureBatchDescriptor) * i + sizeof(struct TexturePack); printf("batch descriptor start: %x\n", index); descriptors[i] = (struct TextureBatchDescriptor*) (filedata + index); i++; } while(i < (tp -> batchNumber)); return; } // returns total count of textures in the file. unsigned int gettexturebatch( struct TextureBatch **tb, struct TextureBatchDescriptor **bds, const char *filedata, unsigned int filesize) { struct TexturePack *tp = (struct TexturePack*)filedata; unsigned int offset = tp -> firstBatchOffset; unsigned int i; unsigned int j; unsigned int totaltextures = 0; // TextureBatch shares a starting address with the first texture // and shares the ending address with the last texture. for (i = 0; i < tp -> batchNumber; i++) { tb[i] = (struct TextureBatch*)filedata + offset; // the next texture batch is TextureSize * number of textures away. offset += bds[i] -> textureSize * (bds[i] -> texNumber); totaltextures += bds[i] -> texNumber; } return totaltextures; } void locatetextures(unsigned int *t, struct TexturePack *tp, struct TextureBatchDescriptor **bds) { unsigned int i; unsigned int j; // k is access to index of textures. unsigned int k = 0; unsigned int offset = tp -> firstBatchOffset; for (i = 0; i < tp -> batchNumber; i++) { for (j = 0; j < bds[i] -> texNumber; j++) { t[k] = offset; offset += bds[i] -> textureSize; k++; } } }