/*
    pixels1.c

    - Zeichnet ein Array von Pixeln (hier: Zufallswerte)
    - Programm-Ende durch Drücken einer beliebigen Taste


    > Kann man den Zoom-Faktor (glPixelZoom) auch
      größer als 1 machen?

    > Lässt sich das Pixelbild drehen?

    > Statt Zufallswerte einzusetzen, kann man natürlich auch
      ein Bild "malen", indem man den Einträgen des Pixes-Arrays
      geeignete Werte zuweist. Wie erzeugt man z.B. ein weisses
      Kreuz auf schwarzen Grund?

    > Nebenbemerkung: Normalerweise benutzt man Pixel-Arrays in zwei
      typischen Fällen. Erstens, um Bilder aus Dateien anzuzeigen.
      Wie man Bilddateien (Tiff-Format) einliest, wird in texture2.c
      gezeigt. Zweitens, um berechnete Daten zu visualisieren, die in
      Matrixform vorliegen, beispielsweise bei Simulationen
      mit sogenannten Zellulären Automaten.
*/



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


# define        BREITE      100
# define        HOEHE       100



static void     display_func (void)
/*********************************/
{
    GLubyte     pixels[HOEHE][BREITE][3];
    int         i,
                n = 8,
                h, b;
    float       x, y,
                phi,
                zoom;


    printf ("display_func()\n");

    /* Pixelbild vorbereiten: */

    glLoadIdentity ();
    gluOrtho2D (-2, 2, -2, 2);

    for (h = 0; h < HOEHE; h ++)
    for (b = 0; b < BREITE; b ++)
    {
        pixels [h] [b] [0] = 0;                    /* kein rot */
        pixels [h] [b] [1] = 255 * drand48 ();     /* grün = Zufall */
        pixels [h] [b] [2] = 0;                    /* kein blau */
    }

    /* Rendern: */

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

    glPointSize (10);
    glColor3f (0, 0, 0);
    glPixelStorei (GL_UNPACK_ALIGNMENT, 1);

    for (i = 0; i < n; i ++)
    {
        phi = 2 * M_PI * i / (float) n;
        x = cos (phi);
        y = sin (phi);
        zoom =  (i + 1) / (float) n;

        glPixelZoom (zoom, zoom);
        glRasterPos2f (x, y);
        glDrawPixels (BREITE, HOEHE, GL_RGB, GL_UNSIGNED_BYTE, pixels);

        glBegin (GL_POINTS);
            glVertex2f (x, y);
        glEnd ();
    }

    glFlush ();
    glutReportErrors ();
}



static void     keyboard_func (unsigned char key, int x, int y)
/*************************************************************/
{
    /* printf ("keyboard_func (key='%c', x=%d, y=%d)\n", key, x, y); */

    exit (0);
}



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

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

    glutDisplayFunc (display_func);
    glutKeyboardFunc (keyboard_func);

    glutMainLoop ();

    return 0;
}

