/* waveprep.c wp1.bat = cl /AL waveprep.c getfile reads a wave front formatted file and makes a binary file all numbers are floats verticies normal x1,y1,z1,x2,y2,z2,x3,y3,z3, i1,j1,k1,i2,j2,k2 */ #include #include #include #include "nomouse.h" #define MAX_V 30000 long Max_v=MAX_V; float huge X[MAX_V],huge Y[MAX_V],huge Z[MAX_V]; long load_v(FILE *fpwvf); long load_f(FILE *fp,FILE *fpout,long numv); float dot(float a[3],float b[3]); int cross(float a[3],float b[3], float c[3]); main(int argc,char *argv[]) { int i,j,k; char string[100],cr=0xd,ans,name[100],ans1; FILE *fpwvf,*fpbwv; long numv,numf,numplot; float delang=30,deldist=2.0; if(argc>1) { strcpy(string,argv[1]); strcat(string,".wvf"); } else get_file_name("*.wvf",string,0); printf("File '%s' chosen.\n\n",string); fpwvf=fopen(string,"rt"); if(!fpwvf) { printf("Could not open '%s' to read.\n\n",string); exit(0); } strcpy(name,string); printf("Loading verticies ...\n"); printf("Maximum number allowed = %ld\n",Max_v); numv=load_v(fpwvf); printf("\nThere are %ld verticies.\n\n",numv); if(numv>MAX_V) { printf("\n\nWARNING -- TOO MANY VERTICIES\n\n"); exit(0); } for(k=0;kMax_v) { printf("Too many verticies.\n"); exit(0); } if(n%10==0) printf("%c%ld",cr,n); } } return(n); } /************************************************************************** ** ** ** ** ***************************************************************************/ long load_f(FILE *fp,FILE *fpout,long numv) { int i,j,k; long n=0; char string[100]; char cr=0xd; int xyz[3]; float dat[5][3],a[3],b[3],c[3],len,norm[3]; rewind(fp); while(fgets(string,100,fp)) { if(string[0]=='f') { sscanf(string+1,"%d%d%d",xyz,xyz+1,xyz+2); for(i=0;i<3;i++) { if(xyz[i]>numv||xyz[i]<1) { printf("Illegal vertice number\n\n"); printf("Maximum allowed = %d\n",numv); printf("%s\n",string); printf("%d %d %d\n",xyz[0],xyz[1],xyz[2]); return(-1); } j=xyz[i]-1; dat[i][0]=X[j]; dat[i][1]=Y[j]; dat[i][2]=Z[j]; } for(k=0;k<3;k++) { b[k]=dat[0][k]-dat[1][k]; a[k]=dat[2][k]-dat[1][k]; norm[k]=0.0; } cross(a,b,c); len=sqrt((double)dot(c,c)); if(len>0.0) for(k=0;k<3;k++) c[k]/=len; for(i=0;i<3;i++) for(k=0;k<3;k++) norm[k]+=dat[i][k]/3.0; for(k=0;k<3;k++) { dat[3][k]=norm[k]; dat[4][k]=norm[k]+c[k]; } n+=1; if(n%10==0) printf("%c%ld",cr,n); fwrite((char *)dat,sizeof(float),15,fpout); } } return(n); } /************************************************************************** ** ** ** ** ***************************************************************************/ int cross(float a[3],float b[3], float c[3]) { c[0]=a[1]*b[2]-a[2]*b[1]; c[1]=a[2]*b[0]-a[0]*b[2]; c[2]=a[0]*b[1]-a[1]*b[0]; } /************************************************************************** ** ** ** ** ***************************************************************************/ float dot(float a[3],float b[3]) { float c; c=a[0]*b[0]+a[1]*b[1]+a[2]*b[2]; return(c); }