You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
4.5 KiB
132 lines
4.5 KiB
/* |
|
* |
|
* This program 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 2 of the License, or (at |
|
* your option) any later version. |
|
* |
|
* This program 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 this program; if not, write to the Free Software Foundation, |
|
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
* |
|
* In addition, as a special exception, the author gives permission to |
|
* link the code of this program with the Half-Life Game Engine ("HL |
|
* Engine") and Modified Game Libraries ("MODs") developed by Valve, |
|
* L.L.C ("Valve"). You must obey the GNU General Public License in all |
|
* respects for all of the code used other than the HL Engine and MODs |
|
* from Valve. If you modify this file, you may extend this exception |
|
* to your version of the file, but you are not obligated to do so. If |
|
* you do not wish to do so, delete this exception statement from your |
|
* version. |
|
* |
|
*/ |
|
|
|
#ifndef NAV_NODE_H |
|
#define NAV_NODE_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
class CNavNode |
|
{ |
|
public: |
|
CNavNode(const Vector *pos, const Vector *normal, CNavNode *parent = NULL); |
|
|
|
// return navigation node at the position, or NULL if none exists |
|
static const CNavNode *GetNode(const Vector *pos); |
|
|
|
// get navigation node connected in given direction, or NULL if cant go that way |
|
CNavNode *GetConnectedNode(NavDirType dir) const; |
|
const Vector *GetPosition() const; |
|
const Vector *GetNormal() const { return &m_normal; } |
|
unsigned int GetID() const { return m_id; } |
|
|
|
static CNavNode *GetFirst() { return m_list; } |
|
static unsigned int GetListLength() { return m_listLength; } |
|
|
|
CNavNode *GetNext() { return m_next; } |
|
|
|
// create a connection FROM this node TO the given node, in the given direction |
|
void ConnectTo(CNavNode *node, NavDirType dir); |
|
CNavNode *GetParent() const; |
|
|
|
void MarkAsVisited(NavDirType dir); // mark the given direction as having been visited |
|
BOOL HasVisited(NavDirType dir); // return TRUE if the given direction has already been searched |
|
BOOL IsBiLinked(NavDirType dir) const; // node is bidirectionally linked to another node in the given direction |
|
BOOL IsClosedCell() const; // node is the NW corner of a bi-linked quad of nodes |
|
|
|
void Cover() { m_isCovered = true; } // TODO: Should pass in area that is covering |
|
BOOL IsCovered() const { return m_isCovered; } // return true if this node has been covered by an area |
|
|
|
void AssignArea(CNavArea *area); // assign the given area to this node |
|
CNavArea *GetArea() const; // return associated area |
|
|
|
void SetAttributes(unsigned char bits) { m_attributeFlags = bits; } |
|
unsigned char GetAttributes() const { return m_attributeFlags; } |
|
|
|
private: |
|
friend void DestroyNavigationMap(); |
|
|
|
Vector m_pos; // position of this node in the world |
|
Vector m_normal; // surface normal at this location |
|
CNavNode *m_to[ NUM_DIRECTIONS ]; // links to north, south, east, and west. NULL if no link |
|
unsigned int m_id; // unique ID of this node |
|
unsigned char m_attributeFlags; // set of attribute bit flags (see NavAttributeType) |
|
|
|
static CNavNode *m_list; // the master list of all nodes for this map |
|
static unsigned int m_listLength; |
|
|
|
CNavNode *m_next; // next link in master list |
|
|
|
// below are only needed when generating |
|
// flags for automatic node generation. If direction bit is clear, that direction hasn't been explored yet. |
|
unsigned char m_visited; |
|
CNavNode *m_parent; // the node prior to this in the search, which we pop back to when this node's search is done (a stack) |
|
BOOL m_isCovered; // true when this node is "covered" by a CNavArea |
|
CNavArea *m_area; // the area this node is contained within |
|
}; |
|
|
|
inline CNavNode *CNavNode::GetConnectedNode(NavDirType dir) const |
|
{ |
|
return m_to[ dir ]; |
|
} |
|
|
|
inline const Vector *CNavNode::GetPosition() const |
|
{ |
|
return &m_pos; |
|
} |
|
|
|
inline CNavNode *CNavNode::GetParent() const |
|
{ |
|
return m_parent; |
|
} |
|
|
|
inline void CNavNode::MarkAsVisited(NavDirType dir) |
|
{ |
|
m_visited |= (1 << dir); |
|
} |
|
|
|
inline BOOL CNavNode::HasVisited(NavDirType dir) |
|
{ |
|
if (m_visited & (1 << dir)) |
|
return true; |
|
|
|
return false; |
|
} |
|
|
|
inline void CNavNode::AssignArea(CNavArea *area) |
|
{ |
|
m_area = area; |
|
} |
|
|
|
inline CNavArea *CNavNode::GetArea() const |
|
{ |
|
return m_area; |
|
} |
|
|
|
#endif // NAV_NODE_H
|
|
|