diff --git a/devil3model.c b/devil1geo.h similarity index 77% rename from devil3model.c rename to devil1geo.h index a02de4c..8d07d1c 100644 --- a/devil3model.c +++ b/devil1geo.h @@ -1,14 +1,15 @@ -#include -#include -#include +#ifndef DEVIL1GEO_H +#define DEVIL1GEO_H +#include +#pragma pack(1) struct Header { - char numMesh; - char unknownNumberB; - char unknownNumberC; - char unknownNumberD; + unsigned char numMesh; + unsigned char unknownNumberB; + unsigned char unknownNumberC; + unsigned char unknownNumberD; uint32_t padding; // - uint64_t unknowOffset; + uint64_t unknownOffset; }; struct MeshHeaders { @@ -40,7 +41,7 @@ struct BoneWeights { }; // This is where most of the parsing will be. -// this struct is in-order of what the file format wil have. +// this struct is in-order of what the file format will have. struct Batch { int16_t numVertex; int16_t uB; @@ -64,12 +65,5 @@ struct Mesh { struct Batch b; }; -// just for now -// need to separate file operation from the lib later -bool readin(const char *fname) { - ; -} +#endif -int main(int argc, char ** argv) { - ; -} diff --git a/devil1pld.h b/devil1pld.h new file mode 100644 index 0000000..2f92cc8 --- /dev/null +++ b/devil1pld.h @@ -0,0 +1,12 @@ +#ifndef DEVIL1PLD_H +#define DEVIL1PLD_H + +#include +#pragma pack(1) +struct PldHeader { + int32_t numOffset; + // array of numOffset elements + uint32_t *offsets; // +}; + +#endif \ No newline at end of file diff --git a/main.c b/main.c new file mode 100644 index 0000000..85b90ca --- /dev/null +++ b/main.c @@ -0,0 +1,75 @@ +#include "devil1pld.h" +#include +#include +#include +#include + +void disp_pldheader(struct PldHeader *x) { + printf("number of offsets = %i\n", x -> numOffset); + unsigned int i; + for (i = 0; i < x -> numOffset; i++) { + printf("offset %i = %x\n", i, x -> offsets[i]); + } +} + +bool read_pldheader(const char *buffer) { + int32_t *n = (int32_t*)buffer; + struct PldHeader *ph = (struct PldHeader*)malloc(1); + unsigned int size_offsets = sizeof(uint32_t) * n[0]; + ph -> offsets = (uint32_t*)malloc(size_offsets); + if (ph -> offsets == NULL) { + perror("Error 4: "); + free(ph); + free(ph -> offsets); + return false; + } + // set data of struct. + ph -> numOffset = n[0]; + memcpy(ph -> offsets, buffer + sizeof(int32_t), size_offsets); + disp_pldheader(ph); + free(ph -> offsets); + free(ph); + return true; +} + +bool readpld(const char *fname) { + FILE *f = fopen(fname, "rb"); + char *buffer = NULL; + unsigned int size = 0; // number of elements to buffer; + unsigned int rcnt = 0; // number of char's read by fread(...) + if (f == NULL) { + perror("Error 1: "); + return false; + } + // this method of determining file size doesn't work until 2 GB. + fseek(f, 0, SEEK_END); + size = ftell(f); + rewind(f); + buffer = (char*)malloc(sizeof(char) * size); + if (buffer == NULL) { + perror("Error 2: "); + free(buffer); + return false; + } + rcnt = fread(buffer, sizeof(char), size, f); + if (rcnt < size) { + perror("Error 3: "); + free(buffer); + return false; + } + read_pldheader(buffer); + fclose(f); + free(buffer); + return true; +} + +int main(int argc, char ** argv) { + char *filename = argv[1]; + bool status = readpld(filename); + if (status) { + printf("Read OK"); + } else { + printf("Read not-OK"); + } + return 0; +} \ No newline at end of file