// // R_DrawPlanes // At the end of each frame. // void R_DrawPlane (visplane_t *pl) { int light; int x; int stop; int angle; if (pl->minx > pl->maxx) return; // sky flat if (pl->picnum == skyflatnum) { dc_iscale = pspriteiscale>>detailshift; // Sky is allways drawn full bright, // i.e. colormaps[0] is used. // Because of this hack, sky is not affected // by INVUL inverse mapping. dc_colormap = colormaps; dc_texturemid = skytexturemid; for (x=pl->minx ; x <= pl->maxx ; x++) { dc_yl = pl->top[x]; dc_yh = pl->bottom[x]; if (dc_yl <= dc_yh) { angle = (viewangle + xtoviewangle[x])>>ANGLETOSKYSHIFT; dc_x = x; dc_source = R_GetColumn(skytexture, angle); colfunc (); } }
// // R_DrawPlanes // At the end of each frame. // void R_DrawPlanes (void) { visplane_t* pl; int light; int x; int stop; int angle; int lumpnum; #ifdef RANGECHECK if (ds_p - drawsegs > MAXDRAWSEGS) I_Error ("R_DrawPlanes: drawsegs overflow (%i)", ds_p - drawsegs); if (lastvisplane - visplanes > MAXVISPLANES) I_Error ("R_DrawPlanes: visplane overflow (%i)", lastvisplane - visplanes); if (lastopening - openings > MAXOPENINGS) I_Error ("R_DrawPlanes: opening overflow (%i)", lastopening - openings); #endif for (pl = visplanes ; pl < lastvisplane ; pl++) { if (pl->minx > pl->maxx) continue; // sky flat if (pl->picnum == skyflatnum) { dc_iscale = pspriteiscale>>detailshift; // Sky is allways drawn full bright, // i.e. colormaps[0] is used. // Because of this hack, sky is not affected // by INVUL inverse mapping. dc_colormap = colormaps; dc_texturemid = skytexturemid; for (x=pl->minx ; x <= pl->maxx ; x++) { dc_yl = pl->top[x]; dc_yh = pl->bottom[x]; if (dc_yl <= dc_yh) { angle = (viewangle + xtoviewangle[x])>>ANGLETOSKYSHIFT; dc_x = x; dc_source = R_GetColumn(skytexture, angle); colfunc (); } } continue; }
// // R_StoreWallRange // static void BlastMaskedColumn (void (*blastfunc)(column_t *column), int texnum) { if (maskedtexturecol[dc_x] != MAXINT && spryscale > 0) { // calculate lighting if (!fixedcolormap) { unsigned index = rw_light >> LIGHTSCALESHIFT; // [RH] if (index >= MAXLIGHTSCALE) index = MAXLIGHTSCALE-1; dc_colormap = walllights[index] + basecolormap; // [RH] add basecolormap } // killough 3/2/98: // // This calculation used to overflow and cause crashes in Doom: // // sprtopscreen = centeryfrac - FixedMul(dc_texturemid, spryscale); // // This code fixes it, by using double-precision intermediate // arithmetic and by skipping the drawing of 2s normals whose // mapping to screen coordinates is totally out of range: { __int64 t = ((__int64) centeryfrac << FRACBITS) - (__int64) dc_texturemid * spryscale; // [RH] This doesn't work properly as-is with freelook. Probably just me. // if (t + (__int64) textureheight[texnum] * spryscale < 0 || // t > (__int64) screen.height << FRACBITS*2) // continue; // skip if the texture is out of screen's range sprtopscreen = (fixed_t)(t >> FRACBITS); } dc_iscale = 0xffffffffu / (unsigned)spryscale; // killough 1/25/98: here's where Medusa came in, because // it implicitly assumed that the column was all one patch. // Originally, Doom did not construct complete columns for // multipatched textures, so there were no header or trailer // bytes in the column referred to below, which explains // the Medusa effect. The fix is to construct true columns // when forming multipatched textures (see r_data.c). // draw the texture blastfunc ((column_t *)((byte *)R_GetColumn(texnum, maskedtexturecol[dc_x]) -3)); maskedtexturecol[dc_x] = MAXINT; }
void R_DrawPlanes(void) { visplane_t *pl; int light; int x, stop; int lumpnum; int angle; byte *tempSource; byte *dest; int count; fixed_t frac, fracstep; extern byte *ylookup[MAXHEIGHT]; extern int columnofs[MAXWIDTH]; #ifdef RANGECHECK if (ds_p - drawsegs > numdrawsegs) I_Error("R_DrawPlanes: drawsegs overflow (%" PRIiPTR ")", ds_p - drawsegs); if (lastvisplane - visplanes > numvisplanes) I_Error("R_DrawPlanes: visplane overflow (%" PRIiPTR ")", lastvisplane - visplanes); if (lastopening - openings > MAXOPENINGS) I_Error("R_DrawPlanes: opening overflow (%" PRIiPTR ")", lastopening - openings); #endif for (pl = visplanes; pl < lastvisplane; pl++) { if (pl->minx > pl->maxx) continue; // // sky flat // if (pl->picnum == skyflatnum) { dc_iscale = skyiscale; dc_colormap = colormaps; // sky is allways drawn full bright dc_texturemid = skytexturemid; dc_texheight = textureheight[skytexture]>>FRACBITS; for (x = pl->minx; x <= pl->maxx; x++) { dc_yl = pl->top[x]; dc_yh = pl->bottom[x]; if ((unsigned) dc_yl <= dc_yh) // [crispy] 32-bit integer math { angle = (viewangle + xtoviewangle[x]) >> ANGLETOSKYSHIFT; dc_x = x; dc_source = R_GetColumn(skytexture, angle); count = dc_yh - dc_yl; if (count < 0) return; #ifdef RANGECHECK if ((unsigned) dc_x >= SCREENWIDTH || dc_yl < 0 || dc_yh >= SCREENHEIGHT) I_Error("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x); #endif dest = ylookup[dc_yl] + columnofs[dc_x]; fracstep = dc_iscale; frac = dc_texturemid + (dc_yl - centery) * fracstep; do { *dest = dc_source[frac >> FRACBITS]; dest += SCREENWIDTH; frac += fracstep; } while (count--); // colfunc (); } } continue; }
void R_DrawPlanes(void) { visplane_t *pl; int light; int x, stop; int angle; byte *tempSource; byte *source; byte *source2; byte *dest; int count; int offset; int skyTexture; int offset2; int skyTexture2; int scrollOffset; extern byte *ylookup[MAXHEIGHT]; extern int columnofs[MAXWIDTH]; #ifdef RANGECHECK if (ds_p - drawsegs > MAXDRAWSEGS) { I_Error("R_DrawPlanes: drawsegs overflow (%i)", ds_p - drawsegs); } if (lastvisplane - visplanes > MAXVISPLANES) { I_Error("R_DrawPlanes: visplane overflow (%i)", lastvisplane - visplanes); } if (lastopening - openings > MAXOPENINGS) { I_Error("R_DrawPlanes: opening overflow (%i)", lastopening - openings); } #endif for (pl = visplanes; pl < lastvisplane; pl++) { if (pl->minx > pl->maxx) { continue; } if (pl->picnum == skyflatnum) { // Sky flat if (DoubleSky) { // Render 2 layers, sky 1 in front offset = Sky1ColumnOffset >> 16; skyTexture = texturetranslation[Sky1Texture]; offset2 = Sky2ColumnOffset >> 16; skyTexture2 = texturetranslation[Sky2Texture]; for (x = pl->minx; x <= pl->maxx; x++) { dc_yl = pl->top[x]; dc_yh = pl->bottom[x]; if (dc_yl <= dc_yh) { count = dc_yh - dc_yl; if (count < 0) { return; } angle = (viewangle + xtoviewangle[x]) >> ANGLETOSKYSHIFT; source = R_GetColumn(skyTexture, angle + offset) + SKYTEXTUREMIDSHIFTED + (dc_yl - centery); source2 = R_GetColumn(skyTexture2, angle + offset2) + SKYTEXTUREMIDSHIFTED + (dc_yl - centery); dest = ylookup[dc_yl] + columnofs[x]; do { if (*source) { *dest = *source++; source2++; } else { *dest = *source2++; source++; } dest += SCREENWIDTH; } while (count--); } } continue; // Next visplane } else { // Render single layer if (pl->special == 200) { // Use sky 2 offset = Sky2ColumnOffset >> 16; skyTexture = texturetranslation[Sky2Texture]; } else { // Use sky 1
byte* R_GetColumnData(int tex, int col) { return R_GetColumn(tex, col)->data(); }