lines.c
contents ::
  Makefile
  lines.c

// up to page 59

#include <GL/glut.h>
#include <stdlib.h>

#define drawOneLine(x1, y1, x2, y2) glBegin(GL_LINES); \
   glVertex2f((x1),(y1)); glVertex2f((x2),(y2)); glEnd();

void init(void){
  glClearColor(0.0, 0.0, 0.0, 0.0);
  glShadeModel(GL_FLAT);
}

void display(void){
  int i;

  glClear(GL_COLOR_BUFFER_BIT);
  /* Select white for all lines */
  glColor3f(1.0, 1.0, 1.0);

  /* in first row, 3 lines, each with a different stipple */
  glEnable(GL_LINE_STIPPLE);

  glLineStipple(1, 0x0101);  // dotted
  drawOneLine(50.0, 125.0, 150, 125);
  glLineStipple(1, 0x00FF);  // dashed
  drawOneLine(150.0, 125.0, 250, 125);
  glLineStipple(1, 0x1C47);  // dash/dot/dash
  drawOneLine(250.0, 125.0, 350, 125);
  
  /* in 2nd row, 3 wide lines, each with a different stipple */
  glLineWidth(5);

  glLineStipple(1, 0x0101);  // dotted
  drawOneLine(50.0, 100.0, 150, 100);
  glLineStipple(1, 0x00FF);  // dashed
  drawOneLine(150.0, 100.0, 250, 100);
  glLineStipple(1, 0x1C47);  // dash/dot/dash
  drawOneLine(250.0, 100.0, 350, 100);
  glLineWidth(1);

  /* in 3rd row, 6 lines, with dash/dot/dash stipple 
     as part of a single connected line strip
     glLineStipple(1, 0x1C47); // dash/dot/dash */
  glBegin(GL_LINE_STRIP);
  for(i=0; i<7; i++)
    glVertex2f(50.0 + ((GLfloat) i * 50.0), 75.0);
  glEnd();

  /* in 5th row, 6 independent lines with the same stipple */
  for(i=0; i<6; i++){
    drawOneLine(50.0 +  ((GLfloat) i * 50.0), 50.0,
                  50.0 +  ((GLfloat) (i+1) * 50.0), 50.0);
  }
  
  /* in 5th row, 1 line, with dash/dot/dash stipple
     and a stipple repeat factor of 5
     glLineStipple(5, 0x1C47); // dash/dot/dash */
  drawOneLine(50.0, 25.0, 350, 50);

  glDisable(GL_LINE_STIPPLE);
  /* Select color for polygons */
  glColor3f(0.5, 1.0, 0.5);

  /* Enable cull on front face */
  glEnable(GL_CULL_FACE);
  glCullFace(GL_FRONT);

  /* apply cull thing */
  glFrontFace(GL_CW);
  glPolygonMode(GL_FRONT, GL_LINE);
  glPolygonMode(GL_BACK, GL_FILL);

  /* Adding a polygon or two */
  glBegin(GL_POLYGON);
     glVertex2f(50, 50);
     glVertex2f(75, 50);
     glVertex2f(87.5, 62.5);
     glVertex2f(75, 75);
     glVertex2f(50, 75); 
     glVertex2f(37.5, 62.5);   
  glEnd();


  /* Select color for polygons */
  glColor3f(1.0, 0.5, 0.5);

  /* apply cull thing */
  glFrontFace(GL_CW);
  glPolygonMode(GL_FRONT, GL_LINE);
  glPolygonMode(GL_BACK, GL_FILL);

  glBegin(GL_POLYGON);
     glVertex2f(150, 50);
     glVertex2f(150, 75);
     glVertex2f(162.5, 87.5);
     glVertex2f(175, 75);
     glVertex2f(175, 50); 
     glVertex2f(162.5, 37.5);    
  glEnd();

  glDisable(GL_CULL_FACE);

  glFlush();
}

void reshape(int w, int h){
  glViewport(0, 0, (GLsizei) w, (GLsizei) h);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);
}

int main(int argc, char **argv){
  strcpy(argv[0], "James Box");
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  glutInitWindowSize(400, 150);
  glutInitWindowPosition(100, 100);
  glutCreateWindow(argv[0]);
  init();
  glutDisplayFunc(display);
  glutReshapeFunc(reshape);
  glutMainLoop();
  return EXIT_SUCCESS;
}

James Little