DOOM-3-BFG

DOOM 3 BFG Edition
Log | Files | Refs

AASFile.h (14505B)


      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 __AASFILE_H__
     30 #define __AASFILE_H__
     31 
     32 /*
     33 ===============================================================================
     34 
     35 	AAS File
     36 
     37 ===============================================================================
     38 */
     39 
     40 #define AAS_FILEID					"DewmAAS"
     41 #define AAS_FILEVERSION				"1.07"
     42 
     43 // travel flags
     44 #define TFL_INVALID					BIT(0)		// not valid
     45 #define TFL_WALK					BIT(1)		// walking
     46 #define TFL_CROUCH					BIT(2)		// crouching
     47 #define TFL_WALKOFFLEDGE			BIT(3)		// walking of a ledge
     48 #define TFL_BARRIERJUMP				BIT(4)		// jumping onto a barrier
     49 #define TFL_JUMP					BIT(5)		// jumping
     50 #define TFL_LADDER					BIT(6)		// climbing a ladder
     51 #define TFL_SWIM					BIT(7)		// swimming
     52 #define TFL_WATERJUMP				BIT(8)		// jump out of the water
     53 #define TFL_TELEPORT				BIT(9)		// teleportation
     54 #define TFL_ELEVATOR				BIT(10)		// travel by elevator
     55 #define TFL_FLY						BIT(11)		// fly
     56 #define TFL_SPECIAL					BIT(12)		// special
     57 #define TFL_WATER					BIT(21)		// travel through water
     58 #define TFL_AIR						BIT(22)		// travel through air
     59 
     60 // face flags
     61 #define FACE_SOLID					BIT(0)		// solid at the other side
     62 #define FACE_LADDER					BIT(1)		// ladder surface
     63 #define FACE_FLOOR					BIT(2)		// standing on floor when on this face
     64 #define FACE_LIQUID					BIT(3)		// face seperating two areas with liquid
     65 #define FACE_LIQUIDSURFACE			BIT(4)		// face seperating liquid and air
     66 
     67 // area flags
     68 #define AREA_FLOOR					BIT(0)		// AI can stand on the floor in this area
     69 #define AREA_GAP					BIT(1)		// area has a gap
     70 #define AREA_LEDGE					BIT(2)		// if entered the AI bbox partly floats above a ledge
     71 #define AREA_LADDER					BIT(3)		// area contains one or more ladder faces
     72 #define AREA_LIQUID					BIT(4)		// area contains a liquid
     73 #define AREA_CROUCH					BIT(5)		// AI cannot walk but can only crouch in this area
     74 #define AREA_REACHABLE_WALK			BIT(6)		// area is reachable by walking or swimming
     75 #define AREA_REACHABLE_FLY			BIT(7)		// area is reachable by flying
     76 
     77 // area contents flags
     78 #define AREACONTENTS_SOLID			BIT(0)		// solid, not a valid area
     79 #define AREACONTENTS_WATER			BIT(1)		// area contains water
     80 #define AREACONTENTS_CLUSTERPORTAL	BIT(2)		// area is a cluster portal
     81 #define AREACONTENTS_OBSTACLE		BIT(3)		// area contains (part of) a dynamic obstacle
     82 #define AREACONTENTS_TELEPORTER		BIT(4)		// area contains (part of) a teleporter trigger
     83 
     84 // bits for different bboxes
     85 #define AREACONTENTS_BBOX_BIT		24
     86 
     87 #define MAX_REACH_PER_AREA			256
     88 #define MAX_AAS_TREE_DEPTH			128
     89 
     90 #define MAX_AAS_BOUNDING_BOXES		4
     91 
     92 // reachability to another area
     93 class idReachability {
     94 public:
     95 	int							travelType;			// type of travel required to get to the area
     96 	short						toAreaNum;			// number of the reachable area
     97 	short						fromAreaNum;		// number of area the reachability starts
     98 	idVec3						start;				// start point of inter area movement
     99 	idVec3						end;				// end point of inter area movement
    100 	int							edgeNum;			// edge crossed by this reachability
    101 	unsigned short				travelTime;			// travel time of the inter area movement
    102 	byte						number;				// reachability number within the fromAreaNum (must be < 256)
    103 	byte						disableCount;		// number of times this reachability has been disabled
    104 	idReachability *			next;				// next reachability in list
    105 	idReachability *			rev_next;			// next reachability in reversed list
    106 	unsigned short *			areaTravelTimes;	// travel times within the fromAreaNum from reachabilities that lead towards this area
    107 public:
    108 	void						CopyBase( idReachability &reach );
    109 };
    110 
    111 class idReachability_Walk : public idReachability {
    112 };
    113 
    114 class idReachability_BarrierJump : public idReachability {
    115 };
    116 
    117 class idReachability_WaterJump : public idReachability {
    118 };
    119 
    120 class idReachability_WalkOffLedge : public idReachability {
    121 };
    122 
    123 class idReachability_Swim : public idReachability {
    124 };
    125 
    126 class idReachability_Fly : public idReachability {
    127 };
    128 
    129 class idReachability_Special : public idReachability {
    130 public:
    131 	idDict						dict;
    132 };
    133 
    134 // index
    135 typedef int aasIndex_t;
    136 
    137 // vertex
    138 typedef idVec3 aasVertex_t;
    139 
    140 // edge
    141 typedef struct aasEdge_s {
    142 	int							vertexNum[2];		// numbers of the vertexes of this edge
    143 } aasEdge_t;
    144 
    145 // area boundary face
    146 typedef struct aasFace_s {
    147 	unsigned short				planeNum;			// number of the plane this face is on
    148 	unsigned short				flags;				// face flags
    149 	int							numEdges;			// number of edges in the boundary of the face
    150 	int							firstEdge;			// first edge in the edge index
    151 	short						areas[2];			// area at the front and back of this face
    152 } aasFace_t;
    153 
    154 // area with a boundary of faces
    155 typedef struct aasArea_s {
    156 	int							numFaces;			// number of faces used for the boundary of the area
    157 	int							firstFace;			// first face in the face index used for the boundary of the area
    158 	idBounds					bounds;				// bounds of the area
    159 	idVec3						center;				// center of the area an AI can move towards
    160 	unsigned short				flags;				// several area flags
    161 	unsigned short				contents;			// contents of the area
    162 	short						cluster;			// cluster the area belongs to, if negative it's a portal
    163 	short						clusterAreaNum;		// number of the area in the cluster
    164 	int							travelFlags;		// travel flags for traveling through this area
    165 	idReachability *			reach;				// reachabilities that start from this area
    166 	idReachability *			rev_reach;			// reachabilities that lead to this area
    167 } aasArea_t;
    168 
    169 // nodes of the bsp tree
    170 typedef struct aasNode_s {
    171 	unsigned short				planeNum;			// number of the plane that splits the subspace at this node
    172 	int							children[2];		// child nodes, zero is solid, negative is -(area number)
    173 } aasNode_t;
    174 
    175 // cluster portal
    176 typedef struct aasPortal_s {
    177 	short						areaNum;			// number of the area that is the actual portal
    178 	short						clusters[2];		// number of cluster at the front and back of the portal
    179 	short						clusterAreaNum[2];	// number of this portal area in the front and back cluster
    180 	unsigned short				maxAreaTravelTime;	// maximum travel time through the portal area
    181 } aasPortal_t;
    182 
    183 // cluster
    184 typedef struct aasCluster_s {
    185 	int							numAreas;			// number of areas in the cluster
    186 	int							numReachableAreas;	// number of areas with reachabilities
    187 	int							numPortals;			// number of cluster portals
    188 	int							firstPortal;		// first cluster portal in the index
    189 } aasCluster_t;
    190 
    191 // trace through the world
    192 typedef struct aasTrace_s {
    193 								// parameters
    194 	int							flags;				// areas with these flags block the trace
    195 	int							travelFlags;		// areas with these travel flags block the trace
    196 	int							maxAreas;			// size of the 'areas' array
    197 	int							getOutOfSolid;		// trace out of solid if the trace starts in solid
    198 								// output
    199 	float						fraction;			// fraction of trace completed
    200 	idVec3						endpos;				// end position of trace
    201 	int							planeNum;			// plane hit
    202 	int							lastAreaNum;		// number of last area the trace went through
    203 	int							blockingAreaNum;	// area that could not be entered
    204 	int							numAreas;			// number of areas the trace went through
    205 	int *						areas;				// array to store areas the trace went through
    206 	idVec3 *					points;				// points where the trace entered each new area
    207 								aasTrace_s() { areas = NULL; points = NULL; getOutOfSolid = false; flags = travelFlags = maxAreas = 0; }
    208 } aasTrace_t;
    209 
    210 // settings
    211 class idAASSettings {
    212 public:
    213 								// collision settings
    214 	int							numBoundingBoxes;
    215 	idBounds					boundingBoxes[MAX_AAS_BOUNDING_BOXES];
    216 	bool						usePatches;
    217 	bool						writeBrushMap;
    218 	bool						playerFlood;
    219 	bool						noOptimize;
    220 	bool						allowSwimReachabilities;
    221 	bool						allowFlyReachabilities;
    222 	idStr						fileExtension;
    223 								// physics settings
    224 	idVec3						gravity;
    225 	idVec3						gravityDir;
    226 	idVec3						invGravityDir;
    227 	float						gravityValue;
    228 	float						maxStepHeight;
    229 	float						maxBarrierHeight;
    230 	float						maxWaterJumpHeight;
    231 	float						maxFallHeight;
    232 	float						minFloorCos;
    233 								// fixed travel times
    234 	int							tt_barrierJump;
    235 	int							tt_startCrouching;
    236 	int							tt_waterJump;
    237 	int							tt_startWalkOffLedge;
    238 
    239 public:
    240 								idAASSettings();
    241 
    242 	bool						FromFile( const idStr &fileName );
    243 	bool						FromParser( idLexer &src );
    244 	bool						FromDict( const char *name, const idDict *dict );
    245 	bool						WriteToFile( idFile *fp ) const;
    246 	bool						ValidForBounds( const idBounds &bounds ) const;
    247 	bool						ValidEntity( const char *classname ) const;
    248 
    249 private:
    250 	bool						ParseBool( idLexer &src, bool &b );
    251 	bool						ParseInt( idLexer &src, int &i );
    252 	bool						ParseFloat( idLexer &src, float &f );
    253 	bool						ParseVector( idLexer &src, idVec3 &vec );
    254 	bool						ParseBBoxes( idLexer &src );
    255 };
    256 
    257 
    258 /*
    259 
    260 -	when a node child is a solid leaf the node child number is zero
    261 -	two adjacent areas (sharing a plane at opposite sides) share a face
    262 	this face is a portal between the areas
    263 -	when an area uses a face from the faceindex with a positive index
    264 	then the face plane normal points into the area
    265 -	the face edges are stored counter clockwise using the edgeindex
    266 -	two adjacent convex areas (sharing a face) only share One face
    267 	this is a simple result of the areas being convex
    268 -	the areas can't have a mixture of ground and gap faces
    269 	other mixtures of faces in one area are allowed
    270 -	areas with the AREACONTENTS_CLUSTERPORTAL in the settings have
    271 	the cluster number set to the negative portal number
    272 -	edge zero is a dummy
    273 -	face zero is a dummy
    274 -	area zero is a dummy
    275 -	node zero is a dummy
    276 -	portal zero is a dummy
    277 -	cluster zero is a dummy
    278 
    279 */
    280 
    281 
    282 class idAASFile {
    283 public:
    284 	virtual 					~idAASFile() {}
    285 
    286 	const char *				GetName() const { return name.c_str(); }
    287 	unsigned int				GetCRC() const { return crc; }
    288 
    289 	int							GetNumPlanes() const { return planeList.Num(); }
    290 	const idPlane &				GetPlane( int index ) const { return planeList[index]; }
    291 	int							GetNumVertices() const { return vertices.Num(); }
    292 	const aasVertex_t &			GetVertex( int index ) const { return vertices[index]; }
    293 	int							GetNumEdges() const { return edges.Num(); }
    294 	const aasEdge_t &			GetEdge( int index ) const { return edges[index]; }
    295 	int							GetNumEdgeIndexes() const { return edgeIndex.Num(); }
    296 	const aasIndex_t &			GetEdgeIndex( int index ) const { return edgeIndex[index]; }
    297 	int							GetNumFaces() const { return faces.Num(); }
    298 	const aasFace_t &			GetFace( int index ) const { return faces[index]; }
    299 	int							GetNumFaceIndexes() const { return faceIndex.Num(); }
    300 	const aasIndex_t &			GetFaceIndex( int index ) const { return faceIndex[index]; }
    301 	int							GetNumAreas() const { return areas.Num(); }
    302 	const aasArea_t &			GetArea( int index ) { return areas[index]; }
    303 	int							GetNumNodes() const { return nodes.Num(); }
    304 	const aasNode_t &			GetNode( int index ) const { return nodes[index]; }
    305 	int							GetNumPortals() const { return portals.Num(); }
    306 	const aasPortal_t &			GetPortal( int index ) { return portals[index]; }
    307 	int							GetNumPortalIndexes() const { return portalIndex.Num(); }
    308 	const aasIndex_t &			GetPortalIndex( int index ) const { return portalIndex[index]; }
    309 	int							GetNumClusters() const { return clusters.Num(); }
    310 	const aasCluster_t &		GetCluster( int index ) const { return clusters[index]; }
    311 
    312 	const idAASSettings &		GetSettings() const { return settings; }
    313 
    314 	void						SetPortalMaxTravelTime( int index, int time ) { portals[index].maxAreaTravelTime = time; }
    315 	void						SetAreaTravelFlag( int index, int flag ) { areas[index].travelFlags |= flag; }
    316 	void						RemoveAreaTravelFlag( int index, int flag ) { areas[index].travelFlags &= ~flag; }
    317 
    318 	virtual idVec3				EdgeCenter( int edgeNum ) const = 0;
    319 	virtual idVec3				FaceCenter( int faceNum ) const = 0;
    320 	virtual idVec3				AreaCenter( int areaNum ) const = 0;
    321 
    322 	virtual idBounds			EdgeBounds( int edgeNum ) const = 0;
    323 	virtual idBounds			FaceBounds( int faceNum ) const = 0;
    324 	virtual idBounds			AreaBounds( int areaNum ) const = 0;
    325 
    326 	virtual int					PointAreaNum( const idVec3 &origin ) const = 0;
    327 	virtual int					PointReachableAreaNum( const idVec3 &origin, const idBounds &searchBounds, const int areaFlags, const int excludeTravelFlags ) const = 0;
    328 	virtual int					BoundsReachableAreaNum( const idBounds &bounds, const int areaFlags, const int excludeTravelFlags ) const = 0;
    329 	virtual void				PushPointIntoAreaNum( int areaNum, idVec3 &point ) const = 0;
    330 	virtual bool				Trace( aasTrace_t &trace, const idVec3 &start, const idVec3 &end ) const = 0;
    331 	virtual void				PrintInfo() const = 0;
    332 
    333 protected:
    334 	idStr						name;
    335 	unsigned int				crc;
    336 
    337 	idPlaneSet					planeList;
    338 	idList<aasVertex_t, TAG_AAS>			vertices;
    339 	idList<aasEdge_t, TAG_AAS>			edges;
    340 	idList<aasIndex_t, TAG_AAS>			edgeIndex;
    341 	idList<aasFace_t, TAG_AAS>			faces;
    342 	idList<aasIndex_t, TAG_AAS>			faceIndex;
    343 	idList<aasArea_t, TAG_AAS>			areas;
    344 	idList<aasNode_t, TAG_AAS>			nodes;
    345 	idList<aasPortal_t, TAG_AAS>			portals;
    346 	idList<aasIndex_t, TAG_AAS>			portalIndex;
    347 	idList<aasCluster_t, TAG_AAS>		clusters;
    348 	idAASSettings				settings;
    349 };
    350 
    351 #endif /* !__AASFILE_H__ */