191 lines
3.5 KiB
C
191 lines
3.5 KiB
C
#include <stdio.h>
|
|
#include <string.h>
|
|
#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;b<o->plnum;b++)
|
|
{
|
|
c=o->pl[b][1];
|
|
bl=(o->v+c)->z;
|
|
if(bl<al)
|
|
{
|
|
al=bl;
|
|
a=b;
|
|
}
|
|
}
|
|
draw_polylist(o->pl[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));
|
|
}
|
|
|