diff --git a/include/devil1geo.h b/include/devil1geo.h index 87bf242..f40f967 100644 --- a/include/devil1geo.h +++ b/include/devil1geo.h @@ -56,7 +56,6 @@ struct Batch { uint64_t offsetBoneIndexes; // uint64_t offsetBoneWeights; // uint64_t offsets[1]; // - int64_t pos; // set while parsing batch from ftell(); // following structs should in an array of size numVertex struct Positions *p; struct Normals *n; @@ -73,7 +72,17 @@ void printgheader(struct Header*); void printmeshheader(struct MeshHeader*); +void printmeshbatch(struct Batch*); + +void printpositions(struct Positions*, unsigned int); + +// ** = 'pass by reference' of a pointer to struct bool getmeshheader(struct MeshHeader**, unsigned int i, const char * const); +// ** = 'pass by reference' of a pointer to struct +bool getmeshbatch(struct Batch**, + struct MeshHeader*, + const char * const); + #endif diff --git a/src/devil1geo.c b/src/devil1geo.c index 0cc7add..0ad4286 100644 --- a/src/devil1geo.c +++ b/src/devil1geo.c @@ -24,6 +24,31 @@ void printmeshheader(struct MeshHeader *mh) { printf("flags %x\n\n", mh -> flags); } +void printmeshbatch(struct Batch *b) { + if (b == NULL) { + return; + } + printf("number of vertices %x\n", b -> numVertex); + printf("unknown byte %x\n", b -> uB); + printf("padding %x\n", b -> padding); + printf("offsetPositions %x\n", b -> offsetPositions); + printf("offsetNormals %x\n", b -> offsetNormals); + printf("offsetUVs %x\n", b -> offsetUVs); + printf("offsetBoneIndexes %x\n", b -> offsetBoneIndexes); + printf("offsetBoneWeights %x\n", b -> offsetBoneWeights); + printf("offsets %x\n\n", b -> offsets[0]); +} + +void printpositions(struct Positions *p, unsigned int count) { + if (p == NULL) { + return; + } + unsigned int i; + for (i = 0; i < count; i++) { + printf("(%f, %f, %f)\n", (p[i]).x, (p[i]).y, (p[i]).z); + } +} + bool getmeshheader(struct MeshHeader **hs, unsigned int i, const char * const filedata) { @@ -40,3 +65,23 @@ bool getmeshheader(struct MeshHeader **hs, done = true; return done; } + +bool getmeshbatch(struct Batch **b, + struct MeshHeader *h, + const char * const filedata) { + bool done = false; + if (b == NULL || h == NULL || filedata == NULL) { + return done; + } + unsigned int offset = h -> offsetBatches; + *b = (struct Batch*)(filedata + offset); + (*b) -> p = (struct Positions*)(filedata + ((*b) -> offsetPositions)); + printf("p = %x\n", (*b) -> offsetPositions); + printpositions((*b) -> p, 3); + (*b) -> n = NULL; + (*b) -> u = NULL; + (*b) -> bi = NULL; + (*b) -> bw = NULL; + done = true; + return done; +} diff --git a/test/main.c b/test/main.c index e008c14..0e80adf 100644 --- a/test/main.c +++ b/test/main.c @@ -105,7 +105,7 @@ void exporttextures(const char *filedata, return; } -void extractmeshes(const char* filedata, +void extractmeshes(const char *filedata, unsigned int filesize, const char *filename) { if (filedata == NULL || filesize <= 0) { @@ -113,12 +113,15 @@ void extractmeshes(const char* filedata, } struct Header *h = (struct Header*)filedata; struct MeshHeader *mh = NULL; + struct Batch *b = NULL; unsigned int i; bool ok; - for (i = 0; i < h -> numMesh; i++) { + //h -> numMesh + for (i = 0; i < 3; i++) { ok = getmeshheader(&mh, i, filedata); if (ok) { - printmeshheader(mh); + getmeshbatch(&b, mh, filedata); + printmeshbatch(b); } } }