5 #define MAXVIEWHEIGHT 200
\r
7 int spanstart[MAXVIEWHEIGHT/2];
\r
9 fixed stepscale[MAXVIEWHEIGHT/2];
\r
10 fixed basedist[MAXVIEWHEIGHT/2];
\r
12 extern char far planepics[8192]; // 4k of ceiling, 4k of floor
\r
16 byte far *planeylookup[MAXVIEWHEIGHT/2];
\r
17 unsigned mirrorofs[MAXVIEWHEIGHT/2];
\r
21 fixed FixedMul (fixed a, fixed b)
\r
23 return (a>>8)*(b>>8);
\r
41 = Height ranges from 0 (infinity) to viewheight/2 (nearest)
\r
45 void DrawSpans (int x1, int x2, int height)
\r
50 fixed startxfrac, startyfrac;
\r
52 int x, startx, count, plane, startplane;
\r
53 byte far *toprow, far *dest;
\r
55 toprow = planeylookup[height]+bufferofs;
\r
56 mr_rowofs = mirrorofs[height];
\r
58 mr_xstep = (psin<<1)/height;
\r
59 mr_ystep = (pcos<<1)/height;
\r
61 length = basedist[height];
\r
62 startxfrac = (viewx + FixedMul(length,pcos));
\r
63 startyfrac = (viewy - FixedMul(length,psin));
\r
65 // draw two spans simultaniously
\r
67 plane = startplane = x1&3;
\r
68 prestep = viewwidth/2 - x1;
\r
71 outportb (SC_INDEX+1,1<<plane);
\r
72 mr_xfrac = startxfrac - (mr_xstep>>2)*prestep;
\r
73 mr_yfrac = startyfrac - (mr_ystep>>2)*prestep;
\r
76 mr_dest = (unsigned)toprow + startx;
\r
77 mr_count = ((x2-plane)>>2) - startx + 1;
\r
82 plane = (plane+1)&3;
\r
83 } while (plane != startplane);
\r
98 void SetPlaneViewSize (void)
\r
101 byte far *dest, far *src;
\r
103 halfheight = viewheight>>1;
\r
106 for (y=0 ; y<halfheight ; y++)
\r
108 planeylookup[y] = (byte far *)0xa0000000l + (halfheight-1-y)*SCREENBWIDE;;
\r
109 mirrorofs[y] = (y*2+1)*SCREENBWIDE;
\r
111 stepscale[y] = y*GLOBAL1/32;
\r
113 basedist[y] = GLOBAL1/2*scale/y;
\r
116 src = PM_GetPage(0);
\r
118 for (x=0 ; x<4096 ; x++)
\r
123 src = PM_GetPage(1);
\r
124 dest = planepics+1;
\r
125 for (x=0 ; x<4096 ; x++)
\r
135 ===================
\r
139 ===================
\r
142 void DrawPlanes (void)
\r
144 int height, lastheight;
\r
147 if (viewheight>>1 != halfheight)
\r
148 SetPlaneViewSize (); // screen size has changed
\r
153 psin = -(psin&0xffff);
\r
156 pcos = -(pcos&0xffff);
\r
159 // loop over all columns
\r
161 lastheight = halfheight;
\r
163 for (x=0 ; x<viewwidth ; x++)
\r
165 height = wallheight[x]>>3;
\r
166 if (height < lastheight)
\r
170 spanstart[--lastheight] = x;
\r
171 } while (lastheight > height);
\r
173 else if (height > lastheight)
\r
175 if (height > halfheight)
\r
176 height = halfheight;
\r
177 for ( ; lastheight < height ; lastheight++)
\r
178 DrawSpans (spanstart[lastheight], x-1, lastheight);
\r
182 height = halfheight;
\r
183 for ( ; lastheight < height ; lastheight++)
\r
184 DrawSpans (spanstart[lastheight], x-1, lastheight);
\r