First picture is reality and second picture expectation

Stack Exchange network consists of 183 Q&A communities including Stack Overflow, the largest, most trusted online community for developers to learn, share their knowledge, and build their careers.
Visit Stack ExchangeStack Internal
Knowledge at work
Bring the best of human thought and AI automation together at your work.
Explore Stack Internal
First picture is reality and second picture expectation


First picture is reality and second picture expectation

I still have this problem almost 1 month. Tried to search on Google but did not find any solution to this. I have loaded all the data correctly but don't know why the texture came up like this.
Here is my loader:
Header
struct SVertex { public: float X, Y, Z; }; struct STexture { public: float U, V; }; struct SFace { public: int X, Y, Z; }; class CBMap { public: struct SMesh { SVertex *Vertex; SVertex *Normal; STexture *TexCoord; SFace *Face; SFace *FaceNormal; char Texture[32]; int TextureID; int TotalVertice; int TotalNormal; int TotalFace; }; SMesh* Mesh; CBMap(); ~CBMap(); int TotalMesh; int Load(char* szFile); int Get_FileHeader(FILE* pFile); int Get_TotalMesh(FILE* pFile); int GetData(FILE* pFile); }; CPP
int CBMap::Load(char* szFile) { FILE* pFile = fopen(szFile, "r"); if (!pFile) return 0; int iBMap = Get_FileHeader(pFile); if (!iBMap) { printf("BMAP file is not valid\n"); return 0; } TotalMesh = Get_TotalMesh(pFile); Mesh = new SMesh[TotalMesh]; GetData(pFile); int iMesh = 0; char* pJunk; char szHeader[32]; while (!feof(pFile)) { fscanf(pFile, "%s", &szHeader); if (!strncmp(szHeader, "BMAP", 4)) continue; if (!strncmp(szHeader, "mesh", 4)) continue; if (!strncmp(szHeader, "mtl", 3)) { fscanf(pFile, "%s", Mesh[iMesh].Texture); Mesh[iMesh].TextureID = LoadTexture(Mesh[iMesh].Texture); } if (!strncmp(szHeader, "ve", 2)) { fscanf(pFile, "%d", &pJunk); Mesh[iMesh].Vertex = (SVertex*)malloc(sizeof (SVertex) * Mesh[iMesh].TotalVertice); for (int i = 0; i < Mesh[iMesh].TotalVertice; ++i) { fscanf(pFile, "%f %f %f", &Mesh[iMesh].Vertex[i].X, &Mesh[iMesh].Vertex[i].Y, &Mesh[iMesh].Vertex[i].Z); } } if (!strncmp(szHeader, "uv", 2)) { fscanf(pFile, "%d", &pJunk); Mesh[iMesh].TexCoord = (STexture*)malloc(sizeof (STexture) * Mesh[iMesh].TotalVertice); for (int i = 0; i < Mesh[iMesh].TotalVertice; ++i) { fscanf(pFile, "%f %f", &Mesh[iMesh].TexCoord[i].U, &Mesh[iMesh].TexCoord[i].V); } } if (!strncmp(szHeader, "vn", 2)) { fscanf(pFile, "%d", &pJunk); Mesh[iMesh].Normal = (SVertex*)malloc(sizeof (SVertex) * Mesh[iMesh].TotalNormal); for (int i = 0; i < Mesh[iMesh].TotalNormal; ++i) { fscanf(pFile, "%f %f %f", &Mesh[iMesh].Normal[i].X, &Mesh[iMesh].Normal[i].Y, &Mesh[iMesh].Normal[i].Z); } } if (!strncmp(szHeader, "f", 1)) { fscanf(pFile, "%d", &pJunk); Mesh[iMesh].Face = (SFace*)malloc(sizeof (SFace) * Mesh[iMesh].TotalFace * 3); Mesh[iMesh].FaceNormal = (SFace*)malloc(sizeof (SFace) * Mesh[iMesh].TotalFace * 3); for (int i = 0; i < Mesh[iMesh].TotalFace; ++i) { fscanf(pFile, "%d %d %d %d %d %d", &Mesh[iMesh].Face[i].X, &Mesh[iMesh].Face[i].Y, &Mesh[iMesh].Face[i].Z, &Mesh[iMesh].FaceNormal[i].X, &Mesh[iMesh].FaceNormal[i].Y, &Mesh[iMesh].FaceNormal[i].Z); } } if (!strncmp(szHeader, "end", 3)) { if (iMesh < TotalMesh) iMesh ++; } } printf("CBMap::Model Loaded\n"); fclose(pFile); return 1; } 