/*
    polygon2.c

    - Zeichnet Polygone, Dreiecke, Vierecke
    - Programm-Ende durch Drücken einer Taste.

    > Wie könnten Beispiel aussehen für:
      type = GL_POLYGON;
      type = GL_TRIANGLES;
      type = GL_TRIANGLE_STRIP;
      type = GL_TRIANGLE_FAN;
      type = GL_QUADS;
      type = GL_QUAD_STRIP;
 */


# include       <stdio.h>
# include       <stdlib.h>
# include       <math.h>
# include       <GL/gl.h>
# include       <GL/glut.h>


# define        N           12


static void     display_func (void)
/*********************************/
{
    int         i;
    GLenum      type = GL_TRIANGLES;
    float       vertices[N][2];

    /* printf ("display_func()\n"); */

    glLoadIdentity ();  /* siehe points2.c */
    gluOrtho2D (0, 1, 0, 1);

    /* Die Vertizes werden nur einmal berechnet */
    /* und in einem Array gespeichert: */
    for (i = 0; i < N; i ++)
    {
        vertices[i][0] = (i + 1) / (float) (N + 1);
        vertices[i][1] = 0.3 + 0.4 * (i % 2);
    }

    glClearColor (1, 1, 1, 0);
    glClear (GL_COLOR_BUFFER_BIT);


    /* Gefüllte Flächen (GL_FILL) ist auch Voreinstellung */
    glColor3f (0.8, 0.8, 0.8);
    glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
    glBegin (type);
    for (i = 0; i < N; i ++)
        glVertex2fv (vertices[i]);
    glEnd ();

    /* Nur die Umrandung der Flächen zeichnen: */
    glColor3f (0.3, 0.3, 0.3);
    glLineWidth (3);
    glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
    glBegin (type);
    for (i = 0; i < N; i ++)
        glVertex2fv (vertices[i]);
    glEnd ();

    /* Nur die Vertizes der Flächen zeichnen: */
    glColor3f (1, 0, 0);
    glPointSize (10);
    glPolygonMode (GL_FRONT_AND_BACK, GL_POINT);
    glBegin (type);
    for (i = 0; i < N; i ++)
        glVertex2fv (vertices[i]);
    glEnd ();

    glFlush ();
    glutReportErrors ();
}



static void     keyboard_func (unsigned char key, int x, int y)
/*************************************************************/
{
    exit (0);
}



extern int      main (int argc, char **argv)
/******************************************/
{
    glutInit (&argc, argv);
    glutInitDisplayMode (GLUT_RGB);

    glutInitWindowPosition (200, 100);
    glutInitWindowSize (600, 600);
    glutCreateWindow ("polygon2");

    glutDisplayFunc (display_func);
    glutKeyboardFunc (keyboard_func);

    glutMainLoop ();

    return 0;
}


