Hamid_VB
سه شنبه 03 شهریور 1388, 19:35 عصر
برنامه ی باز کردن فایل های obj که خودم نوشتم ، البته هنوز کامل کامل نشده...
#define MAX_POINTS 100000
unsigned char objname[20] = {""};
char objpoints[MAX_POINTS][50]={""};
char objpointstex[MAX_POINTS][50]={""};
unsigned char objpointnorm[MAX_POINTS][50]={""};
char objface[MAX_POINTS][50]={""};
unsigned char objqroupname[MAX_POINTS][10]={""};
unsigned char objpoint[MAX_POINTS][10]={""};
unsigned char objline[MAX_POINTS][10]={""};
float PointsPos[2][1]={0};
unsigned int faces_points[2][50000]={0};
unsigned int faces_textures[2][50000]={0};
float TrianglesPoints[2][50000]={0};
float TrianglesTextures[2][1]={0};
float LinesPos[2][1]={0};
void loadobjfile(char *FileName,int List_Number)
{
int filesize;
char data[1000000]={""};
FILE * file;
int cntsplashs=0;
file = fopen(FileName, "rb" );
fread(data,1,1000000,file);
fclose(file);
filesize = strlen(data);
int cntnamechar =0;
int cntinfochar =0;
int cntinfocharcnt =-1;
int cntpointschar =0;
int cntpointscharcnt =-1;
int cntpointcharcnt =-1;
int cntpointstxchar =0;
int cntpointtxcharcnt =-1;
int cntpointnormchar =0;
int cntpointnormcharcnt =-1;
int cntfchar =0;
int cntfcharcnt =-1;
int cntfacechar =0;
int cntpointchar=0;
int cntfacecharcnt =-1;
int cntqroupcharcnt=-1;
int cntqroupchar=0;
int cntlinecharcnt=-1;
int cntlinechar=0;
bool isobjinfo=false;
bool isqroupname=false;
bool isobjname=false;
bool isline=false;
bool ispoint=false;
bool isobjtexture=false;
bool isobjpoints=false;
bool isobjpointstex=false;
bool isobjpointnorm=false;
bool isobjface=false;
for(int chrcnt=0;chrcnt<filesize;chrcnt++){
switch(data[chrcnt]){
case char(10):
if(isqroupname) isqroupname = false;
if(isline) isline = false;
if(ispoint) ispoint = false;
if(isobjname) isobjname = false;
if(isobjpoints) isobjpoints = false;
if(isobjpointstex) isobjpointstex = false;
if(isobjpointnorm) isobjpointnorm = false;
if(isobjface) isobjface = false;
switch(data[chrcnt+1]){
case 'v':
switch(data[chrcnt+2]){
case 't':
chrcnt++;
chrcnt++;
isobjpointstex = true;
cntpointtxcharcnt++;
cntpointstxchar=0;
break;
case 'n':
chrcnt++;
chrcnt++;
isobjpointnorm = true;
cntpointnormcharcnt++;
cntpointnormchar=0;
break;
default:
chrcnt++;
isobjpoints = true;
cntpointscharcnt++;
cntpointschar=0;
break;
}
break;
case 'f':
chrcnt++;
isobjface = true;
cntfacecharcnt++;
cntfacechar=0;
break;
case 'g':
chrcnt++;
isqroupname=true;
cntqroupcharcnt++;
cntqroupchar=0;
break;
case 'o':
chrcnt++;
isobjname=true;
break;
case 'p':
chrcnt++;
ispoint=true;
cntpointcharcnt++;
cntpointchar=0;
break;
case 'l':
chrcnt++;
isline=true;
cntlinecharcnt++;
cntlinechar=0;
break;
}
break;
default:
if(isqroupname){
objqroupname[cntqroupcharcnt][cntqroupchar] = data[chrcnt];
cntqroupchar++;
}
if(isobjpoints){
objpoints[cntpointscharcnt][cntpointschar] = data[chrcnt];
cntpointschar++;
}
if(isobjpointstex){
objpointstex[cntpointtxcharcnt][cntpointstxchar] = data[chrcnt];
cntpointstxchar++;
}
if(isobjpointnorm){
objpointnorm[cntpointnormcharcnt][cntpointnormchar] = data[chrcnt];
cntpointnormchar++;
}
if(isobjface){
objface[cntfacecharcnt][cntfacechar] = data[chrcnt];
cntfacechar++;
}
if(isline){
objline[cntlinecharcnt][cntlinechar] = data[chrcnt];
cntlinechar++;
}
if(ispoint){
objpoint[cntpointcharcnt][cntpointchar] = data[chrcnt];
cntpointchar++;
}
if(isobjname){
objname[cntnamechar] = data[chrcnt];
cntnamechar++;
}
break;
}
}
for(int cnt=0;cnt<=cntpointscharcnt;cnt++){
sscanf(objpoints[cnt]," %f %f %f",&TrianglesPoints[0][cnt],&TrianglesPoints[1][cnt],&TrianglesPoints[2][cnt]);
}
for(cnt=0;cnt<=cntfacecharcnt;cnt++){
cntsplashs=0;
for(int _cnt=0;_cnt<=strlen(objface[1]);_cnt++){
if(objface[1][_cnt]=='/') cntsplashs++;
}
switch(cntsplashs){
case 0:
sscanf(objface[cnt]," %i %i %i",&faces_points[0][cnt],&faces_points[1][cnt],&faces_points[2][cnt]);
break;
case 3:
sscanf(objface[cnt]," %i/%i %i/%i %i/%i",&faces_points[0][cnt],&faces_textures[0][cnt],&faces_points[1][cnt],&faces_textures[1][cnt],&faces_points[2][cnt],&faces_textures[2][cnt]);
break;
case 6:
break;
}
}
glNewList(List_Number, GL_COMPILE);
for(cnt=0;cnt<=cntfacecharcnt;cnt++){
glBegin(GL_TRIANGLES);
glVertex3f(TrianglesPoints[0][faces_points[0][cnt]-1],TrianglesPoints[1][faces_points[0][cnt]-1],TrianglesPoints[2][faces_points[0][cnt]-1]);
glVertex3f(TrianglesPoints[0][faces_points[1][cnt]-1],TrianglesPoints[1][faces_points[1][cnt]-1],TrianglesPoints[2][faces_points[1][cnt]-1]);
glVertex3f(TrianglesPoints[0][faces_points[2][cnt]-1],TrianglesPoints[1][faces_points[2][cnt]-1],TrianglesPoints[2][faces_points[2][cnt]-1]);
glEnd();
}
glEndList();
}
#define MAX_POINTS 100000
unsigned char objname[20] = {""};
char objpoints[MAX_POINTS][50]={""};
char objpointstex[MAX_POINTS][50]={""};
unsigned char objpointnorm[MAX_POINTS][50]={""};
char objface[MAX_POINTS][50]={""};
unsigned char objqroupname[MAX_POINTS][10]={""};
unsigned char objpoint[MAX_POINTS][10]={""};
unsigned char objline[MAX_POINTS][10]={""};
float PointsPos[2][1]={0};
unsigned int faces_points[2][50000]={0};
unsigned int faces_textures[2][50000]={0};
float TrianglesPoints[2][50000]={0};
float TrianglesTextures[2][1]={0};
float LinesPos[2][1]={0};
void loadobjfile(char *FileName,int List_Number)
{
int filesize;
char data[1000000]={""};
FILE * file;
int cntsplashs=0;
file = fopen(FileName, "rb" );
fread(data,1,1000000,file);
fclose(file);
filesize = strlen(data);
int cntnamechar =0;
int cntinfochar =0;
int cntinfocharcnt =-1;
int cntpointschar =0;
int cntpointscharcnt =-1;
int cntpointcharcnt =-1;
int cntpointstxchar =0;
int cntpointtxcharcnt =-1;
int cntpointnormchar =0;
int cntpointnormcharcnt =-1;
int cntfchar =0;
int cntfcharcnt =-1;
int cntfacechar =0;
int cntpointchar=0;
int cntfacecharcnt =-1;
int cntqroupcharcnt=-1;
int cntqroupchar=0;
int cntlinecharcnt=-1;
int cntlinechar=0;
bool isobjinfo=false;
bool isqroupname=false;
bool isobjname=false;
bool isline=false;
bool ispoint=false;
bool isobjtexture=false;
bool isobjpoints=false;
bool isobjpointstex=false;
bool isobjpointnorm=false;
bool isobjface=false;
for(int chrcnt=0;chrcnt<filesize;chrcnt++){
switch(data[chrcnt]){
case char(10):
if(isqroupname) isqroupname = false;
if(isline) isline = false;
if(ispoint) ispoint = false;
if(isobjname) isobjname = false;
if(isobjpoints) isobjpoints = false;
if(isobjpointstex) isobjpointstex = false;
if(isobjpointnorm) isobjpointnorm = false;
if(isobjface) isobjface = false;
switch(data[chrcnt+1]){
case 'v':
switch(data[chrcnt+2]){
case 't':
chrcnt++;
chrcnt++;
isobjpointstex = true;
cntpointtxcharcnt++;
cntpointstxchar=0;
break;
case 'n':
chrcnt++;
chrcnt++;
isobjpointnorm = true;
cntpointnormcharcnt++;
cntpointnormchar=0;
break;
default:
chrcnt++;
isobjpoints = true;
cntpointscharcnt++;
cntpointschar=0;
break;
}
break;
case 'f':
chrcnt++;
isobjface = true;
cntfacecharcnt++;
cntfacechar=0;
break;
case 'g':
chrcnt++;
isqroupname=true;
cntqroupcharcnt++;
cntqroupchar=0;
break;
case 'o':
chrcnt++;
isobjname=true;
break;
case 'p':
chrcnt++;
ispoint=true;
cntpointcharcnt++;
cntpointchar=0;
break;
case 'l':
chrcnt++;
isline=true;
cntlinecharcnt++;
cntlinechar=0;
break;
}
break;
default:
if(isqroupname){
objqroupname[cntqroupcharcnt][cntqroupchar] = data[chrcnt];
cntqroupchar++;
}
if(isobjpoints){
objpoints[cntpointscharcnt][cntpointschar] = data[chrcnt];
cntpointschar++;
}
if(isobjpointstex){
objpointstex[cntpointtxcharcnt][cntpointstxchar] = data[chrcnt];
cntpointstxchar++;
}
if(isobjpointnorm){
objpointnorm[cntpointnormcharcnt][cntpointnormchar] = data[chrcnt];
cntpointnormchar++;
}
if(isobjface){
objface[cntfacecharcnt][cntfacechar] = data[chrcnt];
cntfacechar++;
}
if(isline){
objline[cntlinecharcnt][cntlinechar] = data[chrcnt];
cntlinechar++;
}
if(ispoint){
objpoint[cntpointcharcnt][cntpointchar] = data[chrcnt];
cntpointchar++;
}
if(isobjname){
objname[cntnamechar] = data[chrcnt];
cntnamechar++;
}
break;
}
}
for(int cnt=0;cnt<=cntpointscharcnt;cnt++){
sscanf(objpoints[cnt]," %f %f %f",&TrianglesPoints[0][cnt],&TrianglesPoints[1][cnt],&TrianglesPoints[2][cnt]);
}
for(cnt=0;cnt<=cntfacecharcnt;cnt++){
cntsplashs=0;
for(int _cnt=0;_cnt<=strlen(objface[1]);_cnt++){
if(objface[1][_cnt]=='/') cntsplashs++;
}
switch(cntsplashs){
case 0:
sscanf(objface[cnt]," %i %i %i",&faces_points[0][cnt],&faces_points[1][cnt],&faces_points[2][cnt]);
break;
case 3:
sscanf(objface[cnt]," %i/%i %i/%i %i/%i",&faces_points[0][cnt],&faces_textures[0][cnt],&faces_points[1][cnt],&faces_textures[1][cnt],&faces_points[2][cnt],&faces_textures[2][cnt]);
break;
case 6:
break;
}
}
glNewList(List_Number, GL_COMPILE);
for(cnt=0;cnt<=cntfacecharcnt;cnt++){
glBegin(GL_TRIANGLES);
glVertex3f(TrianglesPoints[0][faces_points[0][cnt]-1],TrianglesPoints[1][faces_points[0][cnt]-1],TrianglesPoints[2][faces_points[0][cnt]-1]);
glVertex3f(TrianglesPoints[0][faces_points[1][cnt]-1],TrianglesPoints[1][faces_points[1][cnt]-1],TrianglesPoints[2][faces_points[1][cnt]-1]);
glVertex3f(TrianglesPoints[0][faces_points[2][cnt]-1],TrianglesPoints[1][faces_points[2][cnt]-1],TrianglesPoints[2][faces_points[2][cnt]-1]);
glEnd();
}
glEndList();
}