74 lines
1.8 KiB
C++
74 lines
1.8 KiB
C++
#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;
|
|
}
|