/* datread.c read and write Utah Graphics ASCII data *.dat of *.det */ /* also clean so that normals work. */ #include "datread.h" // defines dpts // typedef struct {float x; float y; float z;} dpts; #undef abs #define abs(x) (((x)<0.0)?(-(x)):(x)) int datread(char filename[], dpts * *data_points, int *num_points, int * *data_polys, int *num_polys, float *size) { FILE * infile; /* input file name, parameter */ int i, j, k, pts, pt; char input_line[255]; int debug = 0; *size = 0.0; if(debug) printf("datread open %s for reading\n", filename); infile = fopen(filename, "r"); if(infile == NULL) { printf("could not open %s for reading\n", filename); return 1; } fgets(input_line, 254, infile); if(debug) printf("first line %s \n", input_line); if(!strncmp("data", input_line, 4)) { sscanf(input_line, "data%d %d", num_points, num_polys); } else { sscanf(input_line, "%d %d", num_points, num_polys); } if(debug) printf("num_points=%d, num_polys=%d\n", *num_points, *num_polys); *data_points = (dpts *)malloc(sizeof(dpts)*(*num_points)); *data_polys = (int *)malloc(sizeof(int)*11*((*num_polys)+12)); /* only room polys<=10 on average */ if(*data_points == NULL || *data_polys == NULL) { printf("datread can not allocate enough space for data\n"); return 1; } if(debug) printf("maxk = %d, allocated for polys\n", 6*(*num_polys)+10); for(i=0; i<*num_points; i++) { fgets(input_line, 254, infile); sscanf(input_line, "%f %f %f", &((*data_points)[i].x), &((*data_points)[i].y), &((*data_points)[i].z)); if(debug) printf("i=%d, x=%f, y=%f, z=%f\n", i+1, (*data_points)[i].x, (*data_points)[i].y, (*data_points)[i].z); if(abs((*data_points)[i].x)>*size) *size = abs((*data_points)[i].x); if(abs((*data_points)[i].y)>*size) *size = abs((*data_points)[i].y); if(abs((*data_points)[i].z)>*size) *size = abs((*data_points)[i].z); } if(debug) printf("scaling size=%g\n", *size); /* set size = size * 1.2; for spinning */ /* set position[2] = 1.2*size; for spinning */ /* use num_polys to read in surfaces */ k = 0; for(i=0; i<*num_polys; i++) { fgets(input_line, 254, infile); sscanf(input_line, "%d", &pts); (*data_polys)[k] = pts; k += 1; if(debug) printf("poly of pts=%d\n", pts); if(pts==2) { sscanf(input_line, "%d %d %d", &pt, &((*data_polys)[k]), &((*data_polys)[k+1]) ); if(debug) printf("poly %d %d %d\n", pt, (*data_polys)[k], (*data_polys)[k+1]); k += 2; } if(pts==3) { sscanf(input_line, "%d %d %d %d", &pt, &((*data_polys)[k]), &((*data_polys)[k+1]), &((*data_polys)[k+2])); if(debug) printf("poly %d %d %d %d\n", pt, (*data_polys)[k], (*data_polys)[k+1], (*data_polys)[k+2]); k += 3; } if(pts==4) { sscanf(input_line, "%d %d %d %d %d", &pt, &((*data_polys)[k]), &((*data_polys)[k+1]), &((*data_polys)[k+2]), &((*data_polys)[k+3]) ); if(debug) printf("poly %d %d %d %d %d\n", pt, (*data_polys)[k], (*data_polys)[k+1], (*data_polys)[k+2], (*data_polys)[k+3]); k += 4; } if(pts==5) { sscanf(input_line, "%d %d %d %d %d %d", &pt, &((*data_polys)[k]), &((*data_polys)[k+1]), &((*data_polys)[k+2]), &((*data_polys)[k+3]), &((*data_polys)[k+4]) ); if(debug) printf("poly %d %d %d %d %d %d\n", pt, (*data_polys)[k], (*data_polys)[k+1], (*data_polys)[k+2], (*data_polys)[k+3], (*data_polys)[k+4]); k += 5; } if(pts==6) { sscanf(input_line, "%d %d %d %d %d %d %d", &pt, &((*data_polys)[k]), &((*data_polys)[k+1]), &((*data_polys)[k+2]), &((*data_polys)[k+3]), &((*data_polys)[k+4]), &((*data_polys)[k+5]) ); if(debug) printf("poly %d %d %d %d %d %d %d\n", pt, (*data_polys)[k], (*data_polys)[k+1], (*data_polys)[k+2], (*data_polys)[k+3], (*data_polys)[k+4], (*data_polys)[k+5]); k += 6; } if(pts==7) { sscanf(input_line, "%d %d %d %d %d %d %d %d", &pt, &((*data_polys)[k]), &((*data_polys)[k+1]), &((*data_polys)[k+2]), &((*data_polys)[k+3]), &((*data_polys)[k+4]), &((*data_polys)[k+5]), &((*data_polys)[k+6]) ); if(debug) printf("poly %d %d %d %d %d %d %d %d\n", pt, (*data_polys)[k], (*data_polys)[k+1], (*data_polys)[k+2], (*data_polys)[k+3], (*data_polys)[k+4], (*data_polys)[k+5], (*data_polys)[k+6]); k += 7; } if(pts==8) { sscanf(input_line, "%d %d %d %d %d %d %d %d %d", &pt, &((*data_polys)[k]), &((*data_polys)[k+1]), &((*data_polys)[k+2]), &((*data_polys)[k+3]), &((*data_polys)[k+4]), &((*data_polys)[k+5]), &((*data_polys)[k+6]), &((*data_polys)[k+7]) ); if(debug) printf("poly %d %d %d %d %d %d %d %d %d\n", pt, (*data_polys)[k], (*data_polys)[k+1], (*data_polys)[k+2], (*data_polys)[k+3], (*data_polys)[k+4], (*data_polys)[k+5], (*data_polys)[k+6], (*data_polys)[k+7]); k += 8; } if(pts==9) { sscanf(input_line, "%d %d %d %d %d %d %d %d %d %d", &pt, &((*data_polys)[k]), &((*data_polys)[k+1]), &((*data_polys)[k+2]), &((*data_polys)[k+3]), &((*data_polys)[k+4]), &((*data_polys)[k+5]), &((*data_polys)[k+6]), &((*data_polys)[k+7]), &((*data_polys)[k+8]) ); if(debug) printf("poly %d %d %d %d %d %d %d %d %d %d\n", pt, (*data_polys)[k], (*data_polys)[k+1], (*data_polys)[k+2], (*data_polys)[k+3], (*data_polys)[k+4], (*data_polys)[k+5], (*data_polys)[k+6], (*data_polys)[k+7], (*data_polys)[k+8]); k += 9; } if(pts==10) { sscanf(input_line, "%d %d %d %d %d %d %d %d %d %d %d", &pt, &((*data_polys)[k]), &((*data_polys)[k+1]), &((*data_polys)[k+2]), &((*data_polys)[k+3]), &((*data_polys)[k+4]), &((*data_polys)[k+5]), &((*data_polys)[k+6]), &((*data_polys)[k+7]), &((*data_polys)[k+8]), &((*data_polys)[k+9]) ); if(debug) printf("poly %d %d %d %d %d %d %d %d %d %d %d\n", pt, (*data_polys)[k], (*data_polys)[k+1], (*data_polys)[k+2], (*data_polys)[k+3], (*data_polys)[k+4], (*data_polys)[k+5], (*data_polys)[k+6], (*data_polys)[k+7], (*data_polys)[k+8], (*data_polys)[k+9]); k += 10; } if(pts>10) { printf("datread.c fails with pts>10 \n"); return 1; } } fclose(infile); return 0; } /* end datread */ int datwrite(char filename[], dpts * data_points, int num_points, int * data_polys, int num_polys) { FILE * outfile; /* output file name, parameter */ int i, j, k, pts, pt; int debug = 0; if(debug) printf("open %s for writing\n", filename); outfile = fopen(filename, "w"); if(outfile == NULL) { printf("could not open %s for writing\n", filename); return 1; } fprintf(outfile, "%d %d \n", num_points, num_polys); for(i=0; i