- separated FCheckPosition and its FPortalGroupTable substructure into its own header because this was creating too many dependencies on other headers with FCheckPosition in p_local.h and FPortalGroupTable in portals.h.

This commit is contained in:
Christoph Oelckers 2016-02-15 13:40:31 +01:00
parent 5664cee2e5
commit f24bf7e622
10 changed files with 144 additions and 75 deletions

View file

@ -23,6 +23,7 @@
#include "d_event.h"
#include "d_player.h"
#include "p_spec.h"
#include "p_checkposition.h"
static FRandom pr_botdofire ("BotDoFire");

View file

@ -20,6 +20,7 @@
#include "p_enemy.h"
#include "d_player.h"
#include "p_spec.h"
#include "p_checkposition.h"
static FRandom pr_botopendoor ("BotOpenDoor");
static FRandom pr_bottrywalk ("BotTryWalk");

View file

@ -5,6 +5,7 @@
#include "r_sky.h"
#include "p_lnspec.h"
#include "b_bot.h"
#include "p_checkposition.h"
IMPLEMENT_CLASS(AFastProjectile)

93
src/p_checkposition.h Normal file
View file

@ -0,0 +1,93 @@
#ifndef P_CHECKPOS_H
#define P_CHECKPOS_H
//============================================================================
//
// Data structure which collects all portals being touched by an actor
// when checking its position.
//
//============================================================================
struct FPortalGroupTable
{
TArray<DWORD> data;
TArray<int> touchingGroups;
void setSize(int num)
{
data.Resize((num + 31) / 32);
memset(&data[0], 0, data.Size()*sizeof(DWORD));
}
void clear()
{
data.Clear();
touchingGroups.Clear();
}
void setBit(int group)
{
if (!getBit(group))
{
data[group >> 5] |= (1 << (group & 31));
touchingGroups.Push(group);
}
}
int getBit(int group)
{
return data[group >> 5] & (1 << (group & 31));
}
};
//============================================================================
//
// Used by P_CheckPosition and P_TryMove in place of the original
// set of global variables.
//
//============================================================================
struct FCheckPosition
{
// in
AActor *thing;
fixed_t x;
fixed_t y;
fixed_t z;
// out
sector_t *sector;
fixed_t floorz;
fixed_t ceilingz;
fixed_t dropoffz;
FTextureID floorpic;
int floorterrain;
sector_t *floorsector;
FTextureID ceilingpic;
sector_t *ceilingsector;
bool touchmidtex;
bool abovemidtex;
bool floatok;
bool FromPMove;
line_t *ceilingline;
AActor *stepthing;
// [RH] These are used by PIT_CheckThing and P_XYMovement to apply
// ripping damage once per tic instead of once per move.
bool DoRipping;
TMap<AActor*, bool> LastRipped;
//FPortalGroupTable Groups;
int PushTime;
FCheckPosition(bool rip=false)
{
DoRipping = rip;
PushTime = 0;
FromPMove = false;
}
};
#endif

View file

@ -51,6 +51,7 @@
#include "r_data/r_translate.h"
#include "teaminfo.h"
#include "p_spec.h"
#include "p_checkposition.h"
#include "gi.h"

View file

@ -36,7 +36,7 @@ struct line_t;
struct sector_t;
struct msecnode_t;
struct secplane_t;
struct FCheckPosition;
#include <stdlib.h>
@ -235,47 +235,6 @@ AActor *P_RoughMonsterSearch (AActor *mo, int distance, bool onlyseekable=false)
// P_MAP
//
struct FCheckPosition
{
// in
AActor *thing;
fixed_t x;
fixed_t y;
fixed_t z;
// out
sector_t *sector;
fixed_t floorz;
fixed_t ceilingz;
fixed_t dropoffz;
FTextureID floorpic;
int floorterrain;
sector_t *floorsector;
FTextureID ceilingpic;
sector_t *ceilingsector;
bool touchmidtex;
bool abovemidtex;
bool floatok;
bool FromPMove;
line_t *ceilingline;
AActor *stepthing;
// [RH] These are used by PIT_CheckThing and P_XYMovement to apply
// ripping damage once per tic instead of once per move.
bool DoRipping;
TMap<AActor*, bool> LastRipped;
//FPortalGroupTable Groups;
int PushTime;
FCheckPosition(bool rip=false)
{
DoRipping = rip;
PushTime = 0;
FromPMove = false;
}
};
// If "floatok" true, move would be ok
// if within "tmfloorz - tmceilingz".

View file

@ -41,6 +41,7 @@
#include "p_effect.h"
#include "p_terrain.h"
#include "p_trace.h"
#include "p_checkposition.h"
#include "r_utility.h"
#include "s_sound.h"

View file

@ -69,6 +69,7 @@
#include "r_renderer.h"
#include "po_man.h"
#include "p_spec.h"
#include "p_checkposition.h"
// MACROS ------------------------------------------------------------------

View file

@ -52,6 +52,7 @@
#include "c_dispatch.h"
#include "p_maputl.h"
#include "p_spec.h"
#include "p_checkposition.h"
// simulation recurions maximum
CVAR(Int, sv_portal_recursions, 4, CVAR_ARCHIVE|CVAR_SERVERINFO)
@ -672,8 +673,6 @@ bool PortalTracer::TraceStep()
return (oDepth != depth); // if a portal has been found, return false
}
//============================================================================
//
// CollectSectors

View file

@ -9,6 +9,25 @@
#include "m_bbox.h"
#include "a_sharedglobal.h"
struct FPortalGroupTable;
//============================================================================
//
// This table holds the offsets for the different parts of a map
// that are connected by portals.
// The idea here is basically the same as implemented in Eternity Engine:
//
// - each portal creates two sector groups in the map
// which are offset by the displacement of the portal anchors
//
// - for two or multiple groups the displacement is calculated by
// adding the displacements between intermediate groups which
// have to be traversed to connect the two
//
// - any sector not connected to any portal is assigned to group 0
// Group 0 has no displacement to any other group in the level.
//
//============================================================================
struct FDisplacement
{
fixed_t x, y;
@ -36,37 +55,11 @@ struct FDisplacementTable
extern FDisplacementTable Displacements;
struct FPortalGroupTable
{
TArray<DWORD> data;
TArray<int> touchingGroups;
void setSize(int num)
{
data.Resize((num + 31) / 32);
memset(&data[0], 0, data.Size()*sizeof(DWORD));
}
void clear()
{
data.Clear();
touchingGroups.Clear();
}
void setBit(int group)
{
if (!getBit(group))
{
data[group >> 5] |= (1 << (group & 31));
touchingGroups.Push(group);
}
}
int getBit(int group)
{
return data[group >> 5] & (1 << (group & 31));
}
};
//============================================================================
//
// Flags and types for linedef portals
//
//============================================================================
enum
{
@ -101,6 +94,14 @@ enum
PCOLL_LINKED = 2
};
//============================================================================
//
// All information about a line-to-line portal (all types)
// There is no structure for sector plane portals because for historic
// reasons those use actors to connect.
//
//============================================================================
struct FLinePortal
{
line_t *mOrigin;
@ -135,9 +136,14 @@ void P_TranslatePortalAngle(line_t* src, line_t* dst, angle_t& angle);
void P_TranslatePortalZ(line_t* src, line_t* dst, fixed_t& z);
void P_NormalizeVXVY(fixed_t& vx, fixed_t& vy);
//============================================================================
//
// basically, this is a teleporting tracer function,
// which can be used by itself (to calculate portal-aware offsets, say, for projectiles)
// or to teleport normal tracers (like hitscan, railgun, autoaim tracers)
//
//============================================================================
class PortalTracer
{
public:
@ -169,6 +175,12 @@ public:
/* new code */
fixed_t P_PointLineDistance(line_t* line, fixed_t x, fixed_t y);
//============================================================================
//
// some wrappers around the portal data.
//
//============================================================================
// returns true if the portal is crossable by actors
inline bool line_t::isLinePortal() const