/* ASC optimization from: char oname[64]; struct s_tmpvx *vx; struct s_tmpfc *fc; int vxnum,fcnum,vxleft,fcleft; to: int facedata[32767],facedatalen; int faceoff[MAXFC],facenum; */ int currentface; int connects[256],connectp; int pvnum; int pv[MAXFACE]; void padd(int v) // add vertex to pv { if(pvnum && pv[pvnum-1]==v) return; pv[pvnum++]=v; if(pvnum>=MAXFACE) { int a; printf("FATAL ERROR: FACE OVERFLOW (SEE REPORT)"); print("FATAL: FACE %i OVERFLOWS (max %i sides) [",currentface,MAXFACE); for(a=0;aused) return; f->used=1; for(cnt=0;cntvv[i]) padd(f->v[i]); else { // find the polygon on side and recurse l=-1; // nothing found v1=f->v[(i==2)?0:i+1]; v2=f->v[i]; for(k=0;kv[i]); } else { connects[connectp++]=k; pexpand(fc+k,l,2); } } i=(i==2)?0:i+1; } } void optimize(void) { int nrm,i,j,flags,a; facedatalen=facenum=0; facedata[facedatalen++]=0; // 'null' face for(j=0;jy-w->y)*(v->z+w->z); y+=(v->z-w->z)*(v->x+w->x); z+=(v->x-w->x)*(v->y+w->y); } dl=sqrt((double)x*(double)x+(double)y*(double)y+(double)z*(double)z); if(dl<-1 || dl>1) { x=-(long)((double)x*NORMALSIZE/dl); y=-(long)((double)y*NORMALSIZE/dl); z=-(long)((double)z*NORMALSIZE/dl); } nrm=addnr(x,y,z); } // write stuff flags=mat[fc[i].material].flags; faceoff[facenum++]=facedatalen*2; // char offset facedata[facedatalen++]=pvnum|flags; // sides | flags facedata[facedatalen++]=mat[fc[i].material].color; // color facedata[facedatalen++]=nrm; // normal for(j=0;j