#include #include #include "c.h" #define GCHAR *(((char *)d)++) #define GINT *(((int *)d)++) #define GLONG *(((long *)d)++) object * vis_loadobject(char *fname) { int error; int a,b,c; object *o; long l; char *d,*d0; d=readfile(fname); o=getmem(sizeof(object)); o->flags=F_DEFAULT; o->r=getmem(sizeof(rmatrix)); o->r0=getmem(sizeof(rmatrix)); memset(o->r,0,sizeof(rmatrix)); memset(o->r0,0,sizeof(rmatrix)); o->vnum=0; o->nnum=0; o->v0=NULL; o->n0=NULL; o->v=NULL; o->n=NULL; o->pv=NULL; o->plnum=1; for(;;) { error=0; d0=d; d+=8; if(!memcmp(d0,"END ",4)) break; else if(!memcmp(d0,"VERS",4)) { a=GINT; if(a!=0x100) { printf("Version not 1.00\n"); } } else if(!memcmp(d0,"NAME",4)) { o->name=(char *)d; } else if(!memcmp(d0,"VERT",4)) { o->vnum=GINT; GINT; o->v0=(vlist *)d; o->v=getmem(sizeof(vlist)*o->vnum); o->pv=getmem(sizeof(pvlist)*o->vnum); } else if(!memcmp(d0,"NORM",4)) { o->nnum=GINT; o->nnum1=GINT; o->n0=(nlist *)d; o->n=getmem(sizeof(vlist)*o->nnum); } else if(!memcmp(d0,"POLY",4)) { o->pd=(polydata *)d; } else if(!memcmp(d0,"ORD",3)) { a=d0[3]; if(a=='0') b=0; else if(a=='E') b=o->plnum++; else error=1; if(!error) { o->pl[b]=(polylist *)d; } } else error=1; if(error) { printf("Unknown block: %c%c%c%c\n",d0[0],d0[1],d0[2],d0[3]); } l=*(long *)(d0+4); d=d0+l+8; } #if 0 printf("Sortlists: "); for(a=0;a<9;a++) printf("%i ",o->plv[a]); printf("Vertices: %i (%Fp=>%Fp=>%Fp)\n",o->vnum,o->v0,o->v,o->pv); printf("Normals: %i (%Fp=>%Fp)\n",o->nnum,o->n0,o->n); getch(); #endif return(o); } void vis_drawobject(object *o) { int a,b,c; long al,bl; nlist *n; int *ijp; if(!(o->flags&F_VISIBLE)) return; calc_rotate(o->vnum,o->v,o->v0,o->r); if(o->flags&F_GOURAUD) calc_nrotate(o->nnum,o->n,o->n0,o->r); else calc_nrotate(o->nnum1,o->n,o->n0,o->r); o->vf=calc_project(o->vnum,o->pv,o->v); if(o->vf) return; // object was completely out of screen a=0; al=0x7fffffffL; for(b=1;bplnum;b++) { c=o->pl[b][1]; bl=(o->v+c)->z; if(blpl[a],o->pd,o->v,o->pv,o->n,o->flags); } #define determ(c1,c2,r1,r2) (m[c1+r1*3]*m[c2+r2*3]-m[c1+r2*3]*m[c2+r1*3]) int calc_invrmatrix(rmatrix *r) { double m0[9]; double m[9]; double d[9]; double det; int a,x,y; for(a=0;a<9;a++) m[a]=m0[a]=((double)r->m[a])/UNIT; d[0]= determ(1,2,1,2); d[1]=-determ(0,2,1,2); d[2]= determ(0,1,1,2); d[3]=-determ(1,2,0,2); d[4]= determ(0,2,0,2); d[5]=-determ(0,1,0,2); d[6]= determ(1,2,0,1); d[7]=-determ(0,2,0,1); d[8]= determ(0,1,0,1); det=m[0]*d[0]+m[1]*d[1]+m[2]*d[2]; if(det>-0.0001 && det<0.0001) return(0); // could not invert for(x=0;x<3;x++) for(y=0;y<3;y++) { m[y+x*3]=d[x+y*3]/det; } for(a=0;a<9;a++) { r->m[a]=(long)(m[a]*UNIT); } #if 0 printf("\ndet:%10lf\n",det); for(y=0;y<3;y++) { printf("d[] "); for(x=0;x<3;x++) { printf("%6.3lf ",d[x+y*3]); } printf("\n"); } for(y=0;y<3;y++) { for(x=0;x<3;x++) { printf("%6.3lf ",m0[x+y*3]); } printf("* "); for(x=0;x<3;x++) { printf("%6.3lf ",m[x+y*3]); } printf("= "); for(x=0;x<3;x++) { det=m[x+0*3]*m0[0+y*3]+m[x+1*3]*m0[1+y*3]+m[x+2*3]*m0[2+y*3]; printf("%6.3lf ",det); } printf("\n"); } printf("\n"); #endif return((int)(UNIT*det)); }