/* 
 * texas.c
 * 
 * FUNCTION:
 * Draws a brand in the shape of Texas.  Both the handle, and the
 * cross-section of the brand are in the shape of Texas.
 *
 * Note that the contours are specified in clockwise order. 
 * Thus, enabling backfacing polygon removal will cause the front
 * polygons to disappear.
 *
 * HISTORY:
 * -- created by Linas Vepstas October 1991
 * -- heavily modified to draw more texas shapes, Feb 1993, Linas
 * -- converted to use GLUT -- December 1995, Linas
 * Copyright (c) 1991, 1993, 1995 Linas Vepstas <linas@linas.org>
 *
 */

/* required include files */
#include <math.h>
#include <stdlib.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include <GL/gle.h>
#include "main.h"

/* =========================================================== */

#define HNUM 4
double brand_points[HNUM][3];
float brand_colors [HNUM][3];

#define TSCALE  4.0

#define BPTS(x,y,z) {				\
   brand_points[i][0] = TSCALE * (x);		\
   brand_points[i][1] = TSCALE * (y);		\
   brand_points[i][2] = TSCALE * (z);		\
   i++;						\
}

#define BCOLS(r,g,b) {				\
   brand_colors[i][0] = (r);		 	\
   brand_colors[i][1] = (g);			\
   brand_colors[i][2] = (b);			\
   i++;						\
}

#define NUMPOINTS 18
double tspine[NUMPOINTS][3];
float tcolors [NUMPOINTS][3];

#define TPTS(x,y) {				\
   tspine[i][0] = TSCALE * (x);		\
   tspine[i][1] = TSCALE * (y);		\
   tspine[i][2] = TSCALE * (0.0);		\
   i++;						\
}

#define TCOLS(r,g,b) {				\
   tcolors[i][0] = (r);				\
   tcolors[i][1] = (g);				\
   tcolors[i][2] = (b);				\
   i++;						\
}

/* =========================================================== */

static void init_spine (void)
{
   int i;
   int ir, ig, ib;
   float r, g, b;

   i=0;
   TPTS (-1.5, 2.0);	/* panhandle */
   TPTS (-0.75, 2.0);
   TPTS (-0.75, 1.38);
   TPTS (-0.5, 1.25);
   TPTS (0.88, 1.12);
   TPTS (1.0, 0.62);
   TPTS (1.12, 0.1);
   TPTS (0.5, -0.5);
   TPTS (0.2, -1.12);	/* corpus */
   TPTS (0.3, -1.5);	/* brownsville */
   TPTS (-0.25, -1.45);
   TPTS (-1.06, -0.3);
   TPTS (-1.38, -0.3);
   TPTS (-1.65, -0.6);
   TPTS (-2.5, 0.5);   /* midland */
   TPTS (-1.5, 0.5);
   TPTS (-1.5, 2.0);	/* panhandle */
   TPTS (-0.75, 2.0);

   ir = ig = ib = 0;
   for (i=0; i<NUMPOINTS; i++) {
      ir += 33; ig +=47; ib +=89;
      ir %= 255; ig %= 255; ib %= 255;
      r = ((float) ir) / 255.0;
      g = ((float) ig) / 255.0;
      b = ((float) ib) / 255.0;
      
      tcolors[i][0] = (r);
      tcolors[i][1] = (g);
      tcolors[i][2] = (b);
   }

   i=0;
   BPTS (0.0, 0.0, 0.1);
   BPTS (0.0, 0.0, 0.0);
   BPTS (0.0, 0.0, -5.0);
   BPTS (0.0, 0.0, -5.1);

   i=0;
   BCOLS (1.0, 0.3, 0.0);
   BCOLS (1.0, 0.3, 0.0);
   BCOLS (1.0, 0.3, 0.0);
   BCOLS (1.0, 0.3, 0.0);
}

/* =========================================================== */

#define SCALE 0.8
#define BORDER(x,y) {						\
   double ax, ay, alen;						\
   texas_xsection[i][0] = SCALE * (x);				\
   texas_xsection[i][1] = SCALE * (y);				\
   if (i!=0) {							\
      ax = texas_xsection[i][0] - texas_xsection[i-1][0];		\
      ay = texas_xsection[i][1] - texas_xsection[i-1][1];		\
      alen = 1.0 / sqrt (ax*ax + ay*ay);			\
      ax *= alen;   ay *= alen;					\
      texas_normal [i-1][0] = - ay;				\
      texas_normal [i-1][1] = ax;				\
   }								\
   i++;								\
}

#define NUM_TEXAS_PTS (17)

double texas_xsection [NUM_TEXAS_PTS][2];
double texas_normal [NUM_TEXAS_PTS][2];

static void init_xsection (void)
{
   int i;

   /* outline of extrusion */
   i=0;
   BORDER (-0.75, 2.0);
   BORDER (-0.75, 1.38);
   BORDER (-0.5, 1.25);
   BORDER (0.88, 1.12);
   BORDER (1.0, 0.62);
   BORDER (1.12, 0.1);
   BORDER (0.5, -0.5);
   BORDER (0.2, -1.12);	/* corpus */
   BORDER (0.3, -1.5);	/* brownsville */
   BORDER (-0.25, -1.45);
   BORDER (-1.06, -0.3);
   BORDER (-1.38, -0.3);
   BORDER (-1.65, -0.6);
   BORDER (-2.5, 0.5);   /* midland */
   BORDER (-1.5, 0.5);
   BORDER (-1.5, 2.0);	/* panhandle */
   BORDER (-0.75, 2.0);
}

   
/* =========================================================== */

void InitStuff (void)
{
   int style;

   /* configure the pipeline */
   init_spine ();
   init_xsection ();

   style = TUBE_JN_CAP;
   style |= TUBE_CONTOUR_CLOSED;
   style |= TUBE_NORM_FACET;
   style |= TUBE_JN_ANGLE;
   gleSetJoinStyle (style);
}

/* =========================================================== */

void DrawStuff (void) {

#ifdef IBM_GL_32
   scale (1.8, 1.8, 1.8);

   lmcolor (material_mode);
   (void) extrusion (NUM_TEXAS_PTS-1, texas_xsection, texas_normal, 
                    NULL, NUMPOINTS, tspine, tcolors);

   (void) extrusion (NUM_TEXAS_PTS-1, texas_xsection, texas_normal, 
                    NULL, HNUM, brand_points, brand_colors);

   lmcolor (LMC_COLOR);
#endif

#define OPENGL_10
#ifdef OPENGL_10
   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   /* set up some matrices so that the object spins with the mouse */
   glPushMatrix ();
   glTranslatef (0.0, 0.0, -80.0);
   glRotatef (lastx, 0.0, 1.0, 0.0);
   glRotatef (lasty, 1.0, 0.0, 0.0);

   /* draw the brand and the handle */
   gleExtrusion (NUM_TEXAS_PTS-1, texas_xsection, texas_normal, 
                 NULL, NUMPOINTS, tspine, tcolors);

   gleExtrusion (NUM_TEXAS_PTS-1, texas_xsection, texas_normal, 
                 NULL, HNUM, brand_points, brand_colors);

   glPopMatrix ();
   glutSwapBuffers ();
}
#endif

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

