DOOM-3-BFG

DOOM 3 BFG Edition
Log | Files | Refs

AAS_local.h (10055B)


      1 /*
      2 ===========================================================================
      3 
      4 Doom 3 BFG Edition GPL Source Code
      5 Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. 
      6 
      7 This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").  
      8 
      9 Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify
     10 it under the terms of the GNU General Public License as published by
     11 the Free Software Foundation, either version 3 of the License, or
     12 (at your option) any later version.
     13 
     14 Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful,
     15 but WITHOUT ANY WARRANTY; without even the implied warranty of
     16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17 GNU General Public License for more details.
     18 
     19 You should have received a copy of the GNU General Public License
     20 along with Doom 3 BFG Edition Source Code.  If not, see <http://www.gnu.org/licenses/>.
     21 
     22 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.
     23 
     24 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.
     25 
     26 ===========================================================================
     27 */
     28 
     29 #ifndef __AAS_LOCAL_H__
     30 #define __AAS_LOCAL_H__
     31 
     32 #include "AAS.h"
     33 #include "../Pvs.h"
     34 
     35 
     36 class idRoutingCache {
     37 	friend class idAASLocal;
     38 
     39 public:
     40 								idRoutingCache( int size );
     41 								~idRoutingCache();
     42 
     43 	int							Size() const;
     44 
     45 private:
     46 	int							type;					// portal or area cache
     47 	int							size;					// size of cache
     48 	int							cluster;				// cluster of the cache
     49 	int							areaNum;				// area of the cache
     50 	int							travelFlags;			// combinations of the travel flags
     51 	idRoutingCache *			next;					// next in list
     52 	idRoutingCache *			prev;					// previous in list
     53 	idRoutingCache *			time_next;				// next in time based list
     54 	idRoutingCache *			time_prev;				// previous in time based list
     55 	unsigned short				startTravelTime;		// travel time to start with
     56 	unsigned char *				reachabilities;			// reachabilities used for routing
     57 	unsigned short *			travelTimes;			// travel time for every area
     58 };
     59 
     60 
     61 class idRoutingUpdate {
     62 	friend class idAASLocal;
     63 
     64 private:
     65 	int							cluster;				// cluster number of this update
     66 	int							areaNum;				// area number of this update
     67 	unsigned short				tmpTravelTime;			// temporary travel time
     68 	unsigned short *			areaTravelTimes;		// travel times within the area
     69 	idVec3						start;					// start point into area
     70 	idRoutingUpdate *			next;					// next in list
     71 	idRoutingUpdate *			prev;					// prev in list
     72 	bool						isInList;				// true if the update is in the list
     73 };
     74 
     75 
     76 class idRoutingObstacle {
     77 	friend class idAASLocal;
     78 								idRoutingObstacle() { }
     79 
     80 private:
     81 	idBounds					bounds;					// obstacle bounds
     82 	idList<int, TAG_AAS>					areas;					// areas the bounds are in
     83 };
     84 
     85 
     86 class idAASLocal : public idAAS {
     87 public:
     88 								idAASLocal();
     89 	virtual						~idAASLocal();
     90 	virtual bool				Init( const idStr &mapName, unsigned int mapFileCRC );
     91 	virtual void				Shutdown();
     92 	virtual void				Stats() const;
     93 	virtual void				Test( const idVec3 &origin );
     94 	virtual const idAASSettings *GetSettings() const;
     95 	virtual int					PointAreaNum( const idVec3 &origin ) const;
     96 	virtual int					PointReachableAreaNum( const idVec3 &origin, const idBounds &searchBounds, const int areaFlags ) const;
     97 	virtual int					BoundsReachableAreaNum( const idBounds &bounds, const int areaFlags ) const;
     98 	virtual void				PushPointIntoAreaNum( int areaNum, idVec3 &origin ) const;
     99 	virtual idVec3				AreaCenter( int areaNum ) const;
    100 	virtual int					AreaFlags( int areaNum ) const;
    101 	virtual int					AreaTravelFlags( int areaNum ) const;
    102 	virtual bool				Trace( aasTrace_t &trace, const idVec3 &start, const idVec3 &end ) const;
    103 	virtual const idPlane &		GetPlane( int planeNum ) const;
    104 	virtual int					GetWallEdges( int areaNum, const idBounds &bounds, int travelFlags, int *edges, int maxEdges ) const;
    105 	virtual void				SortWallEdges( int *edges, int numEdges ) const;
    106 	virtual void				GetEdgeVertexNumbers( int edgeNum, int verts[2] ) const;
    107 	virtual void				GetEdge( int edgeNum, idVec3 &start, idVec3 &end ) const;
    108 	virtual bool				SetAreaState( const idBounds &bounds, const int areaContents, bool disabled );
    109 	virtual aasHandle_t			AddObstacle( const idBounds &bounds );
    110 	virtual void				RemoveObstacle( const aasHandle_t handle );
    111 	virtual void				RemoveAllObstacles();
    112 	virtual int					TravelTimeToGoalArea( int areaNum, const idVec3 &origin, int goalAreaNum, int travelFlags ) const;
    113 	virtual bool				RouteToGoalArea( int areaNum, const idVec3 origin, int goalAreaNum, int travelFlags, int &travelTime, idReachability **reach ) const;
    114 	virtual bool				WalkPathToGoal( aasPath_t &path, int areaNum, const idVec3 &origin, int goalAreaNum, const idVec3 &goalOrigin, int travelFlags ) const;
    115 	virtual bool				WalkPathValid( int areaNum, const idVec3 &origin, int goalAreaNum, const idVec3 &goalOrigin, int travelFlags, idVec3 &endPos, int &endAreaNum ) const;
    116 	virtual bool				FlyPathToGoal( aasPath_t &path, int areaNum, const idVec3 &origin, int goalAreaNum, const idVec3 &goalOrigin, int travelFlags ) const;
    117 	virtual bool				FlyPathValid( int areaNum, const idVec3 &origin, int goalAreaNum, const idVec3 &goalOrigin, int travelFlags, idVec3 &endPos, int &endAreaNum ) const;
    118 	virtual void				ShowWalkPath( const idVec3 &origin, int goalAreaNum, const idVec3 &goalOrigin ) const;
    119 	virtual void				ShowFlyPath( const idVec3 &origin, int goalAreaNum, const idVec3 &goalOrigin ) const;
    120 	virtual bool				FindNearestGoal( aasGoal_t &goal, int areaNum, const idVec3 origin, const idVec3 &target, int travelFlags, aasObstacle_t *obstacles, int numObstacles, idAASCallback &callback ) const;
    121 
    122 private:
    123 	idAASFile *					file;
    124 	idStr						name;
    125 
    126 private:	// routing data
    127 	idRoutingCache ***			areaCacheIndex;			// for each area in each cluster the travel times to all other areas in the cluster
    128 	int							areaCacheIndexSize;		// number of area cache entries
    129 	idRoutingCache **			portalCacheIndex;		// for each area in the world the travel times from each portal
    130 	int							portalCacheIndexSize;	// number of portal cache entries
    131 	idRoutingUpdate *			areaUpdate;				// memory used to update the area routing cache
    132 	idRoutingUpdate *			portalUpdate;			// memory used to update the portal routing cache
    133 	unsigned short *			goalAreaTravelTimes;	// travel times to goal areas
    134 	unsigned short *			areaTravelTimes;		// travel times through the areas
    135 	int							numAreaTravelTimes;		// number of area travel times
    136 	mutable idRoutingCache *	cacheListStart;			// start of list with cache sorted from oldest to newest
    137 	mutable idRoutingCache *	cacheListEnd;			// end of list with cache sorted from oldest to newest
    138 	mutable int					totalCacheMemory;		// total cache memory used
    139 	idList<idRoutingObstacle *, TAG_AAS>	obstacleList;			// list with obstacles
    140 
    141 private:	// routing
    142 	bool						SetupRouting();
    143 	void						ShutdownRouting();
    144 	unsigned short				AreaTravelTime( int areaNum, const idVec3 &start, const idVec3 &end ) const;
    145 	void						CalculateAreaTravelTimes();
    146 	void						DeleteAreaTravelTimes();
    147 	void						SetupRoutingCache();
    148 	void						DeleteClusterCache( int clusterNum );
    149 	void						DeletePortalCache();
    150 	void						ShutdownRoutingCache();
    151 	void						RoutingStats() const;
    152 	void						LinkCache( idRoutingCache *cache ) const;
    153 	void						UnlinkCache( idRoutingCache *cache ) const;
    154 	void						DeleteOldestCache() const;
    155 	idReachability *			GetAreaReachability( int areaNum, int reachabilityNum ) const;
    156 	int							ClusterAreaNum( int clusterNum, int areaNum ) const;
    157 	void						UpdateAreaRoutingCache( idRoutingCache *areaCache ) const;
    158 	idRoutingCache *			GetAreaRoutingCache( int clusterNum, int areaNum, int travelFlags ) const;
    159 	void						UpdatePortalRoutingCache( idRoutingCache *portalCache ) const;
    160 	idRoutingCache *			GetPortalRoutingCache( int clusterNum, int areaNum, int travelFlags ) const;
    161 	void						RemoveRoutingCacheUsingArea( int areaNum );
    162 	void						DisableArea( int areaNum );
    163 	void						EnableArea( int areaNum );
    164 	bool						SetAreaState_r( int nodeNum, const idBounds &bounds, const int areaContents, bool disabled );
    165 	void						GetBoundsAreas_r( int nodeNum, const idBounds &bounds, idList<int> &areas ) const;
    166 	void						SetObstacleState( const idRoutingObstacle *obstacle, bool enable );
    167 
    168 private:	// pathing
    169 	bool						EdgeSplitPoint( idVec3 &split, int edgeNum, const idPlane &plane ) const;
    170 	bool						FloorEdgeSplitPoint( idVec3 &split, int areaNum, const idPlane &splitPlane, const idPlane &frontPlane, bool closest ) const;
    171 	idVec3						SubSampleWalkPath( int areaNum, const idVec3 &origin, const idVec3 &start, const idVec3 &end, int travelFlags, int &endAreaNum ) const;
    172 	idVec3						SubSampleFlyPath( int areaNum, const idVec3 &origin, const idVec3 &start, const idVec3 &end, int travelFlags, int &endAreaNum ) const;
    173 
    174 private:	// debug
    175 	const idBounds &			DefaultSearchBounds() const;
    176 	void						DrawCone( const idVec3 &origin, const idVec3 &dir, float radius, const idVec4 &color ) const;
    177 	void						DrawArea( int areaNum ) const;
    178 	void						DrawFace( int faceNum, bool side ) const;
    179 	void						DrawEdge( int edgeNum, bool arrow ) const;
    180 	void						DrawReachability( const idReachability *reach ) const;
    181 	void						ShowArea( const idVec3 &origin ) const;
    182 	void						ShowWallEdges( const idVec3 &origin ) const;
    183 	void						ShowHideArea( const idVec3 &origin, int targerAreaNum ) const;
    184 	bool						PullPlayer( const idVec3 &origin, int toAreaNum ) const;
    185 	void						RandomPullPlayer( const idVec3 &origin ) const;
    186 	void						ShowPushIntoArea( const idVec3 &origin ) const;
    187 };
    188 
    189 #endif /* !__AAS_LOCAL_H__ */