/******************************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__