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

📄 r_things.c

📁 PIXIL is a small footprint operating environment, complete with PDA PIM applications, a browser and
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (tz < MINZ)	return;        xscale = FixedDiv(projection, tz);	    gxt = -FixedMul(tr_x,viewsin);     gyt = FixedMul(tr_y,viewcos);     tx = -(gyt+gxt);     // too far off the side?    if (abs(tx)>(tz<<2))	return;        // decide which patch to use for sprite relative to player#ifdef RANGECHECK    if ((unsigned)thing->sprite >= numsprites)	I_Error ("R_ProjectSprite: invalid sprite number %i ",		 thing->sprite);#endif    sprdef = &sprites[thing->sprite];#ifdef RANGECHECK    if ( (thing->frame&FF_FRAMEMASK) >= sprdef->numframes )	I_Error ("R_ProjectSprite: invalid sprite frame %i : %i ",		 thing->sprite, thing->frame);#endif    sprframe = &sprdef->spriteframes[ thing->frame & FF_FRAMEMASK];    if (sprframe->rotate)    {	// choose a different rotation based on player view	ang = R_PointToAngle (thing->x, thing->y);	rot = (ang-thing->angle+(unsigned)(ANG45/2)*9)>>29;	lump = sprframe->lump[rot];	flip = (boolean)sprframe->flip[rot];    }    else    {	// use single rotation for all views	lump = sprframe->lump[0];	flip = (boolean)sprframe->flip[0];    }        // calculate edges of the shape    tx -= spriteoffset[lump];	    x1 = (centerxfrac + FixedMul (tx,xscale) ) >>FRACBITS;    // off the right side?    if (x1 > viewwidth)	return;        tx +=  spritewidth[lump];    x2 = ((centerxfrac + FixedMul (tx,xscale) ) >>FRACBITS) - 1;    // off the left side    if (x2 < 0)	return;        // store information in a vissprite    vis = R_NewVisSprite ();    vis->mobjflags = thing->flags;    vis->scale = xscale<<detailshift;    vis->gx = thing->x;    vis->gy = thing->y;    vis->gz = thing->z;    vis->gzt = thing->z + spritetopoffset[lump];    vis->texturemid = vis->gzt - viewz;    vis->x1 = x1 < 0 ? 0 : x1;    vis->x2 = x2 >= viewwidth ? viewwidth-1 : x2;	    iscale = FixedDiv (FRACUNIT, xscale);    if (flip)    {	vis->startfrac = spritewidth[lump]-1;	vis->xiscale = -iscale;    }    else    {	vis->startfrac = 0;	vis->xiscale = iscale;    }    if (vis->x1 > x1)	vis->startfrac += vis->xiscale*(vis->x1-x1);    vis->patch = lump;        // get light level    if (thing->flags & MF_SHADOW)    {	// shadow draw	vis->colormap = NULL;    }    else if (fixedcolormap)    {	// fixed map	vis->colormap = fixedcolormap;    }    else if (thing->frame & FF_FULLBRIGHT)    {	// full bright	vis->colormap = colormaps;    }        else    {	// diminished light	index = xscale>>(LIGHTSCALESHIFT-detailshift);	if (index >= MAXLIGHTSCALE) 	    index = MAXLIGHTSCALE-1;	vis->colormap = spritelights[index];    }	}//// R_AddSprites// During BSP traversal, this adds sprites by sector.//void R_AddSprites (sector_t* sec){    mobj_t*		thing;    int			lightnum;    // BSP is traversed by subsector.    // A sector might have been split into several    //  subsectors during BSP building.    // Thus we check whether its already added.    if (sec->validcount == validcount)	return;		    // Well, now it will be done.    sec->validcount = validcount;	    lightnum = (sec->lightlevel >> LIGHTSEGSHIFT)+extralight;    if (lightnum < 0)			spritelights = scalelight[0];    else if (lightnum >= LIGHTLEVELS)	spritelights = scalelight[LIGHTLEVELS-1];    else	spritelights = scalelight[lightnum];    // Handle all things in sector.    for (thing = sec->thinglist ; thing ; thing = thing->snext)	R_ProjectSprite (thing);}//// R_DrawPSprite//void R_DrawPSprite (pspdef_t* psp){    fixed_t		tx;    int			x1;    int			x2;    spritedef_t*	sprdef;    spriteframe_t*	sprframe;    int			lump;    boolean		flip;    vissprite_t*	vis;    vissprite_t		avis;        // decide which patch to use#ifdef RANGECHECK    if ( (unsigned)psp->state->sprite >= numsprites)	I_Error ("R_ProjectSprite: invalid sprite number %i ",		 psp->state->sprite);#endif    sprdef = &sprites[psp->state->sprite];#ifdef RANGECHECK    if ( (psp->state->frame & FF_FRAMEMASK)  >= sprdef->numframes)	I_Error ("R_ProjectSprite: invalid sprite frame %i : %i ",		 psp->state->sprite, psp->state->frame);#endif    sprframe = &sprdef->spriteframes[ psp->state->frame & FF_FRAMEMASK ];    lump = sprframe->lump[0];    flip = (boolean)sprframe->flip[0];        // calculate edges of the shape    tx = psp->sx-160*FRACUNIT;	    tx -= spriteoffset[lump];	    x1 = (centerxfrac + FixedMul (tx,pspritescale) ) >>FRACBITS;    // off the right side    if (x1 > viewwidth)	return;		    tx +=  spritewidth[lump];    x2 = ((centerxfrac + FixedMul (tx, pspritescale) ) >>FRACBITS) - 1;    // off the left side    if (x2 < 0)	return;        // store information in a vissprite    vis = &avis;    vis->mobjflags = 0;    vis->texturemid = (BASEYCENTER<<FRACBITS)+FRACUNIT/2-(psp->sy-spritetopoffset[lump]);    vis->x1 = x1 < 0 ? 0 : x1;    vis->x2 = x2 >= viewwidth ? viewwidth-1 : x2;	    vis->scale = pspritescale<<detailshift;        if (flip)    {	vis->xiscale = -pspriteiscale;	vis->startfrac = spritewidth[lump]-1;    }    else    {	vis->xiscale = pspriteiscale;	vis->startfrac = 0;    }        if (vis->x1 > x1)	vis->startfrac += vis->xiscale*(vis->x1-x1);    vis->patch = lump;    if (viewplayer->powers[pw_invisibility] > 4*32	|| viewplayer->powers[pw_invisibility] & 8)    {	// shadow draw	vis->colormap = NULL;    }    else if (fixedcolormap)    {	// fixed color	vis->colormap = fixedcolormap;    }    else if (psp->state->frame & FF_FULLBRIGHT)    {	// full bright	vis->colormap = colormaps;    }    else    {	// local light	vis->colormap = spritelights[MAXLIGHTSCALE-1];    }	    R_DrawVisSprite (vis, vis->x1, vis->x2);}//// R_DrawPlayerSprites//void R_DrawPlayerSprites (void){    int		i;    int		lightnum;    pspdef_t*	psp;        // get light level    lightnum =	(viewplayer->mo->subsector->sector->lightlevel >> LIGHTSEGSHIFT) 	+extralight;    if (lightnum < 0)			spritelights = scalelight[0];    else if (lightnum >= LIGHTLEVELS)	spritelights = scalelight[LIGHTLEVELS-1];    else	spritelights = scalelight[lightnum];        // clip to screen bounds    mfloorclip = screenheightarray;    mceilingclip = negonearray;        // add all active psprites    for (i=0, psp=viewplayer->psprites;	 i<NUMPSPRITES;	 i++,psp++)    {	if (psp->state)	    R_DrawPSprite (psp);    }}//// R_SortVisSprites//vissprite_t	vsprsortedhead;void R_SortVisSprites (void){    int			i;    int			count;    vissprite_t*	ds;    vissprite_t*	best;    vissprite_t		unsorted;    fixed_t		bestscale;    count = vissprite_p - vissprites;	    unsorted.next = unsorted.prev = &unsorted;    if (!count)	return;		    for (ds=vissprites ; ds<vissprite_p ; ds++)    {	ds->next = ds+1;	ds->prev = ds-1;    }        vissprites[0].prev = &unsorted;    unsorted.next = &vissprites[0];    (vissprite_p-1)->next = &unsorted;    unsorted.prev = vissprite_p-1;        // pull the vissprites out by scale    //best = 0;		// shut up the compiler warning    vsprsortedhead.next = vsprsortedhead.prev = &vsprsortedhead;    for (i=0 ; i<count ; i++)    {	bestscale = MAXINT;	for (ds=unsorted.next ; ds!= &unsorted ; ds=ds->next)	{	    if (ds->scale < bestscale)	    {		bestscale = ds->scale;		best = ds;	    }	}	best->next->prev = best->prev;	best->prev->next = best->next;	best->next = &vsprsortedhead;	best->prev = vsprsortedhead.prev;	vsprsortedhead.prev->next = best;	vsprsortedhead.prev = best;    }}//// R_DrawSprite//void R_DrawSprite (vissprite_t* spr){    drawseg_t*		ds;    short		clipbot[SCREENWIDTH];    short		cliptop[SCREENWIDTH];    int			x;    int			r1;    int			r2;    fixed_t		scale;    fixed_t		lowscale;    int			silhouette;		    for (x = spr->x1 ; x<=spr->x2 ; x++)	clipbot[x] = cliptop[x] = -2;        // Scan drawsegs from end to start for obscuring segs.    // The first drawseg that has a greater scale    //  is the clip seg.    for (ds=ds_p-1 ; ds >= drawsegs ; ds--)    {	// determine if the drawseg obscures the sprite	if (ds->x1 > spr->x2	    || ds->x2 < spr->x1	    || (!ds->silhouette		&& !ds->maskedtexturecol) )	{	    // does not cover sprite	    continue;	}				r1 = ds->x1 < spr->x1 ? spr->x1 : ds->x1;	r2 = ds->x2 > spr->x2 ? spr->x2 : ds->x2;	if (ds->scale1 > ds->scale2)	{	    lowscale = ds->scale2;	    scale = ds->scale1;	}	else	{	    lowscale = ds->scale1;	    scale = ds->scale2;	}			if (scale < spr->scale	    || ( lowscale < spr->scale		 && !R_PointOnSegSide (spr->gx, spr->gy, ds->curline) ) )	{	    // masked mid texture?	    if (ds->maskedtexturecol)			R_RenderMaskedSegRange (ds, r1, r2);	    // seg is behind sprite	    continue;				}		// clip this piece of the sprite	silhouette = ds->silhouette;		if (spr->gz >= ds->bsilheight)	    silhouette &= ~SIL_BOTTOM;	if (spr->gzt <= ds->tsilheight)	    silhouette &= ~SIL_TOP;				if (silhouette == 1)	{	    // bottom sil	    for (x=r1 ; x<=r2 ; x++)		if (clipbot[x] == -2)		    clipbot[x] = ds->sprbottomclip[x];	}	else if (silhouette == 2)	{	    // top sil	    for (x=r1 ; x<=r2 ; x++)		if (cliptop[x] == -2)		    cliptop[x] = ds->sprtopclip[x];	}	else if (silhouette == 3)	{	    // both	    for (x=r1 ; x<=r2 ; x++)	    {		if (clipbot[x] == -2)		    clipbot[x] = ds->sprbottomclip[x];		if (cliptop[x] == -2)		    cliptop[x] = ds->sprtopclip[x];	    }	}		    }        // all clipping has been performed, so draw the sprite    // check for unclipped columns    for (x = spr->x1 ; x<=spr->x2 ; x++)    {	if (clipbot[x] == -2)			    clipbot[x] = viewheight;	if (cliptop[x] == -2)	    cliptop[x] = -1;    }		    mfloorclip = clipbot;    mceilingclip = cliptop;    R_DrawVisSprite (spr, spr->x1, spr->x2);}//// R_DrawMasked//void R_DrawMasked (void){    vissprite_t*	spr;    drawseg_t*		ds;	    R_SortVisSprites ();    if (vissprite_p > vissprites)    {	// draw all vissprites back to front	for (spr = vsprsortedhead.next ;	     spr != &vsprsortedhead ;	     spr=spr->next)	{	    	    R_DrawSprite (spr);	}    }        // render any remaining masked mid textures    for (ds=ds_p-1 ; ds >= drawsegs ; ds--)	if (ds->maskedtexturecol)	    R_RenderMaskedSegRange (ds, ds->x1, ds->x2);        // draw the psprites on top of everything    //  but does not draw on side views    if (!viewangleoffset)			R_DrawPlayerSprites ();}

⌨️ 快捷键说明

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