#define FILENAME "box.3ds" #include #include #include "3dschunks.h" void output(char *string) { FILE *fp; fp = fopen("fileinfo.txt","a+"); fprintf(fp,"%s",string); fclose(fp); } struct stChunk { unsigned short ID; unsigned int length; unsigned int bytesRead; }; void ReadChunk(FILE*fp,stChunk *pChunk) { unsigned short ID = 0; unsigned int bytesRead = 0; unsigned int bChunkLength = 0; bytesRead = fread(&ID,1,2,fp); bytesRead += fread(&bChunkLength,1,4,fp); pChunk->ID = ID; pChunk->length = bChunkLength; pChunk->bytesRead = bytesRead; } void SkipChunk(FILE*fp,stChunk *pChunk) { int buffer[50000] = {0}; fread(buffer,1,pChunk->length - pChunk->bytesRead,fp); } void DisplayChunkInfo(stChunk* pChunk) { char buf[1000] = {0}; sprintf(buf, "Chunk ID: 0x %04x Size of Chunk: %u\n", pChunk->ID, pChunk->length); output(buf); } void ReadKEYF3DS(FILE *fp, stChunk* Chunk) { while(Chunk->bytesRead < Chunk -> length){ stChunk tempChunk = {0}; ReadChunk(fp, &tempChunk); DisplayChunkInfo(&tempChunk); switch(tempChunk.ID){ default: SkipChunk(fp,&tempChunk); } Chunk->bytesRead += tempChunk.length; } } /* read the actual object stuff */ void ReadVerticesMESH_FACES(FILE *fp,stChunk* Chunk) { unsigned int iNumberFaces = 0; //= Chunk->length -6; Chunk->bytesRead += fread(&iNumberFaces,1,2,fp); char buff[100]; sprintf(buff, "Number of Faces %u\n", iNumberFaces); output(buff); struct stFace{unsigned short p1,p2,p3;}; stFace *pFaces = new stFace[iNumberFaces]; Chunk->bytesRead += fread(pFaces,1,iNumberFaces* sizeof(stFace),fp); for(int i=0; ibytesRead += fread(&iNumberVertices,1,2,fp); //xyz char buff[300]; sprintf(buff, "Number of Vertices %d\n", iNumberVertices); output(buff); struct stVect{float x,y,z;}; stVect *pVerts = new stVect[iNumberVertices]; Chunk->bytesRead += fread( (void*)pVerts, 1, iNumberVertices*sizeof(stVect), fp); for(int i=0; ibytesRead < Chunk->length){ stChunk tempChunk = {0}; ReadChunk(fp,&tempChunk); DisplayChunkInfo(&tempChunk); switch(tempChunk.ID){ case MESH_VERTICES: ReadVerticesMESH_VERTICES(fp,&tempChunk); break; case MESH_FACES: ReadVerticesMESH_FACES(fp, &tempChunk); break; default: SkipChunk(fp,&tempChunk); } Chunk->bytesRead += tempChunk.length; } } /* get object data */ int GetString(FILE *fp) { int index = 0; char buffer[100] = {0}; fread(buffer,1,1,fp); while(*(buffer + index++) != 0){ fread(buffer+index,1,1,fp); } output(buffer); output("\n"); return(strlen(buffer)+1); } void ReadNAMED_OBJECT(FILE *fp,stChunk* Chunk) { output("\n"); unsigned int characterlen = GetString(fp); Chunk->bytesRead += characterlen; while(Chunk->bytesRead < Chunk->length){ stChunk tempChunk = {0}; ReadChunk(fp,&tempChunk); DisplayChunkInfo(&tempChunk); switch(tempChunk.ID) { case OBJ_MESH: LoadMeshOBJ_MESH(fp,&tempChunk); break; default: SkipChunk(fp,&tempChunk); } Chunk->bytesRead += tempChunk.length; } } void ReadEDIT3DS(FILE *fp, stChunk* Chunk) { output("\n"); while(Chunk->bytesRead < Chunk->length){ stChunk tempChunk = {0}; ReadChunk(fp, &tempChunk); DisplayChunkInfo(&tempChunk); switch(tempChunk.ID){ case NAMED_OBJECT: ReadNAMED_OBJECT(fp, &tempChunk); break; default: SkipChunk(fp,&tempChunk); } Chunk-> bytesRead += tempChunk.length; } } /* read 3ds file */ void read3ds() { FILE* pFile; pFile = fopen(FILENAME,"rb"); stChunk Chunk = {0}; ReadChunk(pFile,&Chunk); DisplayChunkInfo(&Chunk); while(Chunk.bytesRead< Chunk.length) { stChunk tempChunk = {0}; ReadChunk(pFile, &tempChunk); DisplayChunkInfo(&tempChunk); unsigned int bytesRead=0; switch(tempChunk.ID){ case EDIT3DS: ReadEDIT3DS(pFile,&tempChunk); bytesRead = tempChunk.length; break; case KEYF3DS: ReadKEYF3DS(pFile,&tempChunk); bytesRead = tempChunk.length; break; default: SkipChunk(pFile,&tempChunk); bytesRead = tempChunk.length; } Chunk.bytesRead += bytesRead; } fclose(pFile); } // OUTPUT! // Chunk ID: 0x 4d4d Size of Chunk: 355 Chunk ID: 0x 0002 Size of Chunk: 10 Chunk ID: 0x 3d3d Size of Chunk: 339 Chunk ID: 0x afff Size of Chunk: 66 Chunk ID: 0x 4000 Size of Chunk: 267 0Cube Chunk ID: 0x 4100 Size of Chunk: 255 Chunk ID: 0x 4110 Size of Chunk: 104 Number of Vertices 8 Vertices Point: x: 1.00, y: 1.00, z: 0.18 Vertices Point: x: 1.00, y: -1.00, z: 0.18 Vertices Point: x: -1.00, y: -1.00, z: 0.18 Vertices Point: x: -1.00, y: 1.00, z: 0.18 Vertices Point: x: 1.00, y: 1.00, z: 2.18 Vertices Point: x: 1.00, y: -1.00, z: 2.18 Vertices Point: x: -1.00, y: -1.00, z: 2.18 Vertices Point: x: -1.00, y: 1.00, z: 2.18 Chunk ID: 0x 4120 Size of Chunk: 145 Number of Faces 12 Face: Index1: 0, Index2: 1, Index3 2 Face: Index1: 0, Index2: 0, Index3 2 Face: Index1: 3, Index2: 0, Index3 4 Face: Index1: 7, Index2: 6, Index3 0 Face: Index1: 4, Index2: 6, Index3 5 Face: Index1: 0, Index2: 0, Index3 4 Face: Index1: 5, Index2: 0, Index3 0 Face: Index1: 5, Index2: 1, Index3 0 Face: Index1: 1, Index2: 5, Index3 6 Face: Index1: 0, Index2: 1, Index3 6 Face: Index1: 2, Index2: 0, Index3 2 Face: Index1: 6, Index2: 7, Index3 0