windows-nt/Source/XPSP1/NT/multimedia/opengl/scrsave/pipes/pipe.h
2020-09-26 16:20:57 +08:00

88 lines
2.4 KiB
C++

/******************************Module*Header*******************************\
* Module Name: pipe.h
*
* PIPE base class
*
* Copyright (c) 1995 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__