- untangled r_defs.h from actor.h

Both files can now be included independently without causing problems.
This also required moving some inline functions into separate files and splitting off the GC definitions from dobject.h to ensure that r_defs does not need to pull in any part of the object hierarchy.
This commit is contained in:
Christoph Oelckers 2017-03-10 02:22:42 +01:00
parent ea0a9b537b
commit bd7476fb8d
49 changed files with 441 additions and 350 deletions

55
src/actorinlines.h Normal file
View file

@ -0,0 +1,55 @@
#pragma once
#include "actor.h"
#include "r_defs.h"
// These depend on both actor.h and r_defs.h so they cannot be in either file without creating a cross dependency.
inline DVector3 AActor::PosRelative(int portalgroup) const
{
return Pos() + Displacements.getOffset(Sector->PortalGroup, portalgroup);
}
inline DVector3 AActor::PosRelative(const AActor *other) const
{
return Pos() + Displacements.getOffset(Sector->PortalGroup, other->Sector->PortalGroup);
}
inline DVector3 AActor::PosRelative(sector_t *sec) const
{
return Pos() + Displacements.getOffset(Sector->PortalGroup, sec->PortalGroup);
}
inline DVector3 AActor::PosRelative(line_t *line) const
{
return Pos() + Displacements.getOffset(Sector->PortalGroup, line->frontsector->PortalGroup);
}
inline DVector3 PosRelative(const DVector3 &pos, line_t *line, sector_t *refsec = NULL)
{
return pos + Displacements.getOffset(refsec->PortalGroup, line->frontsector->PortalGroup);
}
inline void AActor::ClearInterpolation()
{
Prev = Pos();
PrevAngles = Angles;
if (Sector) PrevPortalGroup = Sector->PortalGroup;
else PrevPortalGroup = 0;
}
inline double secplane_t::ZatPoint(const AActor *ac) const
{
return (D + normal.X*ac->X() + normal.Y*ac->Y()) * negiC;
}
inline double sector_t::HighestCeilingAt(AActor *a, sector_t **resultsec)
{
return HighestCeilingAt(a->Pos(), resultsec);
}
inline double sector_t::LowestFloorAt(AActor *a, sector_t **resultsec)
{
return LowestFloorAt(a->Pos(), resultsec);
}

View file

@ -185,236 +185,7 @@ protected: \
#define _X_VMEXPORT_true(cls) nullptr
#define _X_VMEXPORT_false(cls) nullptr
enum EObjectFlags
{
// GC flags
OF_White0 = 1 << 0, // Object is white (type 0)
OF_White1 = 1 << 1, // Object is white (type 1)
OF_Black = 1 << 2, // Object is black
OF_Fixed = 1 << 3, // Object is fixed (should not be collected)
OF_Rooted = 1 << 4, // Object is soft-rooted
OF_EuthanizeMe = 1 << 5, // Object wants to die
OF_Cleanup = 1 << 6, // Object is now being deleted by the collector
OF_YesReallyDelete = 1 << 7, // Object is being deleted outside the collector, and this is okay, so don't print a warning
OF_WhiteBits = OF_White0 | OF_White1,
OF_MarkBits = OF_WhiteBits | OF_Black,
// Other flags
OF_JustSpawned = 1 << 8, // Thinker was spawned this tic
OF_SerialSuccess = 1 << 9, // For debugging Serialize() calls
OF_Sentinel = 1 << 10, // Object is serving as the sentinel in a ring list
OF_Transient = 1 << 11, // Object should not be archived (references to it will be nulled on disk)
OF_Spawned = 1 << 12, // Thinker was spawned at all (some thinkers get deleted before spawning)
OF_Released = 1 << 13, // Object was released from the GC system and should not be processed by GC function
OF_Abstract = 1 << 14, // Marks a class that cannot be created with new() function at all
OF_UI = 1 << 15, // Marks a class that defaults to VARF_UI for it's fields/methods
OF_Play = 1 << 16, // Marks a class that defaults to VARF_Play for it's fields/methods
};
template<class T> class TObjPtr;
namespace GC
{
enum EGCState
{
GCS_Pause,
GCS_Propagate,
GCS_Sweep,
GCS_Finalize
};
// Number of bytes currently allocated through M_Malloc/M_Realloc.
extern size_t AllocBytes;
// Amount of memory to allocate before triggering a collection.
extern size_t Threshold;
// List of gray objects.
extern DObject *Gray;
// List of every object.
extern DObject *Root;
// Current white value for potentially-live objects.
extern uint32_t CurrentWhite;
// Current collector state.
extern EGCState State;
// Position of GC sweep in the list of objects.
extern DObject **SweepPos;
// Size of GC pause.
extern int Pause;
// Size of GC steps.
extern int StepMul;
// Is this the final collection just before exit?
extern bool FinalGC;
// Current white value for known-dead objects.
static inline uint32_t OtherWhite()
{
return CurrentWhite ^ OF_WhiteBits;
}
// Frees all objects, whether they're dead or not.
void FreeAll();
// Does one collection step.
void Step();
// Does a complete collection.
void FullGC();
// Handles the grunt work for a write barrier.
void Barrier(DObject *pointing, DObject *pointed);
// Handles a write barrier.
static inline void WriteBarrier(DObject *pointing, DObject *pointed);
// Handles a write barrier for a pointer that isn't inside an object.
static inline void WriteBarrier(DObject *pointed);
// Handles a read barrier.
template<class T> inline T *ReadBarrier(T *&obj)
{
if (obj == NULL || !(obj->ObjectFlags & OF_EuthanizeMe))
{
return obj;
}
return obj = NULL;
}
// Check if it's time to collect, and do a collection step if it is.
static inline void CheckGC()
{
if (AllocBytes >= Threshold)
Step();
}
// Forces a collection to start now.
static inline void StartCollection()
{
Threshold = AllocBytes;
}
// Marks a white object gray. If the object wants to die, the pointer
// is NULLed instead.
void Mark(DObject **obj);
// Marks an array of objects.
void MarkArray(DObject **objs, size_t count);
// For cleanup
void DelSoftRootHead();
// Soft-roots an object.
void AddSoftRoot(DObject *obj);
// Unroots an object.
void DelSoftRoot(DObject *obj);
template<class T> void Mark(T *&obj)
{
union
{
T *t;
DObject *o;
};
o = obj;
Mark(&o);
obj = t;
}
template<class T> void Mark(TObjPtr<T> &obj);
template<class T> void MarkArray(T **obj, size_t count)
{
MarkArray((DObject **)(obj), count);
}
template<class T> void MarkArray(TArray<T> &arr)
{
MarkArray(&arr[0], arr.Size());
}
}
// A template class to help with handling read barriers. It does not
// handle write barriers, because those can be handled more efficiently
// with knowledge of the object that holds the pointer.
template<class T>
class TObjPtr
{
union
{
T pp;
DObject *o;
};
public:
TObjPtr() throw()
{
}
TObjPtr(T q) throw()
: pp(q)
{
}
TObjPtr(const TObjPtr<T> &q) throw()
: pp(q.pp)
{
}
T operator=(T q) throw()
{
return pp = q;
// The caller must now perform a write barrier.
}
operator T() throw()
{
return GC::ReadBarrier(pp);
}
T &operator*()
{
T q = GC::ReadBarrier(pp);
assert(q != NULL);
return *q;
}
T *operator&() throw()
{
// Does not perform a read barrier. The only real use for this is with
// the DECLARE_POINTER macro, where a read barrier would be a very bad
// thing.
return &pp;
}
T operator->() throw()
{
return GC::ReadBarrier(pp);
}
bool operator!=(T u) throw()
{
return GC::ReadBarrier(o) != u;
}
bool operator==(T u) throw()
{
return GC::ReadBarrier(o) == u;
}
template<class U> friend inline void GC::Mark(TObjPtr<U> &obj);
template<class U> friend FSerializer &Serialize(FSerializer &arc, const char *key, TObjPtr<U> &value, TObjPtr<U> *);
friend class DObject;
};
// Use barrier_cast instead of static_cast when you need to cast
// the contents of a TObjPtr to a related type.
template<class T,class U> inline T barrier_cast(TObjPtr<U> &o)
{
return static_cast<T>(static_cast<U>(o));
}
template<class T> inline void GC::Mark(TObjPtr<T> &obj)
{
GC::Mark(&obj.o);
}
#include "dobjgc.h"
class DObject
{

235
src/dobjgc.h Normal file
View file

@ -0,0 +1,235 @@
#pragma once
#include <stdint.h>
class DObject;
class FSerializer;
enum EObjectFlags
{
// GC flags
OF_White0 = 1 << 0, // Object is white (type 0)
OF_White1 = 1 << 1, // Object is white (type 1)
OF_Black = 1 << 2, // Object is black
OF_Fixed = 1 << 3, // Object is fixed (should not be collected)
OF_Rooted = 1 << 4, // Object is soft-rooted
OF_EuthanizeMe = 1 << 5, // Object wants to die
OF_Cleanup = 1 << 6, // Object is now being deleted by the collector
OF_YesReallyDelete = 1 << 7, // Object is being deleted outside the collector, and this is okay, so don't print a warning
OF_WhiteBits = OF_White0 | OF_White1,
OF_MarkBits = OF_WhiteBits | OF_Black,
// Other flags
OF_JustSpawned = 1 << 8, // Thinker was spawned this tic
OF_SerialSuccess = 1 << 9, // For debugging Serialize() calls
OF_Sentinel = 1 << 10, // Object is serving as the sentinel in a ring list
OF_Transient = 1 << 11, // Object should not be archived (references to it will be nulled on disk)
OF_Spawned = 1 << 12, // Thinker was spawned at all (some thinkers get deleted before spawning)
OF_Released = 1 << 13, // Object was released from the GC system and should not be processed by GC function
OF_Abstract = 1 << 14, // Marks a class that cannot be created with new() function at all
OF_UI = 1 << 15, // Marks a class that defaults to VARF_UI for it's fields/methods
OF_Play = 1 << 16, // Marks a class that defaults to VARF_Play for it's fields/methods
};
template<class T> class TObjPtr;
namespace GC
{
enum EGCState
{
GCS_Pause,
GCS_Propagate,
GCS_Sweep,
GCS_Finalize
};
// Number of bytes currently allocated through M_Malloc/M_Realloc.
extern size_t AllocBytes;
// Amount of memory to allocate before triggering a collection.
extern size_t Threshold;
// List of gray objects.
extern DObject *Gray;
// List of every object.
extern DObject *Root;
// Current white value for potentially-live objects.
extern uint32_t CurrentWhite;
// Current collector state.
extern EGCState State;
// Position of GC sweep in the list of objects.
extern DObject **SweepPos;
// Size of GC pause.
extern int Pause;
// Size of GC steps.
extern int StepMul;
// Is this the final collection just before exit?
extern bool FinalGC;
// Current white value for known-dead objects.
static inline uint32_t OtherWhite()
{
return CurrentWhite ^ OF_WhiteBits;
}
// Frees all objects, whether they're dead or not.
void FreeAll();
// Does one collection step.
void Step();
// Does a complete collection.
void FullGC();
// Handles the grunt work for a write barrier.
void Barrier(DObject *pointing, DObject *pointed);
// Handles a write barrier.
static inline void WriteBarrier(DObject *pointing, DObject *pointed);
// Handles a write barrier for a pointer that isn't inside an object.
static inline void WriteBarrier(DObject *pointed);
// Handles a read barrier.
template<class T> inline T *ReadBarrier(T *&obj)
{
if (obj == NULL || !(obj->ObjectFlags & OF_EuthanizeMe))
{
return obj;
}
return obj = NULL;
}
// Check if it's time to collect, and do a collection step if it is.
static inline void CheckGC()
{
if (AllocBytes >= Threshold)
Step();
}
// Forces a collection to start now.
static inline void StartCollection()
{
Threshold = AllocBytes;
}
// Marks a white object gray. If the object wants to die, the pointer
// is NULLed instead.
void Mark(DObject **obj);
// Marks an array of objects.
void MarkArray(DObject **objs, size_t count);
// For cleanup
void DelSoftRootHead();
// Soft-roots an object.
void AddSoftRoot(DObject *obj);
// Unroots an object.
void DelSoftRoot(DObject *obj);
template<class T> void Mark(T *&obj)
{
union
{
T *t;
DObject *o;
};
o = obj;
Mark(&o);
obj = t;
}
template<class T> void Mark(TObjPtr<T> &obj);
template<class T> void MarkArray(T **obj, size_t count)
{
MarkArray((DObject **)(obj), count);
}
template<class T> void MarkArray(TArray<T> &arr)
{
MarkArray(&arr[0], arr.Size());
}
}
// A template class to help with handling read barriers. It does not
// handle write barriers, because those can be handled more efficiently
// with knowledge of the object that holds the pointer.
template<class T>
class TObjPtr
{
union
{
T pp;
DObject *o;
};
public:
TObjPtr() throw()
{
}
TObjPtr(T q) throw()
: pp(q)
{
}
TObjPtr(const TObjPtr<T> &q) throw()
: pp(q.pp)
{
}
T operator=(T q) throw()
{
return pp = q;
// The caller must now perform a write barrier.
}
operator T() throw()
{
return GC::ReadBarrier(pp);
}
T &operator*()
{
T q = GC::ReadBarrier(pp);
assert(q != NULL);
return *q;
}
T *operator&() throw()
{
// Does not perform a read barrier. The only real use for this is with
// the DECLARE_POINTER macro, where a read barrier would be a very bad
// thing.
return &pp;
}
T operator->() throw()
{
return GC::ReadBarrier(pp);
}
bool operator!=(T u) throw()
{
return GC::ReadBarrier(o) != u;
}
bool operator==(T u) throw()
{
return GC::ReadBarrier(o) == u;
}
template<class U> friend inline void GC::Mark(TObjPtr<U> &obj);
template<class U> friend FSerializer &Serialize(FSerializer &arc, const char *key, TObjPtr<U> &value, TObjPtr<U> *);
friend class DObject;
};
// Use barrier_cast instead of static_cast when you need to cast
// the contents of a TObjPtr to a related type.
template<class T,class U> inline T barrier_cast(TObjPtr<U> &o)
{
return static_cast<T>(static_cast<U>(o));
}
template<class T> inline void GC::Mark(TObjPtr<T> &obj)
{
GC::Mark(&obj.o);
}

View file

@ -9,7 +9,16 @@
class player_t;
class FConfigFile;
struct visstyle_t;
// This encapsulates the fields of vissprite_t that can be altered by AlterWeaponSprite
struct visstyle_t
{
bool Invert;
float Alpha;
ERenderStyle RenderStyle;
};
/************************************************************************/
/* Class definitions */

View file

@ -2,6 +2,7 @@
#include "g_level.h"
#include "r_defs.h"
#include "portal.h"
struct FLevelLocals
{
@ -136,3 +137,56 @@ inline int sector_t::GetOppositePortalGroup(int plane)
{
return level.sectorPortals[Portals[plane]].mDestination->PortalGroup;
}
inline bool sector_t::PortalBlocksView(int plane)
{
if (GetPortalType(plane) != PORTS_LINKEDPORTAL) return false;
return !!(planes[plane].Flags & (PLANEF_NORENDER | PLANEF_DISABLED | PLANEF_OBSTRUCTED));
}
inline bool sector_t::PortalBlocksSight(int plane)
{
return PLANEF_LINKED != (planes[plane].Flags & (PLANEF_NORENDER | PLANEF_NOPASS | PLANEF_DISABLED | PLANEF_OBSTRUCTED | PLANEF_LINKED));
}
inline bool sector_t::PortalBlocksMovement(int plane)
{
return PLANEF_LINKED != (planes[plane].Flags & (PLANEF_NOPASS | PLANEF_DISABLED | PLANEF_OBSTRUCTED | PLANEF_LINKED));
}
inline bool sector_t::PortalBlocksSound(int plane)
{
return PLANEF_LINKED != (planes[plane].Flags & (PLANEF_BLOCKSOUND | PLANEF_DISABLED | PLANEF_OBSTRUCTED | PLANEF_LINKED));
}
inline bool sector_t::PortalIsLinked(int plane)
{
return (GetPortalType(plane) == PORTS_LINKEDPORTAL);
}
inline FLinePortal *line_t::getPortal() const
{
return portalindex >= linePortals.Size() ? (FLinePortal*)NULL : &linePortals[portalindex];
}
// returns true if the portal is crossable by actors
inline bool line_t::isLinePortal() const
{
return portalindex >= linePortals.Size() ? false : !!(linePortals[portalindex].mFlags & PORTF_PASSABLE);
}
// returns true if the portal needs to be handled by the renderer
inline bool line_t::isVisualPortal() const
{
return portalindex >= linePortals.Size() ? false : !!(linePortals[portalindex].mFlags & PORTF_VISIBLE);
}
inline line_t *line_t::getPortalDestination() const
{
return portalindex >= linePortals.Size() ? (line_t*)NULL : linePortals[portalindex].mDestination;
}
inline int line_t::getPortalAlignment() const
{
return portalindex >= linePortals.Size() ? 0 : linePortals[portalindex].mAlign;
}

View file

@ -38,6 +38,7 @@
#include "dobject.h"
#include "v_collection.h"
#include "v_text.h"
#include "r_data/renderstyle.h"
class player_t;
struct FRemapTable;

View file

@ -31,6 +31,7 @@ struct vertex_t;
struct secplane_t;
struct subsector_t;
struct sector_t;
class FMaterial;
enum
{

View file

@ -72,6 +72,7 @@
#include "doomstat.h"
#include "serializer.h"
#include "g_levellocals.h"
#include "actorinlines.h"
#include "gl/renderer/gl_renderer.h"

View file

@ -26,6 +26,7 @@
#include "c_cvars.h"
#include "gl/utility/gl_geometric.h"
#include "gl/utility/gl_cycler.h"
#include "actor.h"
EXTERN_CVAR(Bool, gl_lights)

View file

@ -33,6 +33,7 @@
#include "p_effect.h"
#include "po_man.h"
#include "doomdata.h"
#include "g_levellocals.h"
#include "gl/renderer/gl_renderer.h"
#include "gl/data/gl_data.h"

View file

@ -36,6 +36,7 @@
#include "portal.h"
#include "templates.h"
#include "g_levellocals.h"
#include "actorinlines.h"
#include "gl/system/gl_interface.h"
#include "gl/system/gl_cvars.h"

View file

@ -25,6 +25,8 @@
#include "p_lnspec.h"
#include "a_sharedglobal.h"
#include "g_levellocals.h"
#include "actor.h"
#include "actorinlines.h"
#include "gl/gl_functions.h"
#include "gl/system/gl_interface.h"

View file

@ -42,8 +42,12 @@ static void* PosixGetProcAddress (const GLubyte* name)
#if defined(_WIN32)
#ifdef APIENTRY
#undef APIENTRY
#endif
#include <windows.h>
#ifdef _MSC_VER
// disable inlining here because it creates an incredible amount of bloat in this file.
#pragma inline_depth(0)

View file

@ -7,6 +7,7 @@
#endif
#include "SkylineBinPack.h"
#include "textures.h"
#include <memory>

View file

@ -42,6 +42,7 @@
#include "doomstat.h"
#include "d_main.h"
#include "zstring.h"
#include "textures.h"
#ifndef _WIN32
#define _access(a,b) access(a,b)

View file

@ -2,6 +2,7 @@
#define __GL_TEXTURE_H__
#include "r_defs.h"
#include "textures.h"
class FBrightmapTexture : public FTexture
{

View file

@ -32,6 +32,8 @@
#include <stdlib.h>
#include <time.h>
#include "r_defs.h"
#include "doomtype.h"
#include "version.h"
@ -41,6 +43,7 @@
#include <unistd.h>
#endif
#include <ctype.h>
#include "doomdef.h"
@ -57,7 +60,6 @@
#include "i_system.h"
#include "i_video.h"
#include "v_video.h"
#include "r_defs.h"
#include "hu_stuff.h"

View file

@ -58,6 +58,7 @@ struct secplane_t;
struct FDynamicColormap;
struct line_t;
struct sector_t;
class AActor;
struct F3DFloor
{

View file

@ -42,6 +42,7 @@
#include "p_maputl.h"
#include "p_spec.h"
#include "g_levellocals.h"
#include "actor.h"
//============================================================================

View file

@ -32,6 +32,7 @@
#include "serializer.h"
#include "p_spec.h"
#include "g_levellocals.h"
#include "textures.h"
//============================================================================
//

View file

@ -53,6 +53,7 @@
#include "math/cmath.h"
#include "g_levellocals.h"
#include "virtual.h"
#include "actorinlines.h"
#include "gi.h"

View file

@ -64,6 +64,7 @@
#include "g_level.h"
#include "r_sky.h"
#include "g_levellocals.h"
#include "actorinlines.h"
CVAR(Bool, cl_bloodsplats, true, CVAR_ARCHIVE)
CVAR(Int, sv_smartaim, 0, CVAR_ARCHIVE | CVAR_SERVERINFO)

View file

@ -39,6 +39,7 @@
#include "p_3dmidtex.h"
#include "p_blockmap.h"
#include "r_utility.h"
#include "actor.h"
// State.
#include "r_state.h"

View file

@ -7,6 +7,7 @@
#include "m_bbox.h"
extern int validcount;
struct FBlockNode;
struct divline_t
{

View file

@ -72,6 +72,7 @@
#include "g_levellocals.h"
#include "a_morph.h"
#include "events.h"
#include "actorinlines.h"
// MACROS ------------------------------------------------------------------

View file

@ -31,6 +31,7 @@
#define WEAPONTOP 32.
#define WEAPON_FUDGE_Y 0.375
class AInventory;
struct FTranslatedLineTarget;
//
// Overlay psprites are scaled shapes

View file

@ -33,6 +33,7 @@
#include "p_local.h"
#include "d_player.h"
#include "g_levellocals.h"
#include "actorinlines.h"
CVAR(Bool, var_pushers, true, CVAR_SERVERINFO);

View file

@ -26,6 +26,7 @@
#include "p_maputl.h"
#include "p_blockmap.h"
#include "memarena.h"
#include "actor.h"
//=============================================================================
// phares 3/21/98

View file

@ -30,6 +30,7 @@
#include "stats.h"
#include "g_levellocals.h"
#include "actorinlines.h"
static FRandom pr_botchecksight ("BotCheckSight");
static FRandom pr_checksight ("CheckSight");

View file

@ -39,6 +39,7 @@
#include "p_maputl.h"
#include "p_spec.h"
#include "g_levellocals.h"
#include "actor.h"
//===========================================================================
//

View file

@ -31,6 +31,7 @@
class FScanner;
struct level_info_t;
struct FDoorAnimation;
struct FThinkerCollection
{

View file

@ -49,6 +49,9 @@
#include "serializer.h"
#include "p_maputl.h"
#include "p_spec.h"
#include "textures.h"
#include "actor.h"
#include "actorinlines.h"
#include "gi.h"

View file

@ -46,6 +46,7 @@
#include "s_sound.h"
#include "p_local.h"
#include "templates.h"
#include "actor.h"
// MACROS ------------------------------------------------------------------

View file

@ -49,6 +49,7 @@
#include "p_tags.h"
#include "p_terrain.h"
#include "g_levellocals.h"
#include "info.h"
//===========================================================================
//

View file

@ -33,6 +33,7 @@
#include "r_utility.h"
#include "p_blockmap.h"
#include "g_levellocals.h"
#include "actorinlines.h"
// MACROS ------------------------------------------------------------------

View file

@ -4,6 +4,7 @@
#include "tarray.h"
#include "r_defs.h"
#include "m_bbox.h"
#include "dthinker.h"
class DPolyAction : public DThinker
{

View file

@ -33,6 +33,7 @@
#include "polyrenderer/poly_renderer.h"
#include "r_sky.h"
#include "swrenderer/scene/r_light.h"
#include "g_levellocals.h"
EXTERN_CVAR(Bool, r_drawmirrors)

View file

@ -35,6 +35,7 @@
#include "templates.h"
#include "renderstyle.h"
#include "c_cvars.h"
#include "serializer.h"
CVAR (Bool, r_drawtrans, true, 0)
CVAR (Int, r_drawfuzz, 1, CVAR_ARCHIVE)
@ -191,3 +192,8 @@ void FRenderStyle::CheckFuzz()
BlendOp = STYLEOP_Fuzz;
}
}
FSerializer &Serialize(FSerializer &arc, const char *key, FRenderStyle &style, FRenderStyle *def)
{
return arc.Array(key, &style.BlendOp, def ? &def->BlendOp : nullptr, 4);
}

View file

@ -62,6 +62,7 @@
#include "r_data/colormaps.h"
#include "r_data/sprites.h"
#include "voxels.h"
#include "info.h"
void VOX_AddVoxel(int sprnum, int frame, FVoxelDef *def);

View file

@ -25,8 +25,8 @@
#include "doomdef.h"
#include "templates.h"
#include "memarena.h"
#include "m_bbox.h"
#include "dobjgc.h"
// Some more or less basic data types
// we depend on.
@ -35,13 +35,15 @@
// We rely on the thinker data struct
// to handle sound origins in sectors.
// SECTORS do store MObjs anyway.
#include "actor.h"
struct FLightNode;
struct FGLSection;
class FSerializer;
struct FPortal;
struct FSectorPortal;
struct FLinePortal;
struct seg_t;
#include "dthinker.h"
struct sector_t;
class AActor;
#define MAXWIDTH 5760
#define MAXHEIGHT 3600
@ -351,11 +353,6 @@ public:
return (D + normal.X*v->fX() + normal.Y*v->fY()) * negiC;
}
double ZatPoint(const AActor *ac) const
{
return (D + normal.X*ac->X() + normal.Y*ac->Y()) * negiC;
}
// Returns the value of z at vertex v if d is equal to dist
double ZatPointDist(const vertex_t *v, double dist)
{
@ -434,6 +431,7 @@ public:
}
bool CopyPlaneIfValid (secplane_t *dest, const secplane_t *opp) const;
inline double secplane_t::ZatPoint(const AActor *ac) const;
};
@ -875,31 +873,11 @@ public:
Flags &= ~SECF_SPECIALFLAGS;
}
bool PortalBlocksView(int plane)
{
if (GetPortalType(plane) != PORTS_LINKEDPORTAL) return false;
return !!(planes[plane].Flags & (PLANEF_NORENDER | PLANEF_DISABLED | PLANEF_OBSTRUCTED));
}
bool PortalBlocksSight(int plane)
{
return PLANEF_LINKED != (planes[plane].Flags & (PLANEF_NORENDER | PLANEF_NOPASS | PLANEF_DISABLED | PLANEF_OBSTRUCTED | PLANEF_LINKED));
}
bool PortalBlocksMovement(int plane)
{
return PLANEF_LINKED != (planes[plane].Flags & (PLANEF_NOPASS | PLANEF_DISABLED | PLANEF_OBSTRUCTED | PLANEF_LINKED));
}
bool PortalBlocksSound(int plane)
{
return PLANEF_LINKED != (planes[plane].Flags & (PLANEF_BLOCKSOUND | PLANEF_DISABLED | PLANEF_OBSTRUCTED | PLANEF_LINKED));
}
bool PortalIsLinked(int plane)
{
return (GetPortalType(plane) == PORTS_LINKEDPORTAL);
}
inline bool PortalBlocksView(int plane);
inline bool PortalBlocksSight(int plane);
inline bool PortalBlocksMovement(int plane);
inline bool PortalBlocksSound(int plane);
inline bool PortalIsLinked(int plane);
void ClearPortal(int plane)
{
@ -936,16 +914,8 @@ public:
double HighestCeilingAt(const DVector2 &a, sector_t **resultsec = NULL);
double LowestFloorAt(const DVector2 &a, sector_t **resultsec = NULL);
double HighestCeilingAt(AActor *a, sector_t **resultsec = NULL)
{
return HighestCeilingAt(a->Pos(), resultsec);
}
double LowestFloorAt(AActor *a, sector_t **resultsec = NULL)
{
return LowestFloorAt(a->Pos(), resultsec);
}
inline double HighestCeilingAt(AActor *a, sector_t **resultsec = NULL);
inline double LowestFloorAt(AActor *a, sector_t **resultsec = NULL);
bool isClosed() const
{
@ -1283,32 +1253,11 @@ struct line_t
FSectorPortal *GetTransferredPortal();
FLinePortal *getPortal() const
{
return portalindex >= linePortals.Size() ? (FLinePortal*)NULL : &linePortals[portalindex];
}
// returns true if the portal is crossable by actors
bool isLinePortal() const
{
return portalindex >= linePortals.Size() ? false : !!(linePortals[portalindex].mFlags & PORTF_PASSABLE);
}
// returns true if the portal needs to be handled by the renderer
bool isVisualPortal() const
{
return portalindex >= linePortals.Size() ? false : !!(linePortals[portalindex].mFlags & PORTF_VISIBLE);
}
line_t *getPortalDestination() const
{
return portalindex >= linePortals.Size() ? (line_t*)NULL : linePortals[portalindex].mDestination;
}
int getPortalAlignment() const
{
return portalindex >= linePortals.Size() ? 0 : linePortals[portalindex].mAlign;
}
inline FLinePortal *getPortal() const;
inline bool isLinePortal() const;
inline bool isVisualPortal() const;
inline line_t *getPortalDestination() const;
inline int getPortalAlignment() const;
int Index() const;
};
@ -1476,15 +1425,6 @@ struct FMiniBSP
typedef uint8_t lighttable_t; // This could be wider for >8 bit display.
// This encapsulates the fields of vissprite_t that can be altered by AlterWeaponSprite
struct visstyle_t
{
bool Invert;
float Alpha;
ERenderStyle RenderStyle;
};
//----------------------------------------------------------------------------------
//
// The playsim can use different nodes than the renderer so this is
@ -1503,40 +1443,6 @@ inline sector_t *P_PointInSector(double X, double Y)
return P_PointInSubsector(X, Y)->sector;
}
inline DVector3 AActor::PosRelative(int portalgroup) const
{
return Pos() + Displacements.getOffset(Sector->PortalGroup, portalgroup);
}
inline DVector3 AActor::PosRelative(const AActor *other) const
{
return Pos() + Displacements.getOffset(Sector->PortalGroup, other->Sector->PortalGroup);
}
inline DVector3 AActor::PosRelative(sector_t *sec) const
{
return Pos() + Displacements.getOffset(Sector->PortalGroup, sec->PortalGroup);
}
inline DVector3 AActor::PosRelative(line_t *line) const
{
return Pos() + Displacements.getOffset(Sector->PortalGroup, line->frontsector->PortalGroup);
}
inline DVector3 PosRelative(const DVector3 &pos, line_t *line, sector_t *refsec = NULL)
{
return pos + Displacements.getOffset(refsec->PortalGroup, line->frontsector->PortalGroup);
}
inline void AActor::ClearInterpolation()
{
Prev = Pos();
PrevAngles = Angles;
if (Sector) PrevPortalGroup = Sector->PortalGroup;
else PrevPortalGroup = 0;
}
inline bool FBoundingBox::inRange(const line_t *ld) const
{
return Left() < ld->bbox[BOXRIGHT] &&

View file

@ -109,6 +109,7 @@ void R_SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight, b
extern void R_FreePastViewers ();
extern void R_ClearPastViewer (AActor *actor);
class FCanvasTexture;
// This list keeps track of the cameras that draw into canvas textures.
struct FCanvasTextureInfo
{

View file

@ -820,7 +820,7 @@ begin:
ThrowAbortException(X_OTHER, "Cannot instantiate abstract class %s", cls->TypeName.GetChars());
}
// Creating actors here must be outright prohibited,
if (cls->IsDescendantOf(RUNTIME_CLASS(AActor)))
if (cls->IsDescendantOf(NAME_Actor))
{
ThrowAbortException(X_OTHER, "Cannot create actors with 'new'");
}

View file

@ -6,6 +6,7 @@
#include "tarray.h"
#include "r_defs.h"
#include "resourcefiles/file_zip.h"
#include "tflags.h"
extern bool save_full;
@ -14,6 +15,15 @@ struct usercmd_t;
struct FWriter;
struct FReader;
class PClass;
class PClassActor;
struct FStrifeDialogueNode;
class FFont;
struct FState;
struct FDoorAnimation;
class FSoundID;
struct FPolyObj;
union FRenderStyle;
inline bool nullcmp(const void *buffer, size_t length)
{
@ -279,10 +289,7 @@ inline FSerializer &Serialize(FSerializer &arc, const char *key, PalEntry &pe, P
return Serialize(arc, key, pe.d, def? &def->d : nullptr);
}
inline FSerializer &Serialize(FSerializer &arc, const char *key, FRenderStyle &style, FRenderStyle *def)
{
return arc.Array(key, &style.BlendOp, def ? &def->BlendOp : nullptr, 4);
}
FSerializer &Serialize(FSerializer &arc, const char *key, FRenderStyle &style, FRenderStyle *def);
template<class T, class TT>
FSerializer &Serialize(FSerializer &arc, const char *key, TFlags<T, TT> &flags, TFlags<T, TT> *def)

View file

@ -2,6 +2,7 @@
#pragma once
#include "r_defs.h"
#include "c_cvars.h"
#include <memory>
struct FSWColormap;

View file

@ -14,6 +14,7 @@
#pragma once
#include <memory>
#include <vector>
namespace swrenderer
{

View file

@ -37,6 +37,7 @@
#include "v_video.h"
#include "m_swap.h"
#include "w_wad.h"
#include "textures.h"
FImageCollection::FImageCollection ()
{

View file

@ -37,6 +37,8 @@
#include "doomtype.h"
#include "r_defs.h"
class FTexture;
class FImageCollection
{
public:

View file

@ -61,6 +61,7 @@
#include "colormatcher.h"
#include "r_data/colormaps.h"
#include "g_levellocals.h"
#include "textures.h"
CUSTOM_CVAR(Int, uiscale, 2, CVAR_ARCHIVE | CVAR_NOINITCALL)
{

View file

@ -71,6 +71,7 @@
#include "doomstat.h"
#include "v_palette.h"
#include "w_wad.h"
#include "textures.h"
#include "r_data/colormaps.h"
#include "SkylineBinPack.h"
#include "swrenderer/scene/r_light.h"