]> 4ch.mooo.com Git - plz.git/blobdiff - plzpart/vect.c
wwww
[plz.git] / plzpart / vect.c
diff --git a/plzpart/vect.c b/plzpart/vect.c
new file mode 100755 (executable)
index 0000000..5a581f4
--- /dev/null
@@ -0,0 +1,308 @@
+#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