/*
 * tube_gc.h
 *
 * FUNCTION:
 * This file allows for easy changes to changes in the way the extrusion
 * library handles state info (i.e. context).
 *
 * HISTORY:
 * Linas Vepstas --- February 1993
 * Added auto texture coord generation hacks, Linas April 1994
 */

typedef float gleColor[3];
typedef double gleTwoVec[2];

typedef struct {

   /* public methods */
   void (*bgn_gen_texture) (int, double);
   void (*n3f_gen_texture) (float *);
   void (*n3d_gen_texture) (double *);
   void (*v3f_gen_texture) (float *, int, int);
   void (*v3d_gen_texture) (double *, int, int);
   void (*end_gen_texture) (void);

   /* protected members -- "general knowledge" stuff */
   int join_style;

   /* arguments passed into extrusion code */ 
   int ncp;     /* number of contour points */
   gleTwoVec *contour;    /* 2D contour */
   gleTwoVec *cont_normal;  /* 2D contour normals */
   gleDouble *up;               /* up vector */
   int npoints;  /* number of points in polyline */
   gleVector *point_array;     /* path */
   gleColor *color_array;         /* path colors */
   gleAffine *xform_array;  /* contour xforms */

   /* private members, used by texturing code */
   int num_vert;
   int segment_number;
   double segment_length;
   double accum_seg_len;
   double prev_x;
   double prev_y;

   void (*save_bgn_gen_texture) (int, double);
   void (*save_n3f_gen_texture) (float *);
   void (*save_n3d_gen_texture) (double *);
   void (*save_v3f_gen_texture) (float *, int, int);
   void (*save_v3d_gen_texture) (double *, int, int);
   void (*save_end_gen_texture) (void);

} gleGC;

extern gleGC *_gle_gc;
extern gleGC * gleCreateGC (void);

#define INIT_GC() {if (!_gle_gc) _gle_gc = gleCreateGC(); }
#define extrusion_join_style (_gle_gc->join_style)

#define __TUBE_CLOSE_CONTOUR (extrusion_join_style & TUBE_CONTOUR_CLOSED)
#define __TUBE_DRAW_CAP (extrusion_join_style & TUBE_JN_CAP)
#define __TUBE_DRAW_FACET_NORMALS (extrusion_join_style & TUBE_NORM_FACET)
#define __TUBE_DRAW_PATH_EDGE_NORMALS (extrusion_join_style & TUBE_NORM_PATH_EDGE)

#define __TUBE_STYLE (extrusion_join_style & TUBE_JN_MASK)
#define __TUBE_RAW_JOIN (extrusion_join_style & TUBE_JN_RAW)
#define __TUBE_CUT_JOIN (extrusion_join_style & TUBE_JN_CUT)
#define __TUBE_ANGLE_JOIN (extrusion_join_style & TUBE_JN_ANGLE)
#define __TUBE_ROUND_JOIN (extrusion_join_style & TUBE_JN_ROUND)

/* ======================= END OF FILE ========================== */
