///////////////////////////////////////////////////////////////////////////////////////
// OpenGL-Tutorial 1: Oeffnen eines Fensters mit der
// GLUT-Lib und Zeichnen eines Rechtecks
///////////////////////////////////////////////////////////////////////////////////////
// Autor : Kim Kulling 
// Date  : 17.12.2002 
// 
// nach OpenGL-Bible 2.Aufl.
//
// compiliereun unter Linux mit:
// gcc opengl1.c -lglut -lMesaGLU

// Zeile mit compilieren, wenn Windows:
// include <windows.h>
#include <GL/glut.h>

// Funktion zum Malen der Szene
void RenderScene(void) {
    // Loesche das Fenster mit der aktuell gesetzten
    // Loeschfarbe
    glClear(GL_COLOR_BUFFER_BIT);

    // Setze die aktuelle Zeichenfarbe zu rot
    // ala 
    glColor3f(1.0f, 0.0f, 0.0f);
    
    // Zeichne ein Rechteck
    glRectf(100.0f, 150.0f, 150.0f, 100.0f);
    

    // Flush Zeichenoperationen
    glFlush();
}

// Setze Renderstate
void SetupRC(void) 
{
    glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}

// Aendere Fenstergroesse
void ChangeSize(GLsizei w, GLsizei h)
{
    // Es darf keine Division durch Null durchgeführt werden
    if (h==0)
        h = 1;
    
    // Setze den Viewport auf die aktuelle Dimension des Fensters
    glViewport(0, 0, w, h);
    
    // Wähle die Projektionsmatrix aus
    glMatrixMode(GL_PROJECTION);

    // Hilfsmatrix auf Null setzen (wird zur Berechnung von Translationen 
    // und Rotationen gebraucht
    glLoadIdentity();

    // Wenn Breite kleiner der Höhe, dann skaliere Breite
    // ansonsten die Höhe
    if (w<=h)
        glOrtho(0.0f, 250.f, 0.0f, 250.f * h/w, 1.0, -1.0);
    else
        glOrtho(0.0f, 250.f *w/h, 0.0f, 250.f, 1.0, -1.0);

    // Alle Transformationen werden auf das Tragwerk angewandt
    // (Transformations-Matrix)
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}


// Hauptroutine (Einsprungspunkt)
void main(void) {
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutCreateWindow("First Steps");
    glutDisplayFunc(RenderScene);
    glutReshapeFunc(ChangeSize);
    
    SetupRC();

    glutMainLoop();
}
