5
void parseface(char *facedata,int *varray,int *narray,int *tarray,int position, int hasuv, int hasnormals)
15
while(readpos<strlen(facedata)&&facedata[readpos]!='/'){
16
workstr[pos]=facedata[readpos];
25
// -1 to compensate for wavefront file starting on 1 and not 0
27
varray[position]=atoi(workstr)-1;
28
}else if((i==1)&&(hasuv>0)){
29
tarray[position]=atoi(workstr)-1;
30
}else if((i==2)&&(hasnormals>0)){
31
narray[position]=atoi(workstr)-1;
37
void loadobj(char *objfilename, char *openobj, char *outputfile)
40
pFile = fopen (objfilename,"r");
44
buf=(char*)malloc(1024);
47
// foundobj is true if an object with a certain name is found
48
// Set foundobj to true if we are loading all objects
50
if (strcmp(openobj,"ALL")==0) foundobj=1;
61
// Global Variables for Object
68
char *resultp1,*resultp2,*resultp3,*resultp4,*resultp5;
71
printf("Msg: Success opening: %s!\n",objfilename);
73
while ( fgets(buf,1024,pFile) != NULL ){
75
// Comment - Do Nothing
77
result=strtok(buf," \n\t");
79
if(strcmp(result,"v")==0){
81
// Increase vertex counter
84
}else if(strcmp(result,"vt")==0){
86
// Increase texture coordinate counter
90
}else if(strcmp(result,"vn")==0){
92
// Increase normal counter
95
}else if(strcmp(result,"f")==0){
97
// Increase face counter
99
resultp1=strtok(NULL," \n\t");
100
resultp2=strtok(NULL," \n\t");
101
resultp3=strtok(NULL," \n\t");
102
resultp4=strtok(NULL," \n\t");
103
resultp5=strtok(NULL," \n\t");
104
if((resultp4!=NULL)&&(resultp5==NULL)){
106
}else if((resultp3!=NULL)&&(resultp4==NULL)){
112
}else if(strcmp(result,"g")==0){
113
if(result=strtok(NULL," \n\t")){
114
if(!strcmp(openobj,result)){
118
printf("Error: Failed to read object name\n");
121
// printf("O: %s \n",buf);
128
printf("Warning: Object %s in file %s contains faces that will be ignored, with more than 4 vertices.!\n",objfilename,openobj);
131
if(((trianglecount+quadcount)>0)){
133
// Set foundobj to true if we are loading all objects
134
if (strcmp(openobj,"ALL")) foundobj=1;
136
// Seek to beginning again
137
fseek( pFile, 0, SEEK_SET);
139
// Allocate local buffers
140
float *localvertexlist=(float *)malloc(sizeof(float)*vertcount*3);
141
float *localnormallist=(float *)malloc(sizeof(float)*normalcount*3);
142
float *localuvlist=(float *)malloc(sizeof(float)*texturecount*2);
143
int *localquadlist=(int *)malloc(sizeof(int)*quadcount*4);
144
int *localquadlistuv=(int *)malloc(sizeof(int)*quadcount*4);
145
int *localquadlistnormal=(int *)malloc(sizeof(int)*quadcount*4);
146
int *localtrianglelist=(int *)malloc(sizeof(int)*trianglecount*3);
147
int *localtrianglelistuv=(int *)malloc(sizeof(int)*trianglecount*3);
148
int *localtrianglelistnormal=(int *)malloc(sizeof(int)*trianglecount*3);
150
// Reset counters for second pass
157
while ( fgets(buf,1024,pFile) != NULL ){
160
// Comment - Do Nothing
163
//-------------------------
164
result = strtok(buf," \n\t");
166
if(strcmp(result,"v")==0){
168
result=strtok(NULL," \n\t");
169
localvertexlist[(vertcount*3)]=atof(result);
170
result=strtok(NULL," \n\t");
171
localvertexlist[(vertcount*3)+1]=atof(result);
172
result=strtok(NULL," \n\t");
173
localvertexlist[(vertcount*3)+2]=atof(result);
176
}else if(strcmp(result,"vt")==0){
178
result=strtok(NULL," \n\t");
179
localuvlist[(texturecount*2)]=atof(result);
180
result=strtok(NULL," \n\t");
181
localuvlist[(texturecount*2)+1]=atof(result);
184
}else if(strcmp(result,"vn")==0){
186
result=strtok(NULL," \n\t");
187
localnormallist[(normalcount*3)]=atof(result);
188
result=strtok(NULL," \n\t");
189
localnormallist[(normalcount*3)+1]=atof(result);
190
result=strtok(NULL," \n\t");
191
localnormallist[(normalcount*3)+2]=atof(result);
195
}else if(strcmp(result,"f")==0){
197
resultp1=strtok(NULL," \n\t");
198
resultp2=strtok(NULL," \n\t");
199
resultp3=strtok(NULL," \n\t");
200
resultp4=strtok(NULL," \n\t");
201
resultp5=strtok(NULL," \n\t");
202
if((resultp4!=NULL)&&(resultp5==NULL)){
203
// Parse all 4 points in quad
204
parseface(resultp1,localquadlist,localquadlistnormal,localquadlistuv,quadcount*4,texturecount,normalcount);
205
parseface(resultp2,localquadlist,localquadlistnormal,localquadlistuv,(quadcount*4)+1,texturecount,normalcount);
206
parseface(resultp3,localquadlist,localquadlistnormal,localquadlistuv,(quadcount*4)+2,texturecount,normalcount);
207
parseface(resultp4,localquadlist,localquadlistnormal,localquadlistuv,(quadcount*4)+3,texturecount,normalcount);
211
}else if((resultp3!=NULL)&&(resultp4==NULL)){
213
// Parse all 3 points in triangle
214
parseface(resultp1,localtrianglelist,localtrianglelistnormal,localtrianglelistuv,trianglecount*3,texturecount,normalcount);
215
parseface(resultp2,localtrianglelist,localtrianglelistnormal,localtrianglelistuv,(trianglecount*3)+1,texturecount,normalcount);
216
parseface(resultp3,localtrianglelist,localtrianglelistnormal,localtrianglelistuv,(trianglecount*3)+2,texturecount,normalcount);
221
}else if(strcmp(result,"g")==0){
222
if(result=strtok(NULL," \n\t")){
223
if(!strcmp(openobj,result)){
229
//-------------------------
238
vertexlist=(float *)malloc(sizeof(float)*vertcount*3);
239
normallist=(float *)malloc(sizeof(float)*vertcount*3);
240
uvlist=(float *)malloc(sizeof(float)*vertcount*2);
241
trianglelist=(int *)malloc(sizeof(int)*trianglecount*3);
242
quadlist=(int *)malloc(sizeof(int)*quadcount*4);
244
// Copy data from Per Face model to Per Vertex model first for triangles and then for quads
246
// If there are triangle normals, copy triangle normal data
248
printf("Msg: Copying Triangle Normals: %i / %i !\n",normalcount,trianglecount);
249
for(i=0;i<trianglecount*3;i++){
251
normallist[localtrianglelist[i]*3]=localnormallist[localtrianglelistnormal[i]*3];
253
normallist[(localtrianglelist[i]*3)+1]=localnormallist[(localtrianglelistnormal[i]*3)+1];
255
normallist[(localtrianglelist[i]*3)+2]=localnormallist[(localtrianglelistnormal[i]*3)+2];
257
for(i=0;i<quadcount*4;i++){
259
normallist[localquadlist[i]*3]=localnormallist[localquadlistnormal[i]*3];
261
normallist[(localquadlist[i]*3)+1]=localnormallist[(localquadlistnormal[i]*3)+1];
263
normallist[(localquadlist[i]*3)+2]=localnormallist[(localquadlistnormal[i]*3)+2];
266
printf("Msg: No Triangle Normals to Copy\n");
269
// If there are triangle uv coordinates, copy uv coordinate data
271
printf("Msg: Copying Triangle UV Coordinates: %i / %i !\n",texturecount,trianglecount);
272
for(i=0;i<trianglecount*3;i++){
274
uvlist[localtrianglelist[i]*3]=localuvlist[localtrianglelistuv[i]*3];
276
uvlist[(localtrianglelist[i]*3)+1]=localuvlist[(localtrianglelistuv[i]*3)+1];
278
for(i=0;i<quadcount*4;i++){
280
uvlist[localquadlist[i]*3]=localuvlist[localquadlistuv[i]*3];
282
uvlist[(localquadlist[i]*3)+1]=localuvlist[(localquadlistuv[i]*3)+1];
285
printf("Msg: No Triangle UV Coordinates to Copy\n");
291
printf("--------------------------------\n");
292
printf("Saving JSON Object file: %s\n", outputfile);
293
printf("--------------------------------\n");
295
// Process data to JSON
298
printf("\"vertexPositions\" : [");
299
for(i=0;i<(vertcount*3);i++){
300
if(i<((vertcount*3)-1)) {
301
printf("%f,",localvertexlist[i]);
303
printf("%f",localvertexlist[i]);
308
printf("\"vertexNormals\" : [");
310
for(i=0;i<(vertcount*3);i++){
311
if(i<((vertcount*3)-1)) {
312
printf("%f,",normallist[i]);
314
printf("%f",normallist[i]);
320
printf("\"vertexTextureCoords\" : [");
322
for(i=0;i<(vertcount*2);i++){
323
if(i<((vertcount*2)-1)) {
324
printf("%f,",uvlist[i]);
326
printf("%f",uvlist[i]);
332
printf("\"indices\" : [");
335
for(i=0;i<(trianglecount*3);i++){
336
if(i<((trianglecount*3)-1)) {
337
printf("%i,",localtrianglelist[i]);
339
printf("%i",localtrianglelist[i]);
344
for(i=0;i<quadcount;i++){
345
if(i==(quadcount-1)) {
346
printf("%i,%i,%i,%i,%i,%i,",localquadlist[i],localquadlist[i+1],localquadlist[i+2],localquadlist[i+2],localquadlist[i+3],localquadlist[i]);
348
printf("%i,%i,%i,%i,%i,%i ",localquadlist[i],localquadlist[i+1],localquadlist[i+2],localquadlist[i+2],localquadlist[i+3],localquadlist[i]);
357
free(localvertexlist);
358
free(localnormallist);
360
free(localtrianglelist);
361
free(localtrianglelistuv);
362
free(localtrianglelistnormal);
364
free(localquadlistuv);
365
free(localquadlistnormal);
369
printf("Error: Object did not contain any triangles or quads!\n");
375
printf("Error: Failed to find object %s!\n",openobj);
377
printf("Msg: Sucessful Parsing of Object %s in File %s\nMsg: %i vertices %i normals %i texture coordinates %i faces (%i triangles %i quads %i polys)\n",openobj,objfilename,vertcount,normalcount,texturecount,facecount,trianglecount,quadcount,polycount);
381
printf("Error: Failed to open %s!\n",objfilename);
387
int main (int argc, char** argv) {
390
printf("ERROR: not enough arguments. must have LOADFILE and SAVEFILE and if you want to process only a specific object, the name of object to process\n");
394
printf("--------------------------------\n");
395
printf("Loading Wavefront Object file: %s\n", argv[1]);
396
printf("--------------------------------\n");
399
printf("Msg: Loading Object: %s\n", argv[3]);
400
loadobj(argv[1],argv[3],argv[2]);
402
printf("Msg: Loading all Objects\n");
403
loadobj(argv[1],"ALL",argv[2]);
b'\\ No newline at end of file'