doom3-bfg/neo/d3xp/ai/AAS_local.h

193 lines
9.8 KiB
C++

/*
===========================================================================
Doom 3 BFG Edition GPL Source Code
Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.
This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").
Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Doom 3 BFG Edition Source Code. If not, see <http://www.gnu.org/licenses/>.
In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below.
If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
===========================================================================
*/
#ifndef __AAS_LOCAL_H__
#define __AAS_LOCAL_H__
#include "AAS.h"
#include "../Pvs.h"
class idRoutingCache
{
friend class idAASLocal;
public:
idRoutingCache( int size );
~idRoutingCache();
int Size() const;
private:
int type; // portal or area cache
int size; // size of cache
int cluster; // cluster of the cache
int areaNum; // area of the cache
int travelFlags; // combinations of the travel flags
idRoutingCache* next; // next in list
idRoutingCache* prev; // previous in list
idRoutingCache* time_next; // next in time based list
idRoutingCache* time_prev; // previous in time based list
unsigned short startTravelTime; // travel time to start with
unsigned char* reachabilities; // reachabilities used for routing
unsigned short* travelTimes; // travel time for every area
};
class idRoutingUpdate
{
friend class idAASLocal;
private:
int cluster; // cluster number of this update
int areaNum; // area number of this update
unsigned short tmpTravelTime; // temporary travel time
unsigned short* areaTravelTimes; // travel times within the area
idVec3 start; // start point into area
idRoutingUpdate* next; // next in list
idRoutingUpdate* prev; // prev in list
bool isInList; // true if the update is in the list
};
class idRoutingObstacle
{
friend class idAASLocal;
idRoutingObstacle() { }
private:
idBounds bounds; // obstacle bounds
idList<int, TAG_AAS> areas; // areas the bounds are in
};
class idAASLocal : public idAAS
{
public:
idAASLocal();
virtual ~idAASLocal();
virtual bool Init( const idStr& mapName, unsigned int mapFileCRC );
virtual void Shutdown();
virtual void Stats() const;
virtual void Test( const idVec3& origin );
virtual const idAASSettings* GetSettings() const;
virtual int PointAreaNum( const idVec3& origin ) const;
virtual int PointReachableAreaNum( const idVec3& origin, const idBounds& searchBounds, const int areaFlags ) const;
virtual int BoundsReachableAreaNum( const idBounds& bounds, const int areaFlags ) const;
virtual void PushPointIntoAreaNum( int areaNum, idVec3& origin ) const;
virtual idVec3 AreaCenter( int areaNum ) const;
virtual int AreaFlags( int areaNum ) const;
virtual int AreaTravelFlags( int areaNum ) const;
virtual bool Trace( aasTrace_t& trace, const idVec3& start, const idVec3& end ) const;
virtual const idPlane& GetPlane( int planeNum ) const;
virtual int GetWallEdges( int areaNum, const idBounds& bounds, int travelFlags, int* edges, int maxEdges ) const;
virtual void SortWallEdges( int* edges, int numEdges ) const;
virtual void GetEdgeVertexNumbers( int edgeNum, int verts[2] ) const;
virtual void GetEdge( int edgeNum, idVec3& start, idVec3& end ) const;
virtual bool SetAreaState( const idBounds& bounds, const int areaContents, bool disabled );
virtual aasHandle_t AddObstacle( const idBounds& bounds );
virtual void RemoveObstacle( const aasHandle_t handle );
virtual void RemoveAllObstacles();
virtual int TravelTimeToGoalArea( int areaNum, const idVec3& origin, int goalAreaNum, int travelFlags ) const;
virtual bool RouteToGoalArea( int areaNum, const idVec3 origin, int goalAreaNum, int travelFlags, int& travelTime, idReachability** reach ) const;
virtual bool WalkPathToGoal( aasPath_t& path, int areaNum, const idVec3& origin, int goalAreaNum, const idVec3& goalOrigin, int travelFlags ) const;
virtual bool WalkPathValid( int areaNum, const idVec3& origin, int goalAreaNum, const idVec3& goalOrigin, int travelFlags, idVec3& endPos, int& endAreaNum ) const;
virtual bool FlyPathToGoal( aasPath_t& path, int areaNum, const idVec3& origin, int goalAreaNum, const idVec3& goalOrigin, int travelFlags ) const;
virtual bool FlyPathValid( int areaNum, const idVec3& origin, int goalAreaNum, const idVec3& goalOrigin, int travelFlags, idVec3& endPos, int& endAreaNum ) const;
virtual void ShowWalkPath( const idVec3& origin, int goalAreaNum, const idVec3& goalOrigin ) const;
virtual void ShowFlyPath( const idVec3& origin, int goalAreaNum, const idVec3& goalOrigin ) const;
virtual bool FindNearestGoal( aasGoal_t& goal, int areaNum, const idVec3 origin, const idVec3& target, int travelFlags, aasObstacle_t* obstacles, int numObstacles, idAASCallback& callback ) const;
private:
idAASFile* file;
idStr name;
private: // routing data
idRoutingCache*** areaCacheIndex; // for each area in each cluster the travel times to all other areas in the cluster
int areaCacheIndexSize; // number of area cache entries
idRoutingCache** portalCacheIndex; // for each area in the world the travel times from each portal
int portalCacheIndexSize; // number of portal cache entries
idRoutingUpdate* areaUpdate; // memory used to update the area routing cache
idRoutingUpdate* portalUpdate; // memory used to update the portal routing cache
unsigned short* goalAreaTravelTimes; // travel times to goal areas
unsigned short* areaTravelTimes; // travel times through the areas
int numAreaTravelTimes; // number of area travel times
mutable idRoutingCache* cacheListStart; // start of list with cache sorted from oldest to newest
mutable idRoutingCache* cacheListEnd; // end of list with cache sorted from oldest to newest
mutable int totalCacheMemory; // total cache memory used
idList<idRoutingObstacle*, TAG_AAS> obstacleList; // list with obstacles
private: // routing
bool SetupRouting();
void ShutdownRouting();
unsigned short AreaTravelTime( int areaNum, const idVec3& start, const idVec3& end ) const;
void CalculateAreaTravelTimes();
void DeleteAreaTravelTimes();
void SetupRoutingCache();
void DeleteClusterCache( int clusterNum );
void DeletePortalCache();
void ShutdownRoutingCache();
void RoutingStats() const;
void LinkCache( idRoutingCache* cache ) const;
void UnlinkCache( idRoutingCache* cache ) const;
void DeleteOldestCache() const;
idReachability* GetAreaReachability( int areaNum, int reachabilityNum ) const;
int ClusterAreaNum( int clusterNum, int areaNum ) const;
void UpdateAreaRoutingCache( idRoutingCache* areaCache ) const;
idRoutingCache* GetAreaRoutingCache( int clusterNum, int areaNum, int travelFlags ) const;
void UpdatePortalRoutingCache( idRoutingCache* portalCache ) const;
idRoutingCache* GetPortalRoutingCache( int clusterNum, int areaNum, int travelFlags ) const;
void RemoveRoutingCacheUsingArea( int areaNum );
void DisableArea( int areaNum );
void EnableArea( int areaNum );
bool SetAreaState_r( int nodeNum, const idBounds& bounds, const int areaContents, bool disabled );
void GetBoundsAreas_r( int nodeNum, const idBounds& bounds, idList<int>& areas ) const;
void SetObstacleState( const idRoutingObstacle* obstacle, bool enable );
private: // pathing
bool EdgeSplitPoint( idVec3& split, int edgeNum, const idPlane& plane ) const;
bool FloorEdgeSplitPoint( idVec3& split, int areaNum, const idPlane& splitPlane, const idPlane& frontPlane, bool closest ) const;
idVec3 SubSampleWalkPath( int areaNum, const idVec3& origin, const idVec3& start, const idVec3& end, int travelFlags, int& endAreaNum ) const;
idVec3 SubSampleFlyPath( int areaNum, const idVec3& origin, const idVec3& start, const idVec3& end, int travelFlags, int& endAreaNum ) const;
private: // debug
const idBounds& DefaultSearchBounds() const;
void DrawCone( const idVec3& origin, const idVec3& dir, float radius, const idVec4& color ) const;
void DrawArea( int areaNum ) const;
void DrawFace( int faceNum, bool side ) const;
void DrawEdge( int edgeNum, bool arrow ) const;
void DrawReachability( const idReachability* reach ) const;
void ShowArea( const idVec3& origin ) const;
void ShowWallEdges( const idVec3& origin ) const;
void ShowHideArea( const idVec3& origin, int targerAreaNum ) const;
bool PullPlayer( const idVec3& origin, int toAreaNum ) const;
void RandomPullPlayer( const idVec3& origin ) const;
void ShowPushIntoArea( const idVec3& origin ) const;
};
#endif /* !__AAS_LOCAL_H__ */