JD2022-TU1/main/extern/Camcam/CCMesh/meshutils.cpp

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;
}