mirror of
https://github.com/ZDoom/qzdoom-gpl.git
synced 2024-12-03 17:02:12 +00:00
208 lines
4.5 KiB
C
208 lines
4.5 KiB
C
|
#ifndef __P_MAPUTL_H
|
||
|
#define __P_MAPUTL_H
|
||
|
|
||
|
#include "r_defs.h"
|
||
|
#include "doomstat.h"
|
||
|
|
||
|
extern int validcount;
|
||
|
|
||
|
struct divline_t
|
||
|
{
|
||
|
fixed_t x;
|
||
|
fixed_t y;
|
||
|
fixed_t dx;
|
||
|
fixed_t dy;
|
||
|
};
|
||
|
|
||
|
struct intercept_t
|
||
|
{
|
||
|
fixed_t frac; // along trace line
|
||
|
bool isaline;
|
||
|
bool done;
|
||
|
union {
|
||
|
AActor *thing;
|
||
|
line_t *line;
|
||
|
} d;
|
||
|
};
|
||
|
|
||
|
|
||
|
//==========================================================================
|
||
|
//
|
||
|
// P_PointOnLineSide
|
||
|
//
|
||
|
// Returns 0 (front/on) or 1 (back)
|
||
|
// [RH] inlined, stripped down, and made more precise
|
||
|
//
|
||
|
//==========================================================================
|
||
|
|
||
|
inline int P_PointOnLineSide (fixed_t x, fixed_t y, const line_t *line)
|
||
|
{
|
||
|
extern int P_VanillaPointOnLineSide(fixed_t x, fixed_t y, const line_t* line);
|
||
|
|
||
|
return i_compatflags2 & COMPATF2_POINTONLINE
|
||
|
? P_VanillaPointOnLineSide(x, y, line)
|
||
|
: DMulScale32 (y-line->v1->y, line->dx, line->v1->x-x, line->dy) > 0;
|
||
|
}
|
||
|
|
||
|
inline int P_PointOnLineSidePrecise (fixed_t x, fixed_t y, const line_t *line)
|
||
|
{
|
||
|
return DMulScale32 (y-line->v1->y, line->dx, line->v1->x-x, line->dy) > 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
//==========================================================================
|
||
|
//
|
||
|
// P_PointOnDivlineSide
|
||
|
//
|
||
|
// Same as P_PointOnLineSide except it uses divlines
|
||
|
// [RH] inlined, stripped down, and made more precise
|
||
|
//
|
||
|
//==========================================================================
|
||
|
|
||
|
inline int P_PointOnDivlineSide (fixed_t x, fixed_t y, const divline_t *line)
|
||
|
{
|
||
|
extern int P_VanillaPointOnDivlineSide(fixed_t x, fixed_t y, const divline_t* line);
|
||
|
|
||
|
return (i_compatflags2 & COMPATF2_POINTONLINE)
|
||
|
? P_VanillaPointOnDivlineSide(x, y, line)
|
||
|
: (DMulScale32 (y-line->y, line->dx, line->x-x, line->dy) > 0);
|
||
|
}
|
||
|
|
||
|
inline int P_PointOnDivlineSidePrecise (fixed_t x, fixed_t y, const divline_t *line)
|
||
|
{
|
||
|
return DMulScale32 (y-line->y, line->dx, line->x-x, line->dy) > 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
//==========================================================================
|
||
|
//
|
||
|
// P_MakeDivline
|
||
|
//
|
||
|
//==========================================================================
|
||
|
|
||
|
inline void P_MakeDivline (const line_t *li, divline_t *dl)
|
||
|
{
|
||
|
dl->x = li->v1->x;
|
||
|
dl->y = li->v1->y;
|
||
|
dl->dx = li->dx;
|
||
|
dl->dy = li->dy;
|
||
|
}
|
||
|
|
||
|
struct FLineOpening
|
||
|
{
|
||
|
fixed_t top;
|
||
|
fixed_t bottom;
|
||
|
fixed_t range;
|
||
|
fixed_t lowfloor;
|
||
|
sector_t *bottomsec;
|
||
|
sector_t *topsec;
|
||
|
FTextureID ceilingpic;
|
||
|
FTextureID floorpic;
|
||
|
int floorterrain;
|
||
|
bool touchmidtex;
|
||
|
bool abovemidtex;
|
||
|
};
|
||
|
|
||
|
void P_LineOpening (FLineOpening &open, AActor *thing, const line_t *linedef, fixed_t x, fixed_t y, fixed_t refx=FIXED_MIN, fixed_t refy=0, int flags=0);
|
||
|
|
||
|
class FBoundingBox;
|
||
|
struct polyblock_t;
|
||
|
|
||
|
class FBlockLinesIterator
|
||
|
{
|
||
|
int minx, maxx;
|
||
|
int miny, maxy;
|
||
|
|
||
|
int curx, cury;
|
||
|
polyblock_t *polyLink;
|
||
|
int polyIndex;
|
||
|
int *list;
|
||
|
|
||
|
void StartBlock(int x, int y);
|
||
|
|
||
|
public:
|
||
|
FBlockLinesIterator(int minx, int miny, int maxx, int maxy, bool keepvalidcount = false);
|
||
|
FBlockLinesIterator(const FBoundingBox &box);
|
||
|
line_t *Next();
|
||
|
void Reset() { StartBlock(minx, miny); }
|
||
|
};
|
||
|
|
||
|
class FBlockThingsIterator
|
||
|
{
|
||
|
int minx, maxx;
|
||
|
int miny, maxy;
|
||
|
|
||
|
int curx, cury;
|
||
|
|
||
|
FBlockNode *block;
|
||
|
|
||
|
int Buckets[32];
|
||
|
|
||
|
struct HashEntry
|
||
|
{
|
||
|
AActor *Actor;
|
||
|
int Next;
|
||
|
};
|
||
|
HashEntry FixedHash[10];
|
||
|
int NumFixedHash;
|
||
|
TArray<HashEntry> DynHash;
|
||
|
|
||
|
HashEntry *GetHashEntry(int i) { return i < (int)countof(FixedHash) ? &FixedHash[i] : &DynHash[i - countof(FixedHash)]; }
|
||
|
|
||
|
void StartBlock(int x, int y);
|
||
|
void SwitchBlock(int x, int y);
|
||
|
void ClearHash();
|
||
|
|
||
|
// The following is only for use in the path traverser
|
||
|
// and therefore declared private.
|
||
|
FBlockThingsIterator();
|
||
|
|
||
|
friend class FPathTraverse;
|
||
|
|
||
|
public:
|
||
|
FBlockThingsIterator(int minx, int miny, int maxx, int maxy);
|
||
|
FBlockThingsIterator(const FBoundingBox &box);
|
||
|
AActor *Next(bool centeronly = false);
|
||
|
void Reset() { StartBlock(minx, miny); }
|
||
|
};
|
||
|
|
||
|
class FPathTraverse
|
||
|
{
|
||
|
static TArray<intercept_t> intercepts;
|
||
|
|
||
|
divline_t trace;
|
||
|
unsigned int intercept_index;
|
||
|
unsigned int intercept_count;
|
||
|
unsigned int count;
|
||
|
|
||
|
void AddLineIntercepts(int bx, int by);
|
||
|
void AddThingIntercepts(int bx, int by, FBlockThingsIterator &it, bool compatible);
|
||
|
public:
|
||
|
|
||
|
intercept_t *Next();
|
||
|
|
||
|
FPathTraverse(fixed_t x1, fixed_t y1, fixed_t x2, fixed_t y2, int flags);
|
||
|
~FPathTraverse();
|
||
|
const divline_t &Trace() const { return trace; }
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// P_MAPUTL
|
||
|
//
|
||
|
|
||
|
typedef bool(*traverser_t) (intercept_t *in);
|
||
|
|
||
|
fixed_t P_AproxDistance (fixed_t dx, fixed_t dy);
|
||
|
|
||
|
|
||
|
fixed_t P_InterceptVector (const divline_t *v2, const divline_t *v1);
|
||
|
|
||
|
#define PT_ADDLINES 1
|
||
|
#define PT_ADDTHINGS 2
|
||
|
#define PT_COMPATIBLE 4
|
||
|
#define PT_DELTA 8 // x2,y2 is passed as a delta, not as an endpoint
|
||
|
|
||
|
|
||
|
#endif
|