PIPE.H

/******************************Module*Header*******************************\ 
* Module Name: pipe.h
*
* PIPE base class
*
* Copyright 1995 - 1998 Microsoft Corporation
*
\**************************************************************************/

#ifndef __pipe_h__
#define __pipe_h__

#include "sscommon.h"
#include "state.h"

// pipe drawing status
enum {
PIPE_ACTIVE,
PIPE_STUCK,
PIPE_OUT_OF_NODES
};

// pipe types
enum {
TYPE_NORMAL,
TYPE_FLEX_REGULAR,
TYPE_FLEX_TURNING
};

// ways pipe choose directions
enum {
CHOOSE_DIR_RANDOM_WEIGHTED,
CHOOSE_DIR_CHASE // when chasing a lead pipe
};

// ways pipe choose start positions
enum {
CHOOSE_STARTPOS_RANDOM,
CHOOSE_STARTPOS_FURTHEST // furthest from last position
};
/**************************************************************************\
*
* PIPE class
*
* - Describes a pipe that draws thru the node array
* - Could have more than one pipe drawing in each array at same time
* - Pipe has position and direction in node array
*
\**************************************************************************/

class STATE;

class PIPE {
public:
int type;
IPOINT3D curPos; // current node position of pipe

STATE *pState; // for state value access

void SetChooseDirectionMethod( int method );
void SetChooseStartPosMethod( int method );
int ChooseNewDirection();
BOOL IsStuck(); // if pipe is stuck or not
BOOL NowhereToRun(){ return status == PIPE_OUT_OF_NODES; }
protected:
BOOL bTexture;
float radius; // ideal radius (fluctuates for FPIPE)
int status; // ACTIVE/STUCK/STOPPED, etc.
int lastDir; // last direction taken by pipe
int notchVec; // current notch vector
PIPE( STATE *state );
int weightStraight; // current weighting of going straight
BOOL SetStartPos(); // starting node position
void ChooseMaterial();
void DrawTeapot();
void UpdateCurrentPosition( int dir );
void TranslateToCurrentPosition();
private:
int chooseDirMethod;
int chooseStartPosMethod;
int GetBestDirsForChase( int *bestDirs );
};

extern void align_plusz( int newDir );
extern GLint notchTurn[NUM_DIRS][NUM_DIRS][NUM_DIRS];

#endif // __pipe_h__