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