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