#include "windows.h" #include "CCMesh.h" u32 MeshReadLine(FILE *F,char *LineFeed) { u32 LineL; u32 NotFinish; char PreviousType; PreviousType = 100; LineL = 0; do { NotFinish = fread(&LineFeed[LineL],1,1,F); if ((LineFeed[LineL] < 32) && (LineFeed[LineL] != '\n')) LineFeed[LineL] = 32; if ((PreviousType == 32) && (LineFeed[LineL] == 32)) LineL --; PreviousType = LineFeed[LineL]; } while ((LineFeed[LineL++] != '\n') && (NotFinish)); LineFeed[LineL] = 0; if (LineL && (LineFeed[LineL-1] == '\n')) LineFeed[LineL-1] = 0; return NotFinish; } u32 LoadObj(Mesh *LoadMesh,FILE *F) { u32 NotFinish; LoadMesh->Destroy(); NotFinish = 1; while (NotFinish) { u32 K; Vector V,VT; u32 Indexes[12]; char LineFeed[2048]; u32 IsCommented; NotFinish = MeshReadLine(F,LineFeed); switch (LineFeed[0]) { case 'v': if (LineFeed[1] == ' ') { if (sscanf(LineFeed + 2,"%f %f %f",&V.x,&V.y,&V.z) == 3) LoadMesh->Vertex(V.x,V.y,-V.z); } if (LineFeed[1] == 't') { if (sscanf(LineFeed + 3,"%f %f %f",&V.x,&V.y,&V.z) == 3) LoadMesh->VertexUV(V.x,V.y,V.z); } if (LineFeed[1] == 'n') { if (sscanf(LineFeed + 3,"%f %f %f",&V.x,&V.y,&V.z) == 3) LoadMesh->VertexN(V.x,V.y,-V.z); } break; case 'f': K = sscanf(LineFeed + 2,"%d/%d/%d %d/%d/%d %d/%d/%d %d/%d/%d",&Indexes[0],&Indexes[1],&Indexes[2],&Indexes[3],&Indexes[4],&Indexes[5],&Indexes[6],&Indexes[7],&Indexes[8],&Indexes[9],&Indexes[10],&Indexes[11],&Indexes[12]); if (K == 9) LoadMesh->FaceUV(Indexes[0],Indexes[3],Indexes[6],Indexes[1],Indexes[4],Indexes[7],0); else if (K == 12) LoadMesh->FaceUV4(Indexes[0],Indexes[3],Indexes[6],Indexes[9],Indexes[1],Indexes[4],Indexes[7],Indexes[10]); break; default:break; } } fclose(F); return 0; }