FPIPE.H

/******************************Module*Header*******************************\ 
* Module Name: fpipe.h
*
* Flexy pipe stuff
*
* Copyright 1995 - 1998 Microsoft Corporation
*
\**************************************************************************/

#ifndef __fpipe_h__
#define __fpipe_h__

#include "sscommon.h"
#include "sspipes.h"
#include "pipe.h"
#include "state.h"
#include "eval.h"
#include "xc.h"

// continuity types
enum {
CONT_1 = 0,
CONT_2
};

// cap types
enum {
START_CAP = 0,
END_CAP
};

#define CIRCUMFERENCE( r ) \
( 2.0f * PI * ((GLfloat) r) )

// drawing schemes
enum {
SC_EXTRUDED_XC,
SC_TURNOMANIA,
SC_VARIABLE_XC,
SC_COUNT
};

#define TURNOMANIA_PIPE_COUNT 10

/**************************************************************************\
*
* FLEX_PIPE class
*
* - Pipe has position and direction in node array
*
\**************************************************************************/

class FLEX_PIPE : public PIPE {
public:
void SetTexParams( TEXTURE *pTex, IPOINT2D *pTexRep );

protected:
XC *xcCur, *xcEnd; // current xc, end xc
EVAL *pEval;
GLfloat zTrans; // pos'n of pipe back along current dir,
// from current node
FLEX_PIPE( STATE *state );
~FLEX_PIPE();
void ChooseXCProfile();
void DrawExtrudedXCObject( float length );
void DrawXCElbow( int newDir, float radius );
void DrawCap( int type );

private:
int nSlices; // intended # of slices around an xc (based
// on tessLevel)
int tangent; // current tangent at curXC (usually PLUS_Z)
GLfloat s_start, s_end;
GLfloat t_start, t_end;
GLfloat s_length; // length in WC's of texture width
GLfloat evalDivSize; // ~size in WC's of an eval division
void CalcEvalLengthParams( float length );
};

class REGULAR_FLEX_PIPE : public FLEX_PIPE {
public:
float turnFactorMin; // describes degree of bend in an elbow
float turnFactorMax; // [0-1]

REGULAR_FLEX_PIPE( STATE *state );
void Start();
void Draw();
};

class TURNING_FLEX_PIPE : public FLEX_PIPE {
public:
TURNING_FLEX_PIPE( STATE *state );
void Start();
void Draw();
};

#endif // __fpipe_h__