Initial gamelib integration AAS2 with some animation and physics and another integration pass on idLib.

This commit is contained in:
Justin Marshall
2026-08-09 03:52:45 -07:00
parent cdf7d52214
commit 6d92a71d19
111 changed files with 15204 additions and 2275 deletions
+307 -130
View File
@@ -1,137 +1,314 @@
#pragma once
// Reconstructed C++ declarations from IDA Local Types and PDB/DIA metadata.
// Original PDB header: w:\tech5\engine\gamelib\aas2\aas2_local.h
// Recovered logical types: 3
// Signatures retain Xbox 360 ABI evidence and may still require manual review.
#include "gamelib/aas2/aas2.h"
#include "gamelib/aas2/obstacleavoidance.h"
#include "idlib/blockalloc_base.h"
#include "idlib/text/str.h"
class idRenderWorld;
struct idObstacleBuffers;
// IDA Local Type ordinal 3176; PDB kind: unknown.
enum idAAS2Local::NearestPointReachable::__l2::<unnamed_tag> : __int32
{
MaxAreas = 0x20,
};
// IDA Local Type ordinal 14089; PDB kind: struct.
struct idAAS2Goal
{
int areaNum;
idVec3 origin;
};
// IDA Local Type ordinal 23504; PDB kind: class.
class idAAS2Local : public idAAS2
{
class idAASRoutingCache {
public:
// Recovered virtual interface; IDA vtable ordinal 23510.
virtual ~idAAS2Local();
virtual bool IsDefault();
virtual bool Init(const char *, unsigned int);
virtual void Stats();
virtual void Test(const idVec3 *, const idVec3 *, const idMat3 *, int, int, int, int, const int, idClip *, usercmd_t *, idAngles *);
virtual const idAAS2Settings *GetSettings();
virtual idBounds *DefaultSearchBounds(idBounds *result);
virtual int PointAreaNum(idIndex<int,enum invalidAASTree_t>, const idVec3 *);
virtual int PointReachableAreaNum(idIndex<int,enum invalidAASTree_t>, const idVec3 *, const idBounds *, const int, const int);
virtual int BoundsReachableAreaNum(idIndex<int,enum invalidAASTree_t>, const idBounds *, const int, const int);
virtual int BoundsReachableAreaNum_2(idIndex<int,enum invalidAASTree_t>, const idVec3 *, const idBounds *, const int, const int);
virtual bool NearestPointReachable(idIndex<int,enum invalidAASTree_t>, const idVec3 *, const int, const idVec3 *, const idBounds *, const int, idAAS2NearestReachable *);
virtual void PushPointIntoAreaNum(int, idVec3 *);
virtual idVec3 *AreaCenter(idVec3 *result, int);
virtual bool Trace(idIndex<int,enum invalidAASTree_t>, aas2Trace_t *, const idVec3 *, const idVec3 *);
virtual bool TraceHeight(idIndex<int,enum invalidAASTree_t>, aas2TraceHeight_t *, const idVec3 *, const idVec3 *);
virtual bool TraceFloor(aas2TraceFloor_t *, const idVec3 *, int, const idVec3 *, int, bool, bool, bool);
virtual void GetEdgeVertexNumbers(int, int *);
virtual void GetEdge(int, idVec3 *, idVec3 *);
virtual int GetEdgeFlags(int);
virtual int GetAreaFlags(int);
virtual bool ChangeAreaTravelFlags(const idBounds *, const int, int, bool);
virtual bool ChangeReachabilityTravelFlags(const char *, int, bool);
virtual bool ChangeReachabilityTravelFlags_2(idIndex<short,enum invalidReachability_t>, int, bool);
virtual int TravelTimeToGoalArea(int, const idVec3 *, int, const idVec3 *, int, const idAAS2TravelSpeeds *);
virtual bool RouteToGoalArea(int, const idVec3 *, int, const idVec3 *, int, int *, idIndex<short,enum invalidReachability_t> *);
virtual bool FindNearestGoal(idAAS2Goal *, int, const idVec3 *, int, idAAS2Callback *);
virtual bool WalkPathToGoal(idAAS2Path *, int, const idVec3 *, int, const idVec3 *, const int, const int);
virtual bool ExtendHopPathToGoal(idAAS2Path *, int, const idVec3 *, int, const idVec3 *, int, int, const idAAS2HopPathParms *);
virtual void ShowWalkPath(const int, const idVec3 *, const int, const idVec3 *, const int, const int, const int, const int, const int);
virtual void ShowHopPath(int, const idVec3 *, int, const idVec3 *, int, int, const idAAS2HopPathParms *);
virtual void DrawEdge(const int, const bool, const bool, const bool);
virtual void DrawReachability(const idIndex<short,enum invalidReachability_t>, const aas2Reachability_t *, const char *);
virtual void DrawArea(const int, const bool, const bool, const bool, const bool, const bool, const bool);
virtual float GetGroundSpeedMultiplier();
virtual bool GetOptimizedWalkPath(int, const idVec3 *, int, const idVec3 *, int, int, idList<idVec3,5> *);
virtual int GetNumAreas();
virtual const idPlane *GetPlane(const int);
virtual const aas2Area_t *GetArea(const int);
virtual const aas2Reachability_t *GetReachability(const idIndex<short,enum invalidReachability_t>);
virtual bool GetPath(const idVec3 *, const idVec3 *, const int, const int, const int, idAAS2PathPoint *, const int, int *);
virtual void ClipGridToAreas(const idVec3 *, int, int, int, int, unsigned __int8 *);
virtual int GetInvalidTravelFlags();
virtual int GetTraversalsForReachability(const idIndex<short,enum invalidReachability_t>, idList<int,5> *);
virtual int GetTraversalsForInteractableEntity(const idIndex<short,enum invalidAASInteractionEntIndex_t>, idList<int,5> *);
virtual int FindBestTraversalForReachability(const idIndex<short,enum invalidReachability_t>, const idVec3 *, const idVec3 *, idVec3 *, idVec3 *, idIndex<short,enum invalidAASDependencyIndex_t> *, const int, bool);
virtual const aas2Traversal_t *GetTraversal(const int);
virtual bool GetAASAnim(const idIndex<short,enum invalidAASAnimIndex_t>, const aas2AnimName_t **);
virtual idIndex<short,enum invalidAASAnimIndex_t> *GetAASAnimIndexByName(idIndex<short,enum invalidAASAnimIndex_t> *result, const char *);
virtual bool GetAASDependency(const idIndex<short,enum invalidAASDependencyIndex_t>, const aas2DependencyName_t **);
virtual idIndex<short,enum invalidAASDependencyIndex_t> *GetAASDependencyIndexByName(idIndex<short,enum invalidAASDependencyIndex_t> *result, const char *);
virtual bool GetAASInteractionEntity(const idIndex<short,enum invalidAASInteractionEntIndex_t>, const aas2InteractionEntityName_t **);
virtual idIndex<short,enum invalidAASInteractionEntIndex_t> *GetAASInteractionEntityIndexByName(idIndex<short,enum invalidAASInteractionEntIndex_t> *result, const char *);
virtual bool GetAASTraversalNameIndex(const idIndex<short,enum invalidAASTraversalNameIndex_t>, const aas2TraversalEntityName_t **);
virtual idIndex<short,enum invalidAASTraversalNameIndex_t> *GetAASTraversalNameIndexByName(idIndex<short,enum invalidAASTraversalNameIndex_t> *result, const char *);
virtual int GetAASTraversalIndexByNameIndex(const idIndex<short,enum invalidAASTraversalNameIndex_t>);
virtual bool SetTraversalFlag(int, int);
virtual bool ClearTraversalFlag(int, int);
virtual const unsigned __int8 *GetObstaclePVS(int);
virtual int GetObstaclePVSWallEdges(int, int, int *, int);
virtual int GetObstaclePVSClipModels(int, idClipModel **, int);
virtual void GetObstaclePVSObstacles(const int, const int, obstacleVertex_t *, int *, obstacleEdge_t *, int *, idClipModel **, int *, obstacleRoute_t *);
virtual void FreeClipLinks();
virtual idAASClipLink *LinkClipModel(idClipModel *);
virtual idAASClipLink *UnLinkClipModel(idAASClipLink *);
virtual int GetNumCoverPoints();
virtual const aas2Cover_t *GetCoverPoint(const int);
virtual int GetNumAreaCoverPoints(const int);
virtual int GetAreaCoverPoints(const int, int *, const int, int *);
virtual int FindCoverPoints(const int, const idVec3 *, const float, const int, const int, const int, int *, const int, int *);
virtual int GetNumChokePoints();
virtual const aas2ChokePoint_t *GetChokePoint(const int);
virtual int GetNumHintNodes();
virtual const aas2HintNode_t *GetHintNode(const int);
virtual bool GetAreaCells(const int, const int, int *, int *);
virtual bool WorldPosToCellPos(const int, const int, const idVec3 *, int *, int *);
virtual bool CellPosToWorldPos(const int, const int, const int, const int, idVec3 *, const bool);
virtual void DrawCoverPoint(const aas2Cover_t *, const int);
virtual int GetNumTrees();
virtual idIndex<int,enum invalidAASTree_t> *GetTree(idIndex<int,enum invalidAASTree_t> *result, int);
virtual idIndex<int,enum invalidAASTree_t> *GetTreeForFloorNormal(idIndex<int,enum invalidAASTree_t> *result, const idVec3 *);
virtual const idVec3 *GetFloorNormalForArea(int);
virtual const idVec3 *GetFloorNormalForTree(idIndex<int,enum invalidAASTree_t>);
virtual int GetNumAreasInTree(idIndex<int,enum invalidAASTree_t>);
virtual void Shutdown();
virtual void ShowOptimizedWalkPath(int, const idVec3 *, int, const idVec3 *, int, int);
explicit idAASRoutingCache(int cacheSize);
~idAASRoutingCache();
idAAS2File *file;
idStr name;
bool defaulted;
idAASRoutingCache ***areaCacheIndex;
int areaCacheIndexSize;
idAASRoutingCache **portalCacheIndex;
int portalCacheIndexSize;
idRoutingUpdate *areaUpdate;
idRoutingUpdate *portalUpdate;
unsigned __int16 *goalAreaTravelTimes;
unsigned __int16 *areaTravelTimes;
int numAreaTravelTimes;
idAASRoutingCache *cacheListStart;
idAASRoutingCache *cacheListEnd;
int totalCacheMemory;
float groundSpeedMultiplier;
float waterSpeedMultiplier;
int numObstaclePVSBytes;
unsigned __int8 *obstaclePVS;
int obstaclePVSAreaNum;
idAASClipLink **areaClipModels;
idBlockAlloc<idAASClipLink,128,37> clipModelLinkAllocator;
idObstacleAvoidance obstacleAvoidance;
int type;
int size;
int cluster;
int areaNum;
int travelFlags;
idAASRoutingCache* next;
idAASRoutingCache* prev;
idAASRoutingCache* time_next;
idAASRoutingCache* time_prev;
std::uint16_t startTravelTime;
std::uint8_t* reachabilities;
std::uint16_t* travelTimes;
};
struct idRoutingUpdate {
int cluster;
int areaNum;
std::uint16_t tmpTravelTime;
std::uint16_t* areaTravelTimes;
idVec3 start;
idRoutingUpdate* next;
idRoutingUpdate* prev;
bool isInList;
};
class idAASClipLink {
public:
idAASClipLink* prevArea;
idAASClipLink* nextArea;
idAASClipLink* prevClip;
idAASClipLink* nextClip;
idClipModel* clipModel;
int areaNum;
};
class idAAS2Local final : public idAAS2 {
public:
idAAS2Local();
~idAAS2Local() override;
bool IsDefault() const override { return defaulted; }
bool Init(const char* mapName, unsigned int mapFileCRC) override;
void Shutdown();
void Stats() const override;
void Test(const idVec3& origin, const idVec3& destination,
const idMat3& axis, int areaNum, int travelFlags, int contentMask,
int debugMode, int treeNum, idClip* clip, usercmd_t* command,
idAngles& viewAngles) override;
const idAAS2Settings* GetSettings() const override;
idBounds DefaultSearchBounds() const override;
int PointAreaNum(idIndex<int, invalidAASTree_t> tree,
const idVec3& origin) const override;
int PointReachableAreaNum(idIndex<int, invalidAASTree_t> tree,
const idVec3& origin, const idBounds& searchBounds, int areaFlags,
int excludeTravelFlags) const override;
int BoundsReachableAreaNum(idIndex<int, invalidAASTree_t> tree,
const idBounds& bounds, int areaFlags,
int excludeTravelFlags) const override;
int BoundsReachableAreaNum(idIndex<int, invalidAASTree_t> tree,
const idVec3& origin, const idBounds& bounds, int areaFlags,
int excludeTravelFlags) const override;
bool NearestPointReachable(idIndex<int, invalidAASTree_t> tree,
const idVec3& origin, int areaNum, const idVec3& destination,
const idBounds& searchBounds, int travelFlags,
idAAS2NearestReachable& nearest) const override;
void PushPointIntoAreaNum(int areaNum, idVec3& origin) const override;
idVec3 AreaCenter(int areaNum) const override;
bool Trace(idIndex<int, invalidAASTree_t> tree, aas2Trace_t& trace,
const idVec3& start, const idVec3& end) const override;
bool TraceHeight(idIndex<int, invalidAASTree_t> tree,
aas2TraceHeight_t& trace, const idVec3& start,
const idVec3& end) const override;
bool TraceFloor(aas2TraceFloor_t& trace, const idVec3& start,
int startAreaNum, const idVec3& end, int travelFlags,
bool allowFloorNormalChange, bool ignoreGravityDirectionDistance,
bool ignoreSameArea) const override;
void GetEdgeVertexNumbers(int edgeNum, int verts[2]) const override;
void GetEdge(int edgeNum, idVec3& start, idVec3& end) const override;
int GetEdgeFlags(int edgeNum) const override;
int GetAreaFlags(int areaNum) const override;
bool ChangeAreaTravelFlags(const idBounds& bounds, int treeNum,
int travelFlags, bool set) override;
bool ChangeReachabilityTravelFlags(const char* name,
int travelFlags, bool set) override;
bool ChangeReachabilityTravelFlags(
idIndex<short, invalidReachability_t> reachability,
int travelFlags, bool set) override;
int TravelTimeToGoalArea(int areaNum, const idVec3& origin,
int goalAreaNum, const idVec3& goalOrigin, int travelFlags,
const idAAS2TravelSpeeds* speeds) override;
bool RouteToGoalArea(int areaNum, const idVec3& origin,
int goalAreaNum, const idVec3& goalOrigin, int travelFlags,
int& travelTime,
idIndex<short, invalidReachability_t>& reachability) override;
bool FindNearestGoal(idAAS2Goal& goal, int areaNum,
const idVec3& origin, int travelFlags,
idAAS2Callback& callback) override;
bool WalkPathToGoal(idAAS2Path& path, int areaNum,
const idVec3& origin, int goalAreaNum, const idVec3& goalOrigin,
int travelFlags, int obstacleFlags) override;
bool ExtendHopPathToGoal(idAAS2Path& path, int areaNum,
const idVec3& origin, int goalAreaNum, const idVec3& goalOrigin,
int travelFlags, int obstacleFlags,
const idAAS2HopPathParms& parms) override;
void ShowWalkPath(int areaNum, const idVec3& origin, int goalAreaNum,
const idVec3& goalOrigin, int travelFlags, int obstacleFlags,
int contentMask, int debugFlags, int treeNum) const override;
void ShowHopPath(int areaNum, const idVec3& origin, int goalAreaNum,
const idVec3& goalOrigin, int travelFlags, int obstacleFlags,
const idAAS2HopPathParms& parms) const override;
void ShowOptimizedWalkPath(int areaNum, const idVec3& origin,
int goalAreaNum, const idVec3& goalOrigin, int travelFlags,
int obstacleFlags) const;
void DrawEdge(int edgeNum, bool arrow, bool text,
bool highlight) const override;
void DrawReachability(idIndex<short, invalidReachability_t> reachability,
const aas2Reachability_t& reach, const char* label) const override;
void DrawArea(int areaNum, bool showNumbers, bool showEdges,
bool showReachabilities, bool showFloor, bool showBounds,
bool highlight) const override;
float GetGroundSpeedMultiplier() const override {
return groundSpeedMultiplier;
}
bool GetOptimizedWalkPath(int areaNum, const idVec3& origin,
int goalAreaNum, const idVec3& goalOrigin, int travelFlags,
int obstacleFlags, idList<idVec3, 5>& points) override;
int GetNumAreas() const override;
const idPlane* GetPlane(int index) const override;
const aas2Area_t* GetArea(int areaNum) const override;
const aas2Reachability_t* GetReachability(
idIndex<short, invalidReachability_t> reachability) const override;
bool GetPath(const idVec3& origin, const idVec3& goalOrigin,
int areaNum, int goalAreaNum, int travelFlags,
idAAS2PathPoint* points, int maxPoints, int& numPoints) override;
void ClipGridToAreas(const idVec3& startOrigin, int startAreaNum,
int travelFlags, unsigned int cellSize, int dimension,
std::uint8_t* reachable) const override;
int GetInvalidTravelFlags() const override { return AAS_TFL_INVALID; }
int GetTraversalsForReachability(
idIndex<short, invalidReachability_t> reachability,
idList<int, 5>& traversals) const override;
int GetTraversalsForInteractableEntity(
idIndex<short, invalidAASInteractionEntIndex_t> entity,
idList<int, 5>& traversals) const override;
int FindBestTraversalForReachability(
idIndex<short, invalidReachability_t> reachability,
const idVec3& origin, const idVec3& goalOrigin,
idVec3& traversalStart, idVec3& traversalEnd,
idIndex<short, invalidAASDependencyIndex_t>& dependency,
int travelFlags, bool allowDisabled) const override;
const aas2Traversal_t* GetTraversal(int traversalNum) const override;
bool GetAASAnim(idIndex<short, invalidAASAnimIndex_t> index,
const aas2AnimName_t** name) const override;
idIndex<short, invalidAASAnimIndex_t> GetAASAnimIndexByName(
const char* name) const override;
bool GetAASDependency(idIndex<short, invalidAASDependencyIndex_t> index,
const aas2DependencyName_t** name) const override;
idIndex<short, invalidAASDependencyIndex_t>
GetAASDependencyIndexByName(const char* name) const override;
bool GetAASInteractionEntity(
idIndex<short, invalidAASInteractionEntIndex_t> index,
const aas2InteractionEntityName_t** name) const override;
idIndex<short, invalidAASInteractionEntIndex_t>
GetAASInteractionEntityIndexByName(const char* name) const override;
bool GetAASTraversalNameIndex(
idIndex<short, invalidAASTraversalNameIndex_t> index,
const aas2TraversalEntityName_t** name) const override;
idIndex<short, invalidAASTraversalNameIndex_t>
GetAASTraversalNameIndexByName(const char* name) const override;
int GetAASTraversalIndexByNameIndex(
idIndex<short, invalidAASTraversalNameIndex_t> index) const override;
bool SetTraversalFlag(int index, int flags) override;
bool ClearTraversalFlag(int index, int flags) override;
const std::uint8_t* GetObstaclePVS(int areaNum) override;
int GetObstaclePVSWallEdges(int areaNum, int edgeFlags,
int* outputEdges, int maxEdges) const override;
int GetObstaclePVSClipModels(int areaNum, idClipModel** models,
int maxModels) override;
void GetObstaclePVSObstacles(int areaNum, int obstacleFlags,
obstacleVertex_t* vertices, int* numVertices,
obstacleEdge_t* edges, int* numEdges, idClipModel** models,
int* numModels, obstacleRoute_t* route) override;
void FreeClipLinks() override;
idAASClipLink* LinkClipModel(idClipModel* model) override;
idAASClipLink* UnLinkClipModel(idAASClipLink* link) override;
int GetNumCoverPoints() const override;
const aas2Cover_t* GetCoverPoint(int index) const override;
int GetNumAreaCoverPoints(int areaNum) const override;
int GetAreaCoverPoints(int areaNum, int* points, int maxPoints,
int* flags) const override;
int FindCoverPoints(int areaNum, const idVec3& origin, float radius,
int coverFlags, int excludeFlags, int maxPoints, int* points,
int team, int* areaFlags) const override;
int GetNumChokePoints() const override;
const aas2ChokePoint_t* GetChokePoint(int index) const override;
int GetNumHintNodes() const override;
const aas2HintNode_t* GetHintNode(int index) const override;
bool GetAreaCells(int areaNum, int subdivisionSize, int* xCells,
int* yCells) const override;
bool WorldPosToCellPos(int areaNum, int subdivisionSize,
const idVec3& worldPos, int* xCell, int* yCell) const override;
bool CellPosToWorldPos(int areaNum, int subdivisionSize, int xCell,
int yCell, idVec3& worldPos, bool center) const override;
void DrawCoverPoint(const aas2Cover_t& cover, int index) const override;
int GetNumTrees() const override;
idIndex<int, invalidAASTree_t> GetTree(int index) const override;
idIndex<int, invalidAASTree_t> GetTreeForFloorNormal(
const idVec3& floorNormal) const override;
const idVec3* GetFloorNormalForArea(int areaNum) const override;
const idVec3* GetFloorNormalForTree(
idIndex<int, invalidAASTree_t> tree) const override;
int GetNumAreasInTree(
idIndex<int, invalidAASTree_t> tree) const override;
void SetupRouting();
void ShutdownRouting();
void RoutingStats() const;
void RemoveRoutingCacheUsingArea(int areaNum);
void LinkCache(idAASRoutingCache* cache);
void UnlinkCache(idAASRoutingCache* cache);
int CalcTravelTime(const idVec3& start, const idVec3& end,
int travelFlags) const;
int AreaTravelTime(int areaNum, const idVec3& start,
const idVec3& end) const;
void CalculateAreaTravelTimes();
void SetupRoutingCache();
void DeleteClusterCache(int clusterNum);
void DeletePortalCache();
void ShutdownRoutingCache();
bool ChangeAreaTravelFlags_r(int nodeNum, const idBounds& bounds,
int areaFlags, int travelFlags, bool set);
idIndex<short, invalidReachability_t> GetAreaReachability(
int areaNum, int reachabilityNum) const;
int ClusterAreaNum(int clusterNum, int areaNum) const;
void DeleteOldestCache();
void UpdateAreaRoutingCache(idAASRoutingCache* cache);
idAASRoutingCache* GetAreaRoutingCache(int clusterNum, int areaNum,
int travelFlags);
void UpdatePortalRoutingCache(idAASRoutingCache* cache);
idAASRoutingCache* GetPortalRoutingCache(int clusterNum, int areaNum,
int travelFlags);
bool GetClusterRoute(int startAreaNum, const idVec3& startOrigin,
int startClusterNum, int goalAreaNum, int travelFlags,
int& travelTime,
idIndex<short, invalidReachability_t>& bestReachability);
bool HopPathIsValid(int startAreaNum, const idVec3& startOrigin,
int goalAreaNum, const idVec3& goalOrigin,
const idAAS2HopPathParms& parms) const;
bool WalkPathIsValid(int startAreaNum, const idVec3& startOrigin,
int goalAreaNum, const idVec3& goalOrigin, int travelFlags,
int& endAreaNum, aas2EdgeCrossed_t& firstEdge) const;
void SubSampleWalkPath(int startAreaNum, const idVec3& startOrigin,
int pathAreaNum, const idVec3& pathStart, const idVec3& pathEnd,
int travelFlags, idVec3& endPos, int& endAreaNum,
aas2EdgeCrossed_t& firstEdge) const;
void SetupObstaclePVS();
void ShutdownObstaclePVS();
void DecompressObstaclePVS(int areaNum, std::uint8_t* pvs,
int pvsSize) const;
void GetObstaclePVSObstaclesInternal(int areaNum, int edgeFlags,
obstacleVertex_t* vertices, int& numVertices,
obstacleEdge_t* edges, int& numEdges, idClipModel** models,
int& numModels, obstacleRoute_t* route) const;
void FindCoverPoints_Internal(int startAreaNum, const idVec3& origin,
const idBounds& bounds, float maxDistSqr, int requiredFlags,
int excludeFlags, int travelFlags, int* coverPoints, int maxCover,
int& numCover) const;
idAAS2File* file;
idStr name;
bool defaulted;
idAASRoutingCache*** areaCacheIndex;
int areaCacheIndexSize;
idAASRoutingCache** portalCacheIndex;
int portalCacheIndexSize;
idRoutingUpdate* areaUpdate;
idRoutingUpdate* portalUpdate;
std::uint16_t* goalAreaTravelTimes;
std::uint16_t* areaTravelTimes;
int numAreaTravelTimes;
idAASRoutingCache* cacheListStart;
idAASRoutingCache* cacheListEnd;
int totalCacheMemory;
float groundSpeedMultiplier;
float waterSpeedMultiplier;
int numObstaclePVSBytes;
std::uint8_t* obstaclePVS;
int obstaclePVSAreaNum;
idAASClipLink** areaClipModels;
idBlockAlloc<idAASClipLink, 128, 37> clipModelLinkAllocator;
idObstacleAvoidance obstacleAvoidance;
};
#if INTPTR_MAX == INT32_MAX
static_assert(sizeof(idAASClipLink) == 24,
"Recovered idAASClipLink ABI changed");
static_assert(sizeof(idAAS2Local) == 172,
"Recovered idAAS2Local ABI changed");
#endif