Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

78 lines
2.9 KiB

//-----------------------------------------------------------------------------
// File: node.h
//
// Desc: Node stuff
//
// Copyright (c) 1994-2000 Microsoft Corporation
//-----------------------------------------------------------------------------
#ifndef __node_h__
#define __node_h__
#define NUM_NODE (NUM_DIV - 1) // num nodes in longest dimension
// maximum weighting of going straight for direction choosing functions
#define MAX_WEIGHT_STRAIGHT 100
//-----------------------------------------------------------------------------
// Name: Node class
// Desc:
//-----------------------------------------------------------------------------
class Node
{
public:
void MarkAsTaken() { m_empty = FALSE; }
void MarkAsEmpty() { m_empty = TRUE; }
BOOL IsEmpty() { return m_empty; }
private:
BOOL m_empty;
};
//-----------------------------------------------------------------------------
// Name: Node array class
// Desc: - 3d array of nodes
// - Functions to access node neighbours, query if taken or not, etc.
// - Not only is this the node array, but a set of methods that operates on it
//-----------------------------------------------------------------------------
class NODE_ARRAY
{
public:
NODE_ARRAY();
~NODE_ARRAY();
void Resize( IPOINT3D *pNewSize ); // new array size
void Reset(); // set all nodes to empty
int ChooseRandomDirection( IPOINT3D *pos, int dir, int weight );
int ChoosePreferredDirection( IPOINT3D *pos, int dir, int *prefDirs,
int nPrefDirs );
int ChooseNewTurnDirection( IPOINT3D *pos, int dir );
int FindClearestDirection( IPOINT3D *pos );
int GetBestPossibleTurns( IPOINT3D *pos, int dir, int *turnDirs );
BOOL FindRandomEmptyNode( IPOINT3D *ip3dEmpty );
BOOL FindRandomEmptyNode2D( IPOINT3D *pos, int plane, int *box );
BOOL TakeClosestEmptyNode( IPOINT3D *newPos, IPOINT3D *pos );
void NodeVisited( IPOINT3D *pos );
void GetNodeCount( IPOINT3D *pos );
private:
Node* m_nodes; // ptr to node array
int m_lock; // semaphore lock for >1 drawing pipes
IPOINT3D m_numNodes; // x,y,z dimensions of node array
int m_nodeDirInc[NUM_DIRS]; // array offset between nodes for each dir
void GetNeighbours( IPOINT3D *pos, Node **nNode );
Node* GetNode( IPOINT3D *pos );
Node* GetNextNode( IPOINT3D *pos, int dir );
BOOL GetNextNodePos( IPOINT3D *curPos, IPOINT3D *nextPos, int dir );
int GetEmptyNeighbours( Node **nNode, int *nEmpty );
int GetEmptyTurnNeighbours( Node **nNode, int *nEmpty, int lastDir );
int GetEmptyNeighboursAlongDir( IPOINT3D *pos, int dir,
int searchRadius );
};
#endif // __node_h__