#ifndef DEVIL1GEO_H #define DEVIL1GEO_H #include #include #pragma pack(push, 1) struct Header { unsigned char numMesh; unsigned char unknownNumberB; unsigned char unknownNumberC; unsigned char unknownNumberD; uint32_t padding; // uint64_t unknownOffset; }; struct MeshHeader { int16_t numBatch; int16_t numVertex; uint32_t u; // uint64_t offsetBatches; uint64_t flags; }; // put these in an array of size: [header.numMesh] struct Coordinate { float x, y, z; }; struct UVs { int16_t u, v; }; struct BoneIndexes { unsigned char indexes[4]; // from ubyte }; struct BoneWeights { uint16_t weights; // }; struct BatchData { int16_t numVertex; int16_t uB; uint32_t padding; // uint64_t offsetPositions; // uint64_t offsetNormals; // uint64_t offsetUVs; // uint64_t offsetBoneIndexes; // uint64_t offsetBoneWeights; // uint64_t offsets[1]; // }; struct VertexData { // following structs should in an array of size numVertex struct Coordinate *positions; struct Coordinate *normals; struct UVs *u; struct BoneIndexes *bi; struct BoneWeights *bw; }; // This is where most of the parsing will be. // this struct is in-order of what the file format will have. struct Batch { struct BatchData *bd; struct VertexData vd; }; struct Mesh { // may contain multiple batches struct Batch *b; }; #pragma pack(pop) void printgheader(struct Header*); void printmeshheader(struct MeshHeader*); void printmeshbatch(struct Batch*); void printcoordinate(struct Coordinate*, 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