mirror of
https://github.com/ZDoom/qzdoom-gpl.git
synced 2024-12-03 00:42:36 +00:00
6adb069506
This was to resolve some circular dependencies with the portal code. The most notable changees: * FTextureID was moved from textures.h to doomtype.h because it is frequently needed in files that don't want to do anything with actual textures. * split off the parts from p_maputl into a separate header. * consolidated all blockmap related data into p_blockmap.h * split off the polyobject parts into po_man.h
208 lines
No EOL
4.5 KiB
C++
208 lines
No EOL
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 |