#include #include #include #include #include #include #include "tweak.h" #define SX sinit[kx] #define SY sinit[ky] #define SZ sinit[kz] #define CX kosinit[kx] #define CY kosinit[ky] #define CZ kosinit[kz] extern far char (* far vmem)[160]; extern char far pal[768]; extern clear(); extern init(); extern shadepal(char far *fpal, char far *ppal, int shade); extern init_copper(); extern close_copper(); extern int far cop_rotatev; extern far int frame_count; extern far char * far cop_pal; extern far int do_pal; extern far int cop_start; extern far int cop_scrl; extern int do_poly(); extern int getspl(int where); extern int far sinit[1024]; extern int far kosinit[1024]; char far fpal[768]; struct object { char name[100]; int pnts; struct points_3d { int x; int y; int z; int xx; int yy; int zz; int xxx; int yyy; } point[256]; int faces; struct polygon { int p1; int p2; int p3; int p4; int p5; int p6; int n; int color; } pg[256]; int lines; struct lines { int p1; int p2; int n; int col; } lin[256]; } object={ "Cube", 8, // points { {125,125,125}, {125,-125,125}, {-125,-125,125}, {-125,125,125}, {125,125,-125}, {125,-125,-125}, {-125,-125,-125}, {-125,125,-125}, }, 6, // faces { {1,2,3,0,0,0,0,0}, {7,6,5,4,0,0,0,0}, {0,4,5,1,0,0,0,1}, {1,5,6,2,0,0,0,2}, {2,6,7,3,0,0,0,1}, {3,7,4,0,0,0,0,2}} }; struct polygons_to_draw { int p; int dis; } ptodraw[256]; int polys=0; int light_src[6]={0}; int lls[6]={0}; int cxx, cxy, cxz, cyx, cyy, cyz, czx, czy, czz; int kx=0,ky=0,kz=0,dis=320,tx=0,ty=-50; int ls_kx=0,ls_ky=0,ls_kz=0,ls_x=0,ls_y=0,ls_z=128; int page=0; int frames=0; vect() { int c=0,a; tw_opengraph(); while(dis_musplus()<13 && !dis_exit()); frame_count=0; while(!dis_exit()) { a=dis_musplus(); if(a>=-4 && a<0) break; swappage(); while(frame_count<1); frames+=frame_count; frame_count=0; cop_pal=fpal; do_pal=1; calculate(1); draw(15); clear(); } // tw_closegraph(); } calculate(int k) { int a; static int px=0,py=256; getspl(4*256+frames*4); kx=kx&1023; ky=ky&1023; kz=kz&1023; ls_kx=ls_kx&1023; ls_ky=ls_ky&1023; ls_y=kosinit[ls_kx]>>8; ls_x=(sinit[ls_kx]>>8)*(sinit[ls_ky]>>8)>>7; ls_z=(sinit[ls_kx]>>8)*(kosinit[ls_ky]>>8)>>7; count_const(); rotate(); sort_faces(); } count_const() { //matrix equations: //X Y Z -> nX //X Y Z -> nY //X Y Z -> nZ // // 0=Ycos*Zcos 2=Ycos*Zsin 4=-Ysin // 6=Xsin*Zcos*Ysin 8=Xsin*Ysin*Zsin 10=Ycos*Xsin // -Xcos*Zsin +Xcos*Zcos //12=Xcos*Zcos*Ysin 14=Xcos*Ysin*Zsin 16=Ycos*Xcos // +Xsin*Zsin -Xsin*Zcos cxx=(long)CY*(long)CZ>>15+7; cxy=(long)CY*(long)SZ>>15+7; cxz=-(long)SY>>7; cyx=((long)SX*(long)CZ+16384L>>15)*(long)SY - (long)CX*(long)SZ>>15+7; cyy=((long)SX*(long)SY+16384L>>15)*(long)SZ + (long)CX*(long)CZ>>15+7; cyz=(long)CY*(long)SX>>15+7; czx=((long)CX*(long)CZ+16384L>>15)*(long)SY + (long)SX*(long)SZ>>15+7; czy=((long)CX*(long)SY+16384L>>15)*(long)SZ - (long)SX*(long)CZ>>15+7; czz=(long)CY*(long)CX>>15+7; } rotate() { int a,b,x,y,z,xx,yy,zz; for(a=0;a>1) + (y*cxy>>1) + (z*cxz>>1)>>7)+tx; object.point[a].yy=yy=((x*cyx>>1) + (y*cyy>>1) + (z*cyz>>1)>>7)+ty; object.point[a].zz=zz=((x*czx>>1) + (y*czy>>1) + (z*czz>>1)>>7)+dis; /* 1000,1000,1000 x*256, y*213, / ( */ object.point[a].xxx=(xx*256L)/zz+160+160; object.point[a].yyy=(yy*142L)/zz+66; } } sort_faces() { int a=0,b,c,x,y,z,p=0; long ax,ay,az,bx,by,bz,kx,ky,kz,nx,ny,nz,s,l; while(a0) { a++; continue; } s=(ls_x*nx+ls_y*ny+ls_z*nz)/250000+32; light_src[p]=s; c=object.pg[a].color; if(lls[p]!=light_src[p]) { shadepal(&fpal[c*64*3],&pal[c*64*3], light_src[p]); lls[p]=light_src[p]; } ptodraw[p++].p=a++; } polys=p; } draw() { int a=0,b,c,f,x,y,z; long ax,ay,az,bx,by,bz,kx,ky,kz,nx,ny,nz,s; for(a=0;a