Mercurial > hg > forks > pwpunix
diff final_isi/3d.c @ 69:c13a2f8c5b10
Rename files and some minor cleanups.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 01 Jun 2012 17:41:15 +0300 |
parents | final_isi/fisi3d.c@53676367d46f |
children | e76a4e19363d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/final_isi/3d.c Fri Jun 01 17:41:15 2012 +0300 @@ -0,0 +1,383 @@ +#include "wrapper.h" + +/*****/ + +char txr_wsygn[16*16]={ /* syaani/sininen. hieno. parempi keltapunas„vyiss„? */ +0x11,0x19,0x97,0x97,0x97,0x11,0x11,0x11,0x79,0x97,0x97,0x97,0x11,0x11,0x11,0x11, +0x11,0x79,0x97,0x97,0x97,0x79,0x19,0x11,0x79,0x97,0x97,0x97,0x11,0x19,0x11,0x11, +0x11,0x11,0x91,0x97,0x97,0x97,0x19,0x11,0x19,0x97,0x97,0x97,0x79,0x19,0x11,0x11, +0x11,0x19,0x79,0x97,0x97,0x97,0x19,0x11,0x11,0x91,0x97,0x97,0x97,0x19,0x11,0x11, +0x11,0x91,0x97,0x97,0x97,0x91,0x11,0x11,0x19,0x79,0x97,0x97,0x97,0x79,0x11,0x11, +0x11,0x19,0x97,0x77,0x97,0x11,0x11,0x11,0x19,0x97,0x97,0x97,0x91,0x19,0x11,0x11, +0x11,0x79,0x97,0x97,0x97,0x97,0x79,0x19,0x11,0x97,0x97,0x97,0x79,0x19,0x11,0x11, +0x11,0x11,0x91,0x97,0x77,0x97,0x19,0x11,0x11,0x91,0x97,0x97,0x97,0x79,0x10,0x10, +0x11,0x11,0x11,0x97,0x77,0x97,0x19,0x11,0x11,0x11,0x97,0x77,0x97,0x11,0x11,0x10, +0x11,0x19,0x79,0x97,0x97,0x97,0x19,0x11,0x19,0x79,0x97,0x97,0x97,0x19,0x11,0x10, +0x11,0x19,0x97,0x97,0x97,0x91,0x11,0x11,0x19,0x97,0x97,0x97,0x91,0x19,0x11,0x10, +0x11,0x19,0x97,0x77,0x97,0x11,0x11,0x11,0x11,0x97,0x77,0x97,0x79,0x19,0x11,0x11, +0x11,0x79,0x97,0x97,0x97,0x79,0x19,0x11,0x10,0x97,0x97,0x97,0x97,0x19,0x11,0x11, +0x11,0x11,0x91,0x97,0x97,0x97,0x19,0x11,0x19,0x79,0x97,0x97,0x97,0x11,0x11,0x11, +0x11,0x19,0x79,0x97,0x97,0x97,0x19,0x11,0x19,0x97,0x97,0x97,0x91,0x19,0x11,0x11, +0x11,0x79,0x97,0x97,0x97,0x79,0x19,0x11,0x79,0x97,0x97,0x97,0x79,0x19,0x11,0x10 +}; + + +char txr_dunneon[16*16]={ /* neonjuovia. k„ytett„v„. */ +0x80,0x80,0x80,0x08,0x80,0x80,0x80,0x08,0x80,0x80,0x80,0x08,0x80,0x80,0x80,0x80, +0x80,0x80,0x80,0x00,0x08,0x80,0x80,0x08,0x80,0x80,0x80,0x08,0x80,0x80,0x80,0x80, +0x80,0x80,0x08,0x00,0x80,0x80,0x80,0x08,0x80,0x80,0x80,0x08,0x80,0x80,0x80,0x80, +0x80,0x80,0x80,0x00,0x08,0x80,0x80,0x00,0x80,0x80,0x80,0x08,0x80,0x80,0x80,0x80, +0x80,0x80,0x80,0x08,0x80,0x80,0x08,0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x80, +0x80,0x80,0x80,0x08,0x80,0x80,0x08,0x00,0x80,0x80,0x80,0x00,0x08,0x80,0x80,0x80, +0x80,0x80,0x08,0x00,0x80,0x80,0x08,0x00,0x80,0x80,0x80,0x00,0x08,0x80,0x80,0x80, +0x80,0x80,0x08,0x00,0x80,0x80,0x08,0x08,0x80,0x80,0x80,0x08,0x08,0x80,0x80,0x80, +0x80,0x80,0x08,0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x08,0x80,0x80,0x80,0x80, +0x80,0x80,0x80,0x08,0x80,0x80,0x80,0x08,0x80,0x80,0x80,0x08,0x80,0x80,0x80,0x80, +0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x80, +0x80,0x80,0x08,0x00,0x08,0x80,0x80,0x08,0x80,0x80,0x80,0x00,0x08,0x80,0x80,0x80, +0x80,0x80,0x80,0x00,0x08,0x80,0x80,0x08,0x80,0x80,0x08,0x00,0x08,0x80,0x80,0x80, +0x80,0x80,0x08,0x00,0x80,0x80,0x80,0x08,0x80,0x80,0x08,0x08,0x08,0x80,0x80,0x80, +0x80,0x80,0x80,0x08,0x80,0x80,0x80,0x08,0x80,0x80,0x80,0x00,0x08,0x80,0x80,0x80, +0x80,0x80,0x80,0x08,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x08,0x80,0x80,0x80,0x80 +}; + +char txr_unneon[16*16]={ +0x78,0x78,0x78,0x07,0x78,0x78,0x78,0x07,0x78,0x78,0x78,0x07,0x78,0x78,0x78,0x78, +0x78,0x78,0x78,0x00,0x07,0x78,0x78,0x07,0x78,0x78,0x78,0x07,0x78,0x78,0x78,0x78, +0x78,0x78,0x07,0x00,0x78,0x78,0x78,0x07,0x78,0x78,0x78,0x07,0x78,0x78,0x78,0x78, +0x78,0x78,0x78,0x00,0x07,0x78,0x78,0x00,0x78,0x78,0x78,0x07,0x78,0x78,0x78,0x78, +0x78,0x78,0x78,0x07,0x78,0x78,0x07,0x00,0x78,0x78,0x78,0x00,0x78,0x78,0x78,0x78, +0x78,0x78,0x78,0x07,0x78,0x78,0x07,0x00,0x78,0x78,0x78,0x00,0x07,0x78,0x78,0x78, +0x78,0x78,0x07,0x00,0x78,0x78,0x07,0x00,0x78,0x78,0x78,0x00,0x07,0x78,0x78,0x78, +0x78,0x78,0x07,0x00,0x78,0x78,0x07,0x07,0x78,0x78,0x78,0x07,0x07,0x78,0x78,0x78, +0x78,0x78,0x07,0x00,0x78,0x78,0x78,0x00,0x78,0x78,0x78,0x07,0x78,0x78,0x78,0x78, +0x78,0x78,0x78,0x07,0x78,0x78,0x78,0x07,0x78,0x78,0x78,0x07,0x78,0x78,0x78,0x78, +0x78,0x78,0x78,0x00,0x78,0x78,0x78,0x00,0x78,0x78,0x78,0x00,0x78,0x78,0x78,0x78, +0x78,0x78,0x07,0x00,0x07,0x78,0x78,0x07,0x78,0x78,0x78,0x00,0x07,0x78,0x78,0x78, +0x78,0x78,0x78,0x00,0x07,0x78,0x78,0x07,0x78,0x78,0x07,0x00,0x07,0x78,0x78,0x78, +0x78,0x78,0x07,0x00,0x78,0x78,0x78,0x07,0x78,0x78,0x07,0x07,0x07,0x78,0x78,0x78, +0x78,0x78,0x78,0x07,0x78,0x78,0x78,0x07,0x78,0x78,0x78,0x00,0x07,0x78,0x78,0x78, +0x78,0x78,0x78,0x07,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x07,0x78,0x78,0x78,0x78 +}; + +char txr_neon[16*16]={ +0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x5c,0x04,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00, +0x00,0x00,0x04,0x5c,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x5c,0x04,0x00,0x00,0x5c,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x5c,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x5c,0x00,0x00,0x00,0x5c,0x04,0x00,0x00,0x00, +0x00,0x00,0x04,0x5c,0x00,0x00,0x04,0x5c,0x00,0x00,0x00,0x5c,0x04,0x00,0x00,0x00, +0x00,0x00,0x04,0x5c,0x00,0x00,0x04,0x40,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x00, +0x00,0x00,0x04,0x5c,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x00, +0x00,0x00,0x04,0x5c,0x04,0x00,0x00,0x40,0x00,0x00,0x00,0x5c,0x04,0x00,0x00,0x00, +0x00,0x00,0x00,0x5c,0x04,0x00,0x00,0x40,0x00,0x00,0x04,0x5c,0x04,0x00,0x00,0x00, +0x00,0x00,0x04,0x5c,0x00,0x00,0x00,0x04,0x00,0x00,0x04,0x40,0x04,0x00,0x00,0x00, +0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x5c,0x04,0x00,0x00,0x00, +0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00 +}; + +char txr_gslime[16*16]={ +0x88,0x80,0x00,0x80,0x80,0x88,0x88,0x88,0x80,0x08,0x00,0x00,0x08,0x88,0x80,0x00, +0x80,0x08,0x00,0x08,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x80,0x88,0x80,0x08,0x00, +0x08,0x00,0x00,0x00,0x08,0x08,0x80,0x00,0x00,0x00,0x08,0x80,0x80,0x00,0x00,0x88, +0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x80,0x00,0x08,0x88,0x80, +0x00,0x08,0x80,0x08,0x00,0x00,0x08,0x88,0x88,0x88,0x00,0x80,0x00,0x08,0x80,0x00, +0x08,0x80,0x80,0x08,0x00,0x08,0x80,0x88,0x88,0x88,0x08,0x80,0x00,0x00,0x00,0x08, +0x88,0x88,0x88,0x80,0x00,0x08,0x80,0x88,0x88,0x88,0x80,0x80,0x00,0x00,0x08,0x80, +0x88,0x88,0x80,0x80,0x00,0x00,0x08,0x80,0x80,0x08,0x00,0x00,0x00,0x80,0x88,0x88, +0x88,0x88,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x88,0x88, +0x80,0x80,0x00,0x00,0x08,0x08,0x00,0x00,0x08,0x80,0x80,0x80,0x80,0x80,0x08,0x88, +0x08,0x00,0x08,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x08,0x08,0x80,0x80,0x08,0x88, +0x80,0x80,0x80,0x80,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x80, +0x88,0x88,0x88,0x88,0x88,0x80,0x80,0x80,0x08,0x08,0x00,0x00,0x08,0x08,0x00,0x80, +0x88,0x88,0x88,0x88,0x88,0x80,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00, +0x88,0x88,0x88,0x08,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x00,0x00,0x80,0x80,0x00, +0x88,0x08,0x00,0x00,0x00,0x00,0x08,0x08,0x80,0x80,0x80,0x08,0x00,0x88,0x80,0x80 +}; + +char txr_slime[16*16]={ /* vihre„ laikukas. hienokiva. */ +0x22,0x20,0x00,0x20,0x20,0x22,0x22,0x22,0x20,0x02,0x00,0x00,0x02,0x22,0x20,0x00, +0x20,0x02,0x00,0x02,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x20,0x22,0x20,0x02,0x00, +0x02,0x00,0x00,0x00,0x02,0x02,0x20,0x00,0x00,0x00,0x02,0x20,0x20,0x00,0x00,0x22, +0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x20,0x00,0x02,0x22,0x20, +0x00,0x02,0x20,0x02,0x00,0x00,0x02,0x22,0x22,0x22,0x00,0x20,0x00,0x02,0x20,0x00, +0x02,0x20,0x20,0x02,0x00,0x02,0x20,0x22,0x22,0x22,0x02,0x20,0x00,0x00,0x00,0x02, +0x22,0x22,0x22,0x20,0x00,0x02,0x20,0x22,0x22,0x22,0x20,0x20,0x00,0x00,0x02,0x20, +0x22,0x22,0x20,0x20,0x00,0x00,0x02,0x20,0x20,0x02,0x00,0x00,0x00,0x20,0x22,0x22, +0x22,0x22,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x22,0x22, +0x20,0x20,0x00,0x00,0x02,0x02,0x00,0x00,0x02,0x20,0x20,0x20,0x20,0x20,0x02,0x22, +0x02,0x00,0x02,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x02,0x02,0x20,0x20,0x02,0x22, +0x20,0x20,0x20,0x20,0x02,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20, +0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x20,0x02,0x02,0x00,0x00,0x02,0x02,0x00,0x20, +0x22,0x22,0x22,0x22,0x22,0x20,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, +0x22,0x22,0x22,0x02,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x00,0x20,0x20,0x00, +0x22,0x02,0x00,0x00,0x00,0x00,0x02,0x02,0x20,0x20,0x20,0x02,0x00,0x22,0x20,0x20 +}; + +typedef struct{signed int x,z,y;}xyz; +typedef struct{signed int a,r,y;}cyl; +typedef struct{int p[3]; int nn; char*txrf,*txrb;}face; + +typedef struct{ + + int numvxes; + cyl*vxes; + xyz*rotated; + + int numfaces; + face*faces; + +}obj3d; + +#define sint signed int + +/** XWING **/ + +/* +xyz cube_vxes[]={ + -6000,-1000,2000, + -6000,-1000,-2000, + 6000,-1000,2000, + 6000,-1000,-2000, + + -1500,2000,0, + -1500,-1000,0, + 1500,2000,0, + 1500,-100,0, + + 0,2500,0, + + 0,1000,-1500 +}; + +face cube_faces[]={ + 0,4,5, 0, txr_wsygn,txr_dunneon, + 1,5,4, 0, txr_wsygn,txr_dunneon, + 2,7,6, 0, txr_wsygn,txr_dunneon, + 3,6,7, 0, txr_wsygn,txr_dunneon, + + 9,8,4, 0, txr_wsygn,NULL, + 9,7,8, 0, txr_wsygn,NULL, + 9,4,5, 0, txr_unneon,NULL, + 9,7,6, 0, txr_unneon,NULL, + 9,5,6, 0, txr_unneon,NULL +}; +*/ + +/********/ +/********/ + +cyl xwing_vxes[]={ + 134,6082,1000, + 134,6082,-1000, + 250,6082,1000, + 250,6082,-1000, + 91,3000,0, /* 2500 */ + 151,1802,0, + 37,3000,0, /* 2500 */ + 254,1503,0, + 64,2500,0, + 64,1000,-750 +}; + +face xwing_faces[]={ + 4,5,0, 0, txr_wsygn,txr_dunneon, + 1,5,4, 0, txr_wsygn,txr_dunneon, + 7,6,2, 0, txr_wsygn,txr_dunneon, + 3,6,7, 0, txr_wsygn,txr_dunneon, + + 9,8,4, 0, txr_wsygn,NULL, + 9,7,8, 0, txr_wsygn,NULL, + 9,4,5, 0, txr_unneon,NULL, + 9,7,6, 0, txr_unneon,NULL, + 9,5,6, 0, txr_unneon,NULL +}; + +obj3d xwing={ + 10,xwing_vxes,NULL,9,xwing_faces +}; + +cyl bugi_vxes[]={ + 96,2828,0, + 32,2828,0, + 224,2828,0, + 160,2828,0, + 0,0,-800, + 45,6708,1000, + 238,6708,1000, + 173,6708,1000, + 110,6708,1000 +}; + +face bugi_faces[]={ + 4,1,0, 0, txr_slime,NULL, + 4,2,1, 0, txr_slime,NULL, + 4,3,2, 0, txr_slime,NULL, + 4,0,3, 0, txr_slime,NULL, + + 0,1,5, 0, txr_slime,txr_gslime, + 1,2,6, 0, txr_slime,txr_gslime, + 2,3,7, 0, txr_slime,txr_gslime, + 3,0,8, 0, txr_slime,txr_gslime +}; + +obj3d bugi={ + 9,bugi_vxes,NULL,8,bugi_faces +}; + +obj3d obu; + +#include "sini16.h" + +sint dvhtab[50]; +sint dutab[320]; + +eggine_init() +{ + int i; + dvhtab[0]=32760; + for(i=1;i<50;i++)dvhtab[i]=4096/i; + dutab[0]=32760; + for(i=1;i<320;i++)dutab[i]=(64*256)/i; +} + +eggine_load(sint n) +{ + obj3d*o; + if(!n)o=&xwing;else o=&bugi; + + if(o->rotated==NULL) + o->rotated=malloc(o->numvxes*sizeof(xyz)); + + memcpy(&obu,o,sizeof(obu)); +} + +extern int polytxloop + (sint h,char*di,unsigned int x1,sint dx0,sint dx1,char*txr, + sint dv,sint du); + +sint polytxr( + char*buf, + sint y,sint h,sint x0,sint x1,sint dx0,sint dx1, + char*txr){ + + register sint du; char joo=0; + + if(y+h>=50)h=49-y; + if(h>0)if(y>=0){ + + if((x0>x1)||((x0==x1)&&(dx0>dx1))) + {sint tmp=x0;x0=x1;x1=tmp; + tmp=dx0;dx0=dx1;dx1=tmp; + joo=1;} + x1-=x0;dx1-=dx0; + + du=x1>>6; + if(!du)du=((dx1-dx0)*h) >>6; /* dx1-dx0?? */ + if(du)du=(64*256)/du;/*dutab[du];*/ + + x1=polytxloop(h,buf+80*y+(x0>>8), + x1, + dx0, + dx1, + txr, + dvhtab[h], + du); + + return (!joo)?x0+x1+h*dx0:x1; + } +} + +/*******************************/ + +extern signed int mul32(signed int a,signed int b); + +#define jmul32(a,b) (((long)(a)*(long)(b))>>16) + +eggine_do(char*b,sint rot,int zoom,int basex,int basey) { + register sint i; sint j; sint fzed[20],fcez[20]; + + if(obu.faces==bugi_faces){ + bugi_vxes[5].y=bugi_vxes[6].y= + 1000+mul32(700,sini16[(taimeri*13)&255]); + bugi_vxes[7].y=bugi_vxes[8].y= + 1000+mul32(700,sini16[(taimeri*7)&255]); + } + + /***** rotate vertices *****/ + + {cyl*v=obu.vxes;xyz*r=obu.rotated; + + for(i=obu.numvxes;i;i--) { + r->y=mul32(v->y,zoom)+basey; + r->x=mul32(mul32(v->r,sini16[(rot+v->a)&255]),zoom)+basex; + r->z=mul32(mul32(v->r,sini16[(rot+v->a+64)&255]),zoom); + r++;v++; + }} + + /***** calc facezeds, sort faces *****/ + + {sint *t=fzed;face*f=obu.faces; for(i=obu.numfaces;i;i--){ + *t++=obu.rotated[f->p[0]].z+ obu.rotated[f->p[1]].z+ + obu.rotated[f->p[2]].z; f++; + }} + + {sint *t=fcez;sint j=0; for(i=obu.numfaces;i;i--)*t++=j++; } + + /* stupid bubblesort */ + +for(i=0;i<obu.numfaces-1;i++){ sint min=fzed[i],where=i; +for(j=i+1;j<obu.numfaces;j++){ + if(fzed[j]<min){min=fzed[j];where=j;} } + + {sint tmp=fzed[i];fzed[i]=fzed[where];fzed[where]=tmp;} {sint + tmp=fcez[i];fcez[i]=fcez[where];fcez[where]=tmp;} + } + + /***** draw faces *****/ + + {sint*fc=fcez; for(i=obu.numfaces;i;i--) { + face*f=&obu.faces[*fc++]; + + { sint x0,x1,x2,y0,y1,y2,nz; char*txr; + + /***************************************/ + + {xyz*tmp=obu.rotated; + x0=tmp[f->p[0]].x<<3; + y0=tmp[f->p[0]].y>>5; + x1=tmp[f->p[1]].x<<3; + y1=tmp[f->p[1]].y>>5; + x2=tmp[f->p[2]].x<<3; + y2=tmp[f->p[2]].y>>5; + } + + nz=((x1-x0)>>8)*(y2-y0)-((x2-x0)>>8)*(y1-y0); + if(nz<0)txr=f->txrf;else txr=f->txrb; + if(txr!=NULL) + { + + if(y0!=y2){ + + sint tmpk,tmpx2; + + if (y0!=y1) + tmpx2=polytxr(b,y0,y1-y0,x0,x0, + (x1-x0)/(y1-y0), + tmpk=(x2-x0)/(y2-y0), txr); + else {tmpk=(x2-x0)/(y2-y0);tmpx2=x0;} + + if (y1!=y2) + polytxr(b,y1,y2-y1,x1,tmpx2, + (x2-x1)/(y2-y1), + tmpk, txr); + } + } + /***************************************/ + } + + }}/* end drawfaces*/ +}