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.
133 lines
4.5 KiB
133 lines
4.5 KiB
8 years ago
|
/*
|
||
|
*
|
||
|
* 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
|