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

📄 p_maputl.c

📁 Nxdoom真的满好用的
💻 C
📖 第 1 页 / 共 2 页
字号:
// Emacs style mode select   -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: p_maputl.c,v 1.2 2003/09/08 22:34:29 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: p_maputl.c,v $// Revision 1.2  2003/09/08 22:34:29  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:53  jeffw// nxdoom initial entry -- No nxdoom/Makefile so it won't build automatically////// DESCRIPTION://	Movement/collision utility functions,//	as used by function in p_map.c. //	BLOCKMAP Iterator functions,//	and some PIT_* functions to use for iteration.////-----------------------------------------------------------------------------static const charrcsid[] = "$Id: p_maputl.c,v 1.2 2003/09/08 22:34:29 jasonk Exp $";#include <stdlib.h>#include "m_bbox.h"#include "doomdef.h"#include "p_local.h"// State.#include "r_state.h"//// P_AproxDistance// Gives an estimation of distance (not exact)//fixed_tP_AproxDistance( fixed_t	dx,  fixed_t	dy ){    dx = abs(dx);    dy = abs(dy);    if (dx < dy)	return dx+dy-(dx>>1);    return dx+dy-(dy>>1);}//// P_PointOnLineSide// Returns 0 or 1//intP_PointOnLineSide( fixed_t	x,  fixed_t	y,  line_t*	line ){    fixed_t	dx;    fixed_t	dy;    fixed_t	left;    fixed_t	right;	    if (!line->dx)    {	if (x <= line->v1->x)	    return line->dy > 0;		return line->dy < 0;    }    if (!line->dy)    {	if (y <= line->v1->y)	    return line->dx < 0;		return line->dx > 0;    }	    dx = (x - line->v1->x);    dy = (y - line->v1->y);	    left = FixedMul ( line->dy>>FRACBITS , dx );    right = FixedMul ( dy , line->dx>>FRACBITS );	    if (right < left)	return 0;		// front side    return 1;			// back side}//// P_BoxOnLineSide// Considers the line to be infinite// Returns side 0 or 1, -1 if box crosses the line.//intP_BoxOnLineSide( fixed_t*	tmbox,  line_t*	ld ){    int		p1;    int		p2;	    switch (ld->slopetype)    {      case ST_HORIZONTAL:	p1 = tmbox[BOXTOP] > ld->v1->y;	p2 = tmbox[BOXBOTTOM] > ld->v1->y;	if (ld->dx < 0)	{	    p1 ^= 1;	    p2 ^= 1;	}	break;	      case ST_VERTICAL:	p1 = tmbox[BOXRIGHT] < ld->v1->x;	p2 = tmbox[BOXLEFT] < ld->v1->x;	if (ld->dy < 0)	{	    p1 ^= 1;	    p2 ^= 1;	}	break;	      case ST_POSITIVE:	p1 = P_PointOnLineSide (tmbox[BOXLEFT], tmbox[BOXTOP], ld);	p2 = P_PointOnLineSide (tmbox[BOXRIGHT], tmbox[BOXBOTTOM], ld);	break;	      case ST_NEGATIVE:	p1 = P_PointOnLineSide (tmbox[BOXRIGHT], tmbox[BOXTOP], ld);	p2 = P_PointOnLineSide (tmbox[BOXLEFT], tmbox[BOXBOTTOM], ld);	break;    }    if (p1 == p2)	return p1;    return -1;}//// P_PointOnDivlineSide// Returns 0 or 1.//intP_PointOnDivlineSide( fixed_t	x,  fixed_t	y,  divline_t*	line ){    fixed_t	dx;    fixed_t	dy;    fixed_t	left;    fixed_t	right;	    if (!line->dx)    {	if (x <= line->x)	    return line->dy > 0;		return line->dy < 0;    }    if (!line->dy)    {	if (y <= line->y)	    return line->dx < 0;	return line->dx > 0;    }	    dx = (x - line->x);    dy = (y - line->y);	    // try to quickly decide by looking at sign bits    if ( (line->dy ^ line->dx ^ dx ^ dy)&0x80000000 )    {	if ( (line->dy ^ dx) & 0x80000000 )	    return 1;		// (left is negative)	return 0;    }	    left = FixedMul ( line->dy>>8, dx>>8 );    right = FixedMul ( dy>>8 , line->dx>>8 );	    if (right < left)	return 0;		// front side    return 1;			// back side}//// P_MakeDivline//voidP_MakeDivline( line_t*	li,  divline_t*	dl ){    dl->x = li->v1->x;    dl->y = li->v1->y;    dl->dx = li->dx;    dl->dy = li->dy;}//// P_InterceptVector// Returns the fractional intercept point// along the first divline.// This is only called by the addthings// and addlines traversers.//fixed_tP_InterceptVector( divline_t*	v2,  divline_t*	v1 ){#if 1    fixed_t	frac;    fixed_t	num;    fixed_t	den;	    den = FixedMul (v1->dy>>8,v2->dx) - FixedMul(v1->dx>>8,v2->dy);    if (den == 0)	return 0;    //	I_Error ("P_InterceptVector: parallel");        num =	FixedMul ( (v1->x - v2->x)>>8 ,v1->dy )	+FixedMul ( (v2->y - v1->y)>>8, v1->dx );    frac = FixedDiv (num , den);    return frac;#else	// UNUSED, float debug.    float	frac;    float	num;    float	den;    float	v1x;    float	v1y;    float	v1dx;    float	v1dy;    float	v2x;    float	v2y;    float	v2dx;    float	v2dy;    v1x = (float)v1->x/FRACUNIT;    v1y = (float)v1->y/FRACUNIT;    v1dx = (float)v1->dx/FRACUNIT;    v1dy = (float)v1->dy/FRACUNIT;    v2x = (float)v2->x/FRACUNIT;    v2y = (float)v2->y/FRACUNIT;    v2dx = (float)v2->dx/FRACUNIT;    v2dy = (float)v2->dy/FRACUNIT;	    den = v1dy*v2dx - v1dx*v2dy;    if (den == 0)	return 0;	// parallel        num = (v1x - v2x)*v1dy + (v2y - v1y)*v1dx;    frac = num / den;    return frac*FRACUNIT;#endif}//// P_LineOpening// Sets opentop and openbottom to the window// through a two sided line.// OPTIMIZE: keep this precalculated//fixed_t opentop;fixed_t openbottom;fixed_t openrange;fixed_t	lowfloor;void P_LineOpening (line_t* linedef){    sector_t*	front;    sector_t*	back;	    if (linedef->sidenum[1] == -1)    {	// single sided line	openrange = 0;	return;    }	     front = linedef->frontsector;    back = linedef->backsector;	    if (front->ceilingheight < back->ceilingheight)	opentop = front->ceilingheight;    else	opentop = back->ceilingheight;    if (front->floorheight > back->floorheight)    {	openbottom = front->floorheight;	lowfloor = back->floorheight;    }    else    {	openbottom = back->floorheight;	lowfloor = front->floorheight;    }	    openrange = opentop - openbottom;}//// THING POSITION SETTING////// P_UnsetThingPosition// Unlinks a thing from block map and sectors.// On each position change, BLOCKMAP and other// lookups maintaining lists ot things inside// these structures need to be updated.//void P_UnsetThingPosition (mobj_t* thing){    int		blockx;    int		blocky;    if ( ! (thing->flags & MF_NOSECTOR) )    {	// inert things don't need to be in blockmap?	// unlink from subsector	if (thing->snext)	    thing->snext->sprev = thing->sprev;	if (thing->sprev)	    thing->sprev->snext = thing->snext;	else	    thing->subsector->sector->thinglist = thing->snext;    }	    if ( ! (thing->flags & MF_NOBLOCKMAP) )    {	// inert things don't need to be in blockmap	// unlink from block map	if (thing->bnext)	    thing->bnext->bprev = thing->bprev;		if (thing->bprev)	    thing->bprev->bnext = thing->bnext;	else	{	    blockx = (thing->x - bmaporgx)>>MAPBLOCKSHIFT;	    blocky = (thing->y - bmaporgy)>>MAPBLOCKSHIFT;	    if (blockx>=0 && blockx < bmapwidth		&& blocky>=0 && blocky <bmapheight)	    {		blocklinks[blocky*bmapwidth+blockx] = thing->bnext;	    }	}    }}//// P_SetThingPosition// Links a thing into both a block and a subsector// based on it's x y.// Sets thing->subsector properly//voidP_SetThingPosition (mobj_t* thing){    subsector_t*	ss;    sector_t*		sec;    int			blockx;    int			blocky;    mobj_t**		link;        // link into subsector    ss = R_PointInSubsector (thing->x,thing->y);    thing->subsector = ss;        if ( ! (thing->flags & MF_NOSECTOR) )    {	// invisible things don't go into the sector links	sec = ss->sector;		thing->sprev = NULL;	thing->snext = sec->thinglist;	if (sec->thinglist)	    sec->thinglist->sprev = thing;	sec->thinglist = thing;    }        // link into blockmap    if ( ! (thing->flags & MF_NOBLOCKMAP) )    {	// inert things don't need to be in blockmap			blockx = (thing->x - bmaporgx)>>MAPBLOCKSHIFT;	blocky = (thing->y - bmaporgy)>>MAPBLOCKSHIFT;	if (blockx>=0	    && blockx < bmapwidth	    && blocky>=0	    && blocky < bmapheight)	{	    link = &blocklinks[blocky*bmapwidth+blockx];	    thing->bprev = NULL;	    thing->bnext = *link;

⌨️ 快捷键说明

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