#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "threed.h" extern UBYTE title[] ; extern struct Custom custom; extern struct TmpRas tmpras; extern struct BitMap bitmap0; extern struct BitMap bitmap1; extern struct RastPort r[2]; extern struct RastPort *rp[2]; extern struct RasInfo ri[2]; extern struct RasInfo *rip[2]; extern struct RasInfo *irip; extern WORD pcount ; extern WORD vcount ; extern UWORD frametoggle ; extern struct Objectinfo *objectinfo ; extern struct Objectinfo *firstobjectinfo ; extern struct Objectinfo *cameraobjectinfo ; extern BPTR objectsegment ; extern struct Object *Amiga ; extern struct UV *cameramatrix ; extern struct Coordinate *cameraposition ; extern long GfxBase; extern long DosBase; int nullproc(); int addvect(); int subvect(); int roll(); int pitch(); int yaw(); int transpose(); int (*subroutines[])() = { nullproc, addvect, subvect, roll, pitch, yaw, transpose, }; /*****************************************************************************/ nullproc() { return(FALSE); } WORD mul3d(a,b) WORD a,b; { LONG c; c = a * b; c += 0x2000; c >>= 14; return((WORD)c); } roll(bm,sine,cosine) struct UV *bm; WORD sine; WORD cosine; { struct UV tmp; tmp.uv11 = (WORD)(mul3d(bm->uv11,cosine)+mul3d(bm->uv21,sine)); tmp.uv21 = (WORD)(mul3d(-bm->uv11,sine)+mul3d(bm->uv21,cosine)); tmp.uv12 = (WORD)(mul3d(bm->uv12,cosine)+mul3d(bm->uv22,sine)); tmp.uv22 = (WORD)(mul3d(-bm->uv12,sine)+mul3d(bm->uv22,cosine)); tmp.uv13 = (WORD)(mul3d(bm->uv13,cosine)+mul3d(bm->uv23,sine)); tmp.uv23 = (WORD)(mul3d(-bm->uv13,sine)+mul3d(bm->uv23,cosine)); bm->uv11 = tmp.uv11; bm->uv21 = tmp.uv21; bm->uv12 = tmp.uv12; bm->uv22 = tmp.uv22; bm->uv13 = tmp.uv13; bm->uv23 = tmp.uv23; } yaw(bm,sine,cosine) struct UV *bm; WORD sine; WORD cosine; { struct UV tmp; tmp.uv11 = (WORD)(mul3d(bm->uv11,cosine)+mul3d(bm->uv31,sine)); tmp.uv31 = (WORD)(mul3d(-bm->uv11,sine)+mul3d(bm->uv31,cosine)); tmp.uv12 = (WORD)(mul3d(bm->uv12,cosine)+mul3d(bm->uv32,sine)); tmp.uv32 = (WORD)(mul3d(-bm->uv12,sine)+mul3d(bm->uv32,cosine)); tmp.uv13 = (WORD)(mul3d(bm->uv13,cosine)+mul3d(bm->uv33,sine)); tmp.uv33 = (WORD)(mul3d(-bm->uv13,sine)+mul3d(bm->uv33,cosine)); bm->uv11 = tmp.uv11; bm->uv31 = tmp.uv31; bm->uv12 = tmp.uv12; bm->uv32 = tmp.uv32; bm->uv13 = tmp.uv13; bm->uv33 = tmp.uv33; } pitch(bm,sine,cosine) struct UV *bm; WORD sine; WORD cosine; { struct UV tmp; tmp.uv21 = (WORD)(mul3d(bm->uv21,cosine)-mul3d(bm->uv31,sine)); tmp.uv31 = (WORD)(mul3d(bm->uv21,sine)+mul3d(bm->uv31,cosine)); tmp.uv22 = (WORD)(mul3d(bm->uv22,cosine)-mul3d(bm->uv32,sine)); tmp.uv32 = (WORD)(mul3d(bm->uv22,sine)+mul3d(bm->uv32,cosine)); tmp.uv23 = (WORD)(mul3d(bm->uv23,cosine)-mul3d(bm->uv33,sine)); tmp.uv33 = (WORD)(mul3d(bm->uv23,sine)+mul3d(bm->uv33,cosine)); bm->uv21 = tmp.uv21; bm->uv31 = tmp.uv31; bm->uv22 = tmp.uv22; bm->uv32 = tmp.uv32; bm->uv23 = tmp.uv23; bm->uv33 = tmp.uv33; } transform(dest) struct Coordinate *dest; { LONG zinv = 0x00400000; dest->z = (dest->z<64) ? 64 : dest->z ; /* dest->x = (WORD)( ((long)dest->x << 8) / dest->z ); */ /* dest->y = (WORD)( ((long)dest->y << 8) / dest->z ); */ /* new algorithm - figure inverse of z and multiply */ zinv /= dest->z; dest->x = mul3d(dest->x,(WORD)zinv); dest->y = mul3d(dest->y,(WORD)zinv); #ifdef DEBUG printf("transform: dest->x = %lx\n",dest->x); printf("transform: dest->y = %lx\n",dest->y); printf("transform: dest->z = %lx\n",dest->z); #endif } perspect(objectnumpoints,objectbufpoints) WORD objectnumpoints; struct Coordinate objectbufpoints[]; { WORD pointcount = 0; struct Coordinate *nextpoint; for(pointcount = 0; pointcount < objectnumpoints; pointcount++) { #ifdef DEBUG printf("perspect: pointcount = %lx\n",pointcount); #endif transform(&objectbufpoints[pointcount]); } } subvect(bp,src,dest) struct Coordinate *bp; struct Coordinate *src; struct Coordinate *dest; { #ifdef DEBUG printf("subvect: src->x = %lx\n",src->x); printf("subvect: src->y = %lx\n",src->y); printf("subvect: src->z = %lx\n",src->z); #endif dest->x = (WORD)(src->x - bp->x); dest->y = (WORD)(src->y - bp->y); dest->z = (WORD)(src->z - bp->z); #ifdef DEBUG printf("subvect: dest->x = %lx\n",dest->x); printf("subvect: dest->y = %lx\n",dest->y); printf("subvect: dest->z = %lx\n",dest->z); #endif } addvect(bp,src,dest) struct Coordinate *bp; struct Coordinate *src; struct Coordinate *dest; { #ifdef DEBUG printf("addvect: src->x = %lx\n",src->x); printf("addvect: src->y = %lx\n",src->y); printf("addvect: src->z = %lx\n",src->z); printf("addvect: bp->x = %lx\n",bp->x); printf("addvect: bp->y = %lx\n",bp->y); printf("addvect: bp->z = %lx\n",bp->z); #endif dest->x = (WORD)(src->x + bp->x); dest->y = (WORD)(src->y + bp->y); dest->z = (WORD)(src->z + bp->z); #ifdef DEBUG printf("addvect: dest->x = %lx\n",dest->x); printf("addvect: dest->y = %lx\n",dest->y); printf("addvect: dest->z = %lx\n",dest->z); #endif } translate(bp,objectnumpoints,objectbufpoints) struct Coordinate *bp; WORD objectnumpoints; struct Coordinate objectbufpoints[]; { WORD pointcount = 0; for(pointcount = 0; pointcount < objectnumpoints; pointcount++) { #ifdef DEBUG printf("translate: pointcount = %lx\n",pointcount); #endif addvect(bp,&objectbufpoints[pointcount],&objectbufpoints[pointcount]); } } transpose(bm) struct UV *bm; { WORD tmp; tmp = bm->uv12; bm->uv12 = bm->uv21; bm->uv21 = tmp; tmp = bm->uv13; bm->uv13 = bm->uv31; bm->uv31 = tmp; tmp = bm->uv23; bm->uv23 = bm->uv32; bm->uv32 = tmp; } cat(dest,src1,src2) struct UV *dest; struct UV *src1; struct UV *src2; { matrix(&dest->uv11,&src1->uv11,src2); matrix(&dest->uv21,&src1->uv21,src2); matrix(&dest->uv31,&src1->uv31,src2); } matrix(dest,src,bm) struct Coordinate *dest; struct Coordinate *src; struct UV *bm; { #ifdef DEBUG printf("matrix: src->x = %lx\n",src->x); printf("matrix: src->y = %lx\n",src->y); printf("matrix: src->z = %lx\n",src->z); #endif dest->x = (WORD)(mul3d(src->x,bm->uv11)+mul3d(src->y,bm->uv12)+mul3d(src->z,bm->uv13)); dest->y = (WORD)(mul3d(src->x,bm->uv21)+mul3d(src->y,bm->uv22)+mul3d(src->z,bm->uv23)); dest->z = (WORD)(mul3d(src->x,bm->uv31)+mul3d(src->y,bm->uv32)+mul3d(src->z,bm->uv33)); #ifdef DEBUG printf("matrix: dest->x = %lx\n",dest->x); printf("matrix: dest->y = %lx\n",dest->y); printf("matrix: dest->z = %lx\n",dest->z); #endif } rotate(bm,objectnumpoints,pointstart,objectbufpoints) struct UV *bm; WORD objectnumpoints; struct Coordinate *pointstart[]; struct Coordinate objectbufpoints[]; { WORD pointcount = 0; for(pointcount = 0; pointcount < objectnumpoints; pointcount++) { #ifdef DEBUG printf("rotate: pointcount = %lx\n",pointcount); #endif matrix(&objectbufpoints[pointcount],pointstart[pointcount],bm); } } copynormals(objectnumpoints,pointstart,objectbufpoints) WORD objectnumpoints; struct Coordinate *pointstart[]; struct Coordinate objectbufpoints[]; { WORD pointcount = 0; for(pointcount = 0; pointcount < objectnumpoints; pointcount++) { #ifdef DEBUG printf("copynormals: pointcount = %lx\n",pointcount); #endif objectbufpoints[pointcount] = *(pointstart[pointcount]); } } camera(bm,bp,objectnumpoints,srcbufpoints,destbufpoints) struct UV *bm; struct Coordinate *bp; WORD objectnumpoints; struct Coordinate srcbufpoints[]; struct Coordinate destbufpoints[]; { WORD pointcount = 0; for(pointcount = 0; pointcount < objectnumpoints; pointcount++) { #ifdef DEBUG printf("camera: pointcount = %lx\n",pointcount); #endif subvect(bp,&destbufpoints[pointcount],&srcbufpoints[pointcount]); matrix(&destbufpoints[pointcount],&srcbufpoints[pointcount],bm); transform(&destbufpoints[pointcount]); } } notransformdopoints(bm,bp,objectnumpoints,pointstart,objectbufpoints) struct UV *bm; struct Coordinate *bp; WORD objectnumpoints; struct Coordinate *pointstart[]; struct Coordinate objectbufpoints[]; { WORD pointcount = 0; for(pointcount = 0; pointcount < objectnumpoints; pointcount++) { #ifdef DEBUG printf("notransformdopoints: pointcount = %lx\n",pointcount); #endif matrix(&objectbufpoints[pointcount],pointstart[pointcount],bm); addvect(bp,&objectbufpoints[pointcount],&objectbufpoints[pointcount]); } } dopoints(bm,bp,objectnumpoints,pointstart,objectbufpoints) struct UV *bm; struct Coordinate *bp; WORD objectnumpoints; struct Coordinate *pointstart[]; struct Coordinate objectbufpoints[]; { WORD pointcount = 0; for(pointcount = 0; pointcount < objectnumpoints; pointcount++) { #ifdef DEBUG printf("dopoints: pointcount = %lx\n",pointcount); #endif matrix(&objectbufpoints[pointcount],pointstart[pointcount],bm); addvect(bp,&objectbufpoints[pointcount],&objectbufpoints[pointcount]); transform(&objectbufpoints[pointcount]); } }