mirror of
https://github.com/dhewm/dhewm3.git
synced 2024-12-11 13:30:59 +00:00
736ec20d4d
Don't include the lazy precompiled.h everywhere, only what's required for the compilation unit. platform.h needs to be included instead to provide all essential defines and types. All includes use the relative path to the neo or the game specific root. Move all idlib related includes from idlib/Lib.h to precompiled.h. precompiled.h still exists for the MFC stuff in tools/. Add some missing header guards.
188 lines
9.8 KiB
C++
188 lines
9.8 KiB
C++
/*
|
|
===========================================================================
|
|
|
|
Doom 3 GPL Source Code
|
|
Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
|
|
|
|
This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code").
|
|
|
|
Doom 3 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 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 Source Code. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
In addition, the Doom 3 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 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 "ai/AAS.h"
|
|
#include "Pvs.h"
|
|
|
|
class idRoutingCache {
|
|
friend class idAASLocal;
|
|
|
|
public:
|
|
idRoutingCache( int size );
|
|
~idRoutingCache( void );
|
|
|
|
int Size( void ) 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( void ) { }
|
|
|
|
private:
|
|
idBounds bounds; // obstacle bounds
|
|
idList<int> areas; // areas the bounds are in
|
|
};
|
|
|
|
|
|
class idAASLocal : public idAAS {
|
|
public:
|
|
idAASLocal( void );
|
|
virtual ~idAASLocal( void );
|
|
virtual bool Init( const idStr &mapName, unsigned int mapFileCRC );
|
|
virtual void Shutdown( void );
|
|
virtual void Stats( void ) const;
|
|
virtual void Test( const idVec3 &origin );
|
|
virtual const idAASSettings *GetSettings( void ) 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( void );
|
|
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 *> obstacleList; // list with obstacles
|
|
|
|
private: // routing
|
|
bool SetupRouting( void );
|
|
void ShutdownRouting( void );
|
|
unsigned short AreaTravelTime( int areaNum, const idVec3 &start, const idVec3 &end ) const;
|
|
void CalculateAreaTravelTimes( void );
|
|
void DeleteAreaTravelTimes( void );
|
|
void SetupRoutingCache( void );
|
|
void DeleteClusterCache( int clusterNum );
|
|
void DeletePortalCache( void );
|
|
void ShutdownRoutingCache( void );
|
|
void RoutingStats( void ) const;
|
|
void LinkCache( idRoutingCache *cache ) const;
|
|
void UnlinkCache( idRoutingCache *cache ) const;
|
|
void DeleteOldestCache( void ) 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( void ) 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__ */
|