]> 4ch.mooo.com Git - plz.git/blob - _plzpart/vect.c
5a581f44b99332eca1883389f229b77468ba3f5d
[plz.git] / _plzpart / vect.c
1 #include <stdio.h>\r
2 //#include <conio.h>\r
3 //#include <dos.h>\r
4 #include <math.h>\r
5 //#include <io.h>\r
6 #include <fcntl.h>\r
7 #include "tweak.h"\r
8 #include "../dis/dis.h"\r
9 \r
10 #define SX sinit[kx]\r
11 #define SY sinit[ky]\r
12 #define SZ sinit[kz]\r
13 #define CX kosinit[kx]\r
14 #define CY kosinit[ky]\r
15 #define CZ kosinit[kz]\r
16 \r
17 extern  far char (* far vmem)[160];\r
18 extern char far pal[768];\r
19 \r
20 extern void clear();\r
21 //extern init();\r
22 extern void shadepal(char far *fpal, char far *ppal, int shade);\r
23 extern  int init_copper();\r
24 extern  int close_copper();\r
25 extern  int far cop_rotatev;\r
26 extern  far int frame_count;\r
27 extern  far char * far cop_pal;\r
28 extern  far int do_pal;\r
29 extern  far int cop_start;\r
30 extern  far int cop_scrl;\r
31 \r
32 extern int do_poly();\r
33 extern int getspl(int where);\r
34 extern int far sinit[1024];\r
35 extern int far kosinit[1024];\r
36 \r
37 char    far fpal[768];\r
38 \r
39 struct  object {\r
40         char    name[100];\r
41 \r
42         int     pnts;\r
43         struct  points_3d {\r
44                 int     x;\r
45                 int     y;\r
46                 int     z;\r
47                 int     xx;\r
48                 int     yy;\r
49                 int     zz;\r
50                 int     xxx;\r
51                 int     yyy;\r
52                 } point[256];\r
53 \r
54         int     faces;\r
55         struct  polygon {\r
56                 int     p1;\r
57                 int     p2;\r
58                 int     p3;\r
59                 int     p4;\r
60                 int     p5;\r
61                 int     p6;\r
62                 int     n;\r
63                 int     color;\r
64                 } pg[256];\r
65 \r
66         int     lines;\r
67         struct  lines {\r
68                 int     p1;\r
69                 int     p2;\r
70                 int     n;\r
71                 int     col;\r
72                 } lin[256];\r
73         } object={\r
74                 "Cube",\r
75                 8,                              // points\r
76                 {\r
77                 {125,125,125},\r
78                 {125,-125,125},\r
79                 {-125,-125,125},\r
80                 {-125,125,125},\r
81                 {125,125,-125},\r
82                 {125,-125,-125},\r
83                 {-125,-125,-125},\r
84                 {-125,125,-125},\r
85                 },\r
86                 6,                      // faces\r
87                 {\r
88                 {1,2,3,0,0,0,0,0},\r
89                 {7,6,5,4,0,0,0,0},\r
90                 {0,4,5,1,0,0,0,1},\r
91                 {1,5,6,2,0,0,0,2},\r
92                 {2,6,7,3,0,0,0,1},\r
93                 {3,7,4,0,0,0,0,2}}\r
94                 };\r
95 \r
96 struct  polygons_to_draw {\r
97                 int     p;\r
98                 int     dis;\r
99                 } ptodraw[256];\r
100 int     polys=0;\r
101 \r
102 int     light_src[6]={0};\r
103 int     lls[6]={0};\r
104 \r
105 int     cxx, cxy, cxz, cyx, cyy, cyz, czx, czy, czz;\r
106 int     kx=0,ky=0,kz=0,dis=320,tx=0,ty=-50;\r
107 int     ls_kx=0,ls_ky=0,ls_kz=0,ls_x=0,ls_y=0,ls_z=128;\r
108 int     page=0;\r
109 int     frames=0;\r
110 \r
111 void sort_faces(void);\r
112 void draw(int);\r
113 void swappage(void);\r
114 void rotate(void);\r
115 void count_const(void);\r
116 void calculate(int);\r
117 \r
118 void vect()\r
119         {\r
120         int     /*c=0,*/a;\r
121 \r
122         tw_opengraph();\r
123 \r
124         //while(dis_musplus()<13 && !dis_exit());\r
125         frame_count=0;\r
126         while(!dis_exit())\r
127                 {\r
128                 a=dis_musplus();\r
129                 if(a>=-4 && a<0) break;\r
130                 swappage();\r
131                 while(frame_count<1); frames+=frame_count; frame_count=0;\r
132                 cop_pal=fpal; do_pal=1;\r
133 \r
134                 calculate(1);\r
135                 draw(15);\r
136                 clear();\r
137                 }\r
138 //      tw_closegraph();\r
139         }\r
140 \r
141 void calculate(int k)\r
142         {\r
143         //int   a;\r
144         //static int px=0,py=256;\r
145 \r
146         getspl(4*256+frames*4);\r
147         kx=kx&1023;\r
148         ky=ky&1023;\r
149         kz=kz&1023;\r
150         ls_kx=ls_kx&1023;\r
151         ls_ky=ls_ky&1023;\r
152 \r
153         ls_y=kosinit[ls_kx]>>8;\r
154         ls_x=(sinit[ls_kx]>>8)*(sinit[ls_ky]>>8)>>7;\r
155         ls_z=(sinit[ls_kx]>>8)*(kosinit[ls_ky]>>8)>>7;\r
156 \r
157         count_const();\r
158         rotate();\r
159         sort_faces();\r
160         }\r
161 \r
162 void count_const()\r
163         {\r
164         //matrix equations:\r
165         //X Y Z -> nX\r
166         //X Y Z -> nY\r
167         //X Y Z -> nZ\r
168         //\r
169         // 0=Ycos*Zcos           2=Ycos*Zsin             4=-Ysin\r
170         // 6=Xsin*Zcos*Ysin      8=Xsin*Ysin*Zsin       10=Ycos*Xsin\r
171         //   -Xcos*Zsin            +Xcos*Zcos\r
172         //12=Xcos*Zcos*Ysin     14=Xcos*Ysin*Zsin       16=Ycos*Xcos\r
173         //   +Xsin*Zsin            -Xsin*Zcos\r
174 \r
175         cxx=CY*CZ>>(15+7);\r
176         cxy=CY*SZ>>(15+7);\r
177         cxz=-SY>>7;\r
178 \r
179         cyx=(((SX*CZ+16384L)>>15)*SY - CX*SZ)>>(15+7);\r
180         cyy=(((SX*SY+16384L)>>15)*SZ + CX*CZ)>>(15+7);\r
181         cyz=CY*SX>>(15+7);\r
182 \r
183         czx=(((CX*CZ+16384L)>>15)*SY + SX*SZ)>>(15+7);\r
184         czy=(((CX*SY+16384L)>>15)*SZ - SX*CZ)>>(15+7);\r
185         czz=CY*CX>>(15+7);\r
186 \r
187         }\r
188 \r
189 void rotate()\r
190         {\r
191         int     a,/*b,*/x,y,z,xx,yy,zz;\r
192 \r
193         for(a=0;a<object.pnts;a++)\r
194                 {\r
195                 x=object.point[a].x; y=object.point[a].y; z=object.point[a].z;\r
196 \r
197                 object.point[a].xx=xx=(((x*cxx>>1) + (y*cxy>>1) + (z*cxz>>1))>>7)+tx;\r
198                 object.point[a].yy=yy=(((x*cyx>>1) + (y*cyy>>1) + (z*cyz>>1))>>7)+ty;\r
199                 object.point[a].zz=zz=(((x*czx>>1) + (y*czy>>1) + (z*czz>>1))>>7)+dis;\r
200 \r
201 /*\r
202                 1000,1000,1000\r
203 \r
204                 x*256, y*213, / (\r
205 */\r
206 \r
207                 object.point[a].xxx=(xx*256L)/zz+160+160;\r
208                 object.point[a].yyy=(yy*142L)/zz+66;\r
209                 }\r
210         }\r
211 \r
212 void sort_faces()\r
213         {\r
214         int     a=0,/*b,*/c,x,y,z,p=0;\r
215         long    ax,ay,az,bx,by,bz,/*kx,ky,kz,*/nx,ny,nz,s/*,l*/;\r
216 \r
217         while(a<object.faces)\r
218                 {\r
219                 x=object.point[object.pg[a].p1].xx;\r
220                 y=object.point[object.pg[a].p1].yy;\r
221                 z=object.point[object.pg[a].p1].zz;\r
222 \r
223                 ax=object.point[object.pg[a].p2].xx-x;\r
224                 ay=object.point[object.pg[a].p2].yy-y;\r
225                 az=object.point[object.pg[a].p2].zz-z;\r
226 \r
227                 bx=object.point[object.pg[a].p3].xx-x;\r
228                 by=object.point[object.pg[a].p3].yy-y;\r
229                 bz=object.point[object.pg[a].p3].zz-z;\r
230 \r
231                 nx = ay * bz - az * by;\r
232                 ny = az * bx - ax * bz;\r
233                 nz = ax * by - ay * bx;                 // normal\r
234 \r
235                 kx = -x;\r
236                 ky = -y;\r
237                 kz = -z;                                // view_vector\r
238 \r
239                 s = kx*nx + ky*ny + kz*nz;              // skalaaritulo\r
240 \r
241                 if(s>0)  { a++; continue; }\r
242 \r
243                 s=(ls_x*nx+ls_y*ny+ls_z*nz)/250000+32;\r
244                 light_src[p]=s;\r
245                 c=object.pg[a].color;\r
246                 if(lls[p]!=light_src[p])\r
247                         {\r
248                         shadepal(&fpal[c*64*3],&pal[c*64*3], light_src[p]);\r
249                         lls[p]=light_src[p];\r
250                         }\r
251 \r
252                 ptodraw[p++].p=a++;\r
253                 }\r
254         polys=p;\r
255         }\r
256 \r
257 \r
258 void draw(int notused)\r
259         {\r
260         int     a=0,/*b,*/c/*,f,x,y,z*/;\r
261         //long  ax,ay,az,bx,by,bz,kx,ky,kz,nx,ny,nz,s;\r
262 \r
263         for(a=0;a<polys;a++)\r
264                 {\r
265                 c=object.pg[ptodraw[a].p].color;\r
266                 do_poly(object.point[object.pg[ptodraw[a].p].p1].xxx+(page&1)*2, object.point[object.pg[ptodraw[a].p].p1].yyy,\r
267                         object.point[object.pg[ptodraw[a].p].p2].xxx+(page&1)*2, object.point[object.pg[ptodraw[a].p].p2].yyy,\r
268                         object.point[object.pg[ptodraw[a].p].p3].xxx+(page&1)*2, object.point[object.pg[ptodraw[a].p].p3].yyy,\r
269                         object.point[object.pg[ptodraw[a].p].p4].xxx+(page&1)*2, object.point[object.pg[ptodraw[a].p].p4].yyy,\r
270                         c, frames&63);\r
271                 }\r
272         }\r
273 \r
274 void swappage()\r
275         {\r
276         page=(page+1)%6;\r
277         if(page==0){\r
278                 vmem=MK_FP(0x0a000,0x0000);\r
279                 cop_start=0xaa00+40;\r
280                 cop_scrl=4;\r
281                 }\r
282         else if(page==1){\r
283                 vmem=MK_FP(0x0a000,0x5500);\r
284                 cop_start=0x0000+40;\r
285                 cop_scrl=0;\r
286                 }\r
287         else if(page==2){\r
288                 vmem=MK_FP(0x0a000,0xaa00);\r
289                 cop_start=0x5500+40;\r
290                 cop_scrl=4;\r
291                 }\r
292         else if(page==3){\r
293                 vmem=MK_FP(0x0a000,0x0000);\r
294                 cop_start=0xaa00+40;\r
295                 cop_scrl=0;\r
296                 }\r
297         else if(page==4){\r
298                 vmem=MK_FP(0x0a000,0x5500);\r
299                 cop_start=0x0000+40;\r
300                 cop_scrl=4;\r
301                 }\r
302         else if(page==5){\r
303                 vmem=MK_FP(0x0a000,0xaa00);\r
304                 cop_start=0x5500+40;\r
305                 cop_scrl=0;\r
306                 }\r
307         }\r
308 \r