⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 r_segs.c

📁 PIXIL is a small footprint operating environment, complete with PDA PIM applications, a browser and
💻 C
📖 第 1 页 / 共 2 页
字号:
// Emacs style mode select   -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: r_segs.c,v 1.2 2003/09/08 22:34:31 jasonk Exp $//// Copyright (C) 1993-1996 by id Software, Inc.//// This source is available for distribution and/or modification// only under the terms of the DOOM Source Code License as// published by id Software. All rights reserved.//// The source is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License// for more details.//// $Log: r_segs.c,v $// Revision 1.2  2003/09/08 22:34:31  jasonk// Updated files because this fucker won't build for no fucking good reason.//// Revision 1.1.1.1  2003/09/04 21:08:13  jasonk// Initial import//// Revision 1.1  2000/12/08 21:07:54  jeffw// nxdoom initial entry -- No nxdoom/Makefile so it won't build automatically////// DESCRIPTION://	All the clipping: columns, horizontal spans, sky columns.////-----------------------------------------------------------------------------static const charrcsid[] = "$Id: r_segs.c,v 1.2 2003/09/08 22:34:31 jasonk Exp $";#include <stdlib.h>#include "i_system.h"#include "doomdef.h"#include "doomstat.h"#include "r_local.h"#include "r_sky.h"// OPTIMIZE: closed two sided lines as single sided// True if any of the segs textures might be visible.boolean		segtextured;	// False if the back side is the same plane.boolean		markfloor;	boolean		markceiling;boolean		maskedtexture;int		toptexture;int		bottomtexture;int		midtexture;angle_t		rw_normalangle;// angle to line originint		rw_angle1;	//// regular wall//int		rw_x;int		rw_stopx;angle_t		rw_centerangle;fixed_t		rw_offset;fixed_t		rw_distance;fixed_t		rw_scale;fixed_t		rw_scalestep;fixed_t		rw_midtexturemid;fixed_t		rw_toptexturemid;fixed_t		rw_bottomtexturemid;int		worldtop;int		worldbottom;int		worldhigh;int		worldlow;fixed_t		pixhigh;fixed_t		pixlow;fixed_t		pixhighstep;fixed_t		pixlowstep;fixed_t		topfrac;fixed_t		topstep;fixed_t		bottomfrac;fixed_t		bottomstep;lighttable_t**	walllights;short*		maskedtexturecol;//// R_RenderMaskedSegRange//voidR_RenderMaskedSegRange( drawseg_t*	ds,  int		x1,  int		x2 ){    unsigned	index;    column_t*	col;    int		lightnum;    int		texnum;        // Calculate light table.    // Use different light tables    //   for horizontal / vertical / diagonal. Diagonal?    // OPTIMIZE: get rid of LIGHTSEGSHIFT globally    curline = ds->curline;    frontsector = curline->frontsector;    backsector = curline->backsector;    texnum = texturetranslation[curline->sidedef->midtexture];	    lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT)+extralight;    if (curline->v1->y == curline->v2->y)	lightnum--;    else if (curline->v1->x == curline->v2->x)	lightnum++;    if (lightnum < 0)			walllights = scalelight[0];    else if (lightnum >= LIGHTLEVELS)	walllights = scalelight[LIGHTLEVELS-1];    else	walllights = scalelight[lightnum];    maskedtexturecol = ds->maskedtexturecol;    rw_scalestep = ds->scalestep;		    spryscale = ds->scale1 + (x1 - ds->x1)*rw_scalestep;    mfloorclip = ds->sprbottomclip;    mceilingclip = ds->sprtopclip;        // find positioning    if (curline->linedef->flags & ML_DONTPEGBOTTOM)    {	dc_texturemid = frontsector->floorheight > backsector->floorheight	    ? frontsector->floorheight : backsector->floorheight;	dc_texturemid = dc_texturemid + textureheight[texnum] - viewz;    }    else    {	dc_texturemid =frontsector->ceilingheight<backsector->ceilingheight	    ? frontsector->ceilingheight : backsector->ceilingheight;	dc_texturemid = dc_texturemid - viewz;    }    dc_texturemid += curline->sidedef->rowoffset;			    if (fixedcolormap)	dc_colormap = fixedcolormap;        // draw the columns    for (dc_x = x1 ; dc_x <= x2 ; dc_x++)    {	// calculate lighting	if (maskedtexturecol[dc_x] != MAXSHORT)	{	    if (!fixedcolormap)	    {		index = spryscale>>LIGHTSCALESHIFT;		if (index >=  MAXLIGHTSCALE )		    index = MAXLIGHTSCALE-1;		dc_colormap = walllights[index];	    }				    sprtopscreen = centeryfrac - FixedMul(dc_texturemid, spryscale);	    dc_iscale = 0xffffffffu / (unsigned)spryscale;	    	    // draw the texture	    col = (column_t *)( 		(byte *)R_GetColumn(texnum,maskedtexturecol[dc_x]) -3);				    R_DrawMaskedColumn (col);	    maskedtexturecol[dc_x] = MAXSHORT;	}	spryscale += rw_scalestep;    }	}//// R_RenderSegLoop// Draws zero, one, or two textures (and possibly a masked//  texture) for walls.// Can draw or mark the starting pixel of floor and ceiling//  textures.// CALLED: CORE LOOPING ROUTINE.//#define HEIGHTBITS		12#define HEIGHTUNIT		(1<<HEIGHTBITS)void R_RenderSegLoop (void){    angle_t		angle;    unsigned		index;    int			yl;    int			yh;    int			mid;    fixed_t		texturecolumn;    int			top;    int			bottom;    //texturecolumn = 0;				// shut up compiler warning	    for ( ; rw_x < rw_stopx ; rw_x++)    {	// mark floor / ceiling areas	yl = (topfrac+HEIGHTUNIT-1)>>HEIGHTBITS;	// no space above wall?	if (yl < ceilingclip[rw_x]+1)	    yl = ceilingclip[rw_x]+1;		if (markceiling)	{	    top = ceilingclip[rw_x]+1;	    bottom = yl-1;	    if (bottom >= floorclip[rw_x])		bottom = floorclip[rw_x]-1;	    if (top <= bottom)	    {		ceilingplane->top[rw_x] = top;		ceilingplane->bottom[rw_x] = bottom;	    }	}			yh = bottomfrac>>HEIGHTBITS;	if (yh >= floorclip[rw_x])	    yh = floorclip[rw_x]-1;	if (markfloor)	{	    top = yh+1;	    bottom = floorclip[rw_x]-1;	    if (top <= ceilingclip[rw_x])		top = ceilingclip[rw_x]+1;	    if (top <= bottom)	    {		floorplane->top[rw_x] = top;		floorplane->bottom[rw_x] = bottom;	    }	}		// texturecolumn and lighting are independent of wall tiers	if (segtextured)	{	    // calculate texture offset	    angle = (rw_centerangle + xtoviewangle[rw_x])>>ANGLETOFINESHIFT;	    texturecolumn = rw_offset-FixedMul(finetangent[angle],rw_distance);	    texturecolumn >>= FRACBITS;	    // calculate lighting	    index = rw_scale>>LIGHTSCALESHIFT;	    if (index >=  MAXLIGHTSCALE )		index = MAXLIGHTSCALE-1;	    dc_colormap = walllights[index];	    dc_x = rw_x;	    dc_iscale = 0xffffffffu / (unsigned)rw_scale;	}		// draw the wall tiers	if (midtexture)	{	    // single sided line	    dc_yl = yl;	    dc_yh = yh;	    dc_texturemid = rw_midtexturemid;	    dc_source = R_GetColumn(midtexture,texturecolumn);	    colfunc ();	    ceilingclip[rw_x] = viewheight;	    floorclip[rw_x] = -1;	}	else	{	    // two sided line	    if (toptexture)	    {		// top wall		mid = pixhigh>>HEIGHTBITS;		pixhigh += pixhighstep;		if (mid >= floorclip[rw_x])		    mid = floorclip[rw_x]-1;		if (mid >= yl)		{		    dc_yl = yl;		    dc_yh = mid;		    dc_texturemid = rw_toptexturemid;		    dc_source = R_GetColumn(toptexture,texturecolumn);		    colfunc ();		    ceilingclip[rw_x] = mid;		}		else		    ceilingclip[rw_x] = yl-1;	    }	    else	    {		// no top wall		if (markceiling)		    ceilingclip[rw_x] = yl-1;	    }				    if (bottomtexture)	    {		// bottom wall		mid = (pixlow+HEIGHTUNIT-1)>>HEIGHTBITS;		pixlow += pixlowstep;		// no space above wall?		if (mid <= ceilingclip[rw_x])		    mid = ceilingclip[rw_x]+1;				if (mid <= yh)		{		    dc_yl = mid;		    dc_yh = yh;		    dc_texturemid = rw_bottomtexturemid;		    dc_source = R_GetColumn(bottomtexture,					    texturecolumn);		    colfunc ();		    floorclip[rw_x] = mid;		}		else		    floorclip[rw_x] = yh+1;	    }	    else	    {		// no bottom wall		if (markfloor)		    floorclip[rw_x] = yh+1;	    }				    if (maskedtexture)	    {		// save texturecol		//  for backdrawing of masked mid texture		maskedtexturecol[rw_x] = texturecolumn;	    }	}			rw_scale += rw_scalestep;	topfrac += topstep;	bottomfrac += bottomstep;    }}//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -