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
16 extern far char (* far vmem)[160];
\r
17 extern char far pal[768];
\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
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
95 struct polygons_to_draw {
\r
101 int light_src[6]={0};
\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
116 while(dis_musplus()<13 && !dis_exit()); frame_count=0;
\r
120 if(a>=-4 && a<0) break;
\r
122 while(frame_count<1); frames+=frame_count; frame_count=0;
\r
123 cop_pal=fpal; do_pal=1;
\r
129 // tw_closegraph();
\r
135 static int px=0,py=256;
\r
137 getspl(4*256+frames*4);
\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
155 //matrix equations:
\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
166 cxx=(long)CY*(long)CZ>>15+7;
\r
167 cxy=(long)CY*(long)SZ>>15+7;
\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
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
182 int a,b,x,y,z,xx,yy,zz;
\r
184 for(a=0;a<object.pnts;a++)
\r
186 x=object.point[a].x; y=object.point[a].y; z=object.point[a].z;
\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
198 object.point[a].xxx=(xx*256L)/zz+160+160;
\r
199 object.point[a].yyy=(yy*142L)/zz+66;
\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
208 while(a<object.faces)
\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
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
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
222 nx = ay * bz - az * by;
\r
223 ny = az * bx - ax * bz;
\r
224 nz = ax * by - ay * bx; // normal
\r
228 kz = -z; // view_vector
\r
230 s = kx*nx + ky*ny + kz*nz; // skalaaritulo
\r
232 if(s>0) { a++; continue; }
\r
234 s=(ls_x*nx+ls_y*ny+ls_z*nz)/250000+32;
\r
236 c=object.pg[a].color;
\r
237 if(lls[p]!=light_src[p])
\r
239 shadepal(&fpal[c*64*3],&pal[c*64*3], light_src[p]);
\r
240 lls[p]=light_src[p];
\r
243 ptodraw[p++].p=a++;
\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
254 for(a=0;a<polys;a++)
\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
269 vmem=MK_FP(0x0a000,0x0000);
\r
270 cop_start=0xaa00+40;
\r
274 vmem=MK_FP(0x0a000,0x5500);
\r
275 cop_start=0x0000+40;
\r
279 vmem=MK_FP(0x0a000,0xaa00);
\r
280 cop_start=0x5500+40;
\r
284 vmem=MK_FP(0x0a000,0x0000);
\r
285 cop_start=0xaa00+40;
\r
289 vmem=MK_FP(0x0a000,0x5500);
\r
290 cop_start=0x0000+40;
\r
294 vmem=MK_FP(0x0a000,0xaa00);
\r
295 cop_start=0x5500+40;
\r