wolf3d

The original open source release of Wolfenstein 3D
Log | Files | Refs

WOLFHACK.C (3068B)


      1 // WOLFHACK.C
      2 
      3 #include "WL_DEF.H"
      4 
      5 #define	MAXVIEWHEIGHT	200
      6 
      7 int		spanstart[MAXVIEWHEIGHT/2];
      8 
      9 fixed	stepscale[MAXVIEWHEIGHT/2];
     10 fixed	basedist[MAXVIEWHEIGHT/2];
     11 
     12 extern	char	far	planepics[8192];	// 4k of ceiling, 4k of floor
     13 
     14 int		halfheight = 0;
     15 
     16 byte	far *planeylookup[MAXVIEWHEIGHT/2];
     17 unsigned	mirrorofs[MAXVIEWHEIGHT/2];
     18 
     19 fixed	psin, pcos;
     20 
     21 fixed FixedMul (fixed a, fixed b)
     22 {
     23 	return (a>>8)*(b>>8);
     24 }
     25 
     26 
     27 int		mr_rowofs;
     28 int		mr_count;
     29 int		mr_xstep;
     30 int		mr_ystep;
     31 int		mr_xfrac;
     32 int		mr_yfrac;
     33 int		mr_dest;
     34 
     35 
     36 /*
     37 ==============
     38 =
     39 = DrawSpans
     40 =
     41 = Height ranges from 0 (infinity) to viewheight/2 (nearest)
     42 ==============
     43 */
     44 
     45 void DrawSpans (int x1, int x2, int height)
     46 {
     47 	fixed		length;
     48 	int			ofs;
     49 	int			prestep;
     50 	fixed		startxfrac, startyfrac;
     51 
     52 	int			x, startx, count, plane, startplane;
     53 	byte		far	*toprow, far *dest;
     54 
     55 	toprow = planeylookup[height]+bufferofs;
     56 	mr_rowofs = mirrorofs[height];
     57 
     58 	mr_xstep = (psin<<1)/height;
     59 	mr_ystep = (pcos<<1)/height;
     60 
     61 	length = basedist[height];
     62 	startxfrac = (viewx + FixedMul(length,pcos));
     63 	startyfrac = (viewy - FixedMul(length,psin));
     64 
     65 // draw two spans simultaniously
     66 
     67 	plane = startplane = x1&3;
     68 	prestep = viewwidth/2 - x1;
     69 	do
     70 	{
     71 		outportb (SC_INDEX+1,1<<plane);
     72 		mr_xfrac = startxfrac - (mr_xstep>>2)*prestep;
     73 		mr_yfrac = startyfrac - (mr_ystep>>2)*prestep;
     74 
     75 		startx = x1>>2;
     76 		mr_dest = (unsigned)toprow + startx;
     77 		mr_count = ((x2-plane)>>2) - startx + 1;
     78 		x1++;
     79 		prestep--;
     80 		if (mr_count)
     81 			MapRow ();
     82 		plane = (plane+1)&3;
     83 	} while (plane != startplane);
     84 
     85 }
     86 
     87 
     88 
     89 
     90 /*
     91 ===================
     92 =
     93 = SetPlaneViewSize
     94 =
     95 ===================
     96 */
     97 
     98 void SetPlaneViewSize (void)
     99 {
    100 	int		x,y;
    101 	byte 	far *dest, far *src;
    102 
    103 	halfheight = viewheight>>1;
    104 
    105 
    106 	for (y=0 ; y<halfheight ; y++)
    107 	{
    108 		planeylookup[y] = (byte far *)0xa0000000l + (halfheight-1-y)*SCREENBWIDE;;
    109 		mirrorofs[y] = (y*2+1)*SCREENBWIDE;
    110 
    111 		stepscale[y] = y*GLOBAL1/32;
    112 		if (y>0)
    113 			basedist[y] = GLOBAL1/2*scale/y;
    114 	}
    115 
    116 	src = PM_GetPage(0);
    117 	dest = planepics;
    118 	for (x=0 ; x<4096 ; x++)
    119 	{
    120 		*dest = *src++;
    121 		dest += 2;
    122 	}
    123 	src = PM_GetPage(1);
    124 	dest = planepics+1;
    125 	for (x=0 ; x<4096 ; x++)
    126 	{
    127 		*dest = *src++;
    128 		dest += 2;
    129 	}
    130 
    131 }
    132 
    133 
    134 /*
    135 ===================
    136 =
    137 = DrawPlanes
    138 =
    139 ===================
    140 */
    141 
    142 void DrawPlanes (void)
    143 {
    144 	int		height, lastheight;
    145 	int		x;
    146 
    147 	if (viewheight>>1 != halfheight)
    148 		SetPlaneViewSize ();		// screen size has changed
    149 
    150 
    151 	psin = viewsin;
    152 	if (psin < 0)
    153 		psin = -(psin&0xffff);
    154 	pcos = viewcos;
    155 	if (pcos < 0)
    156 		pcos = -(pcos&0xffff);
    157 
    158 //
    159 // loop over all columns
    160 //
    161 	lastheight = halfheight;
    162 
    163 	for (x=0 ; x<viewwidth ; x++)
    164 	{
    165 		height = wallheight[x]>>3;
    166 		if (height < lastheight)
    167 		{	// more starts
    168 			do
    169 			{
    170 				spanstart[--lastheight] = x;
    171 			} while (lastheight > height);
    172 		}
    173 		else if (height > lastheight)
    174 		{	// draw spans
    175 			if (height > halfheight)
    176 				height = halfheight;
    177 			for ( ; lastheight < height ; lastheight++)
    178 				DrawSpans (spanstart[lastheight], x-1, lastheight);
    179 		}
    180 	}
    181 
    182 	height = halfheight;
    183 	for ( ; lastheight < height ; lastheight++)
    184 		DrawSpans (spanstart[lastheight], x-1, lastheight);
    185 }
    186