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