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