- {ASMMODE intel}
 - {$MODE OBJFPC}
 - program
 -   GlutLektion3FreePascal;
 - uses
 -   glut,     //für Openglfenster
 -   gl,       //OpenGL Unit (gl.... Befehle)
 -   glu,      //GL Utilities (glu... Befehle);
 -   glaux; //Dateihandlingbefehle
 - var
 -   tex : GLuint;
 -  
 - procedure DrawGL; cdecl;
 - begin
 -   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 -   glLoadIdentity;
 -   glTranslatef(0,0,-5);
 -   glBindTexture(GL_TEXTURE_2D, tex);
 -   glBegin(GL_QUADS);
 -      glTexCoord2f(0,0); glVertex3f(-1,-1,0);
 -      glTexCoord2f(0,1); glVertex3f(-1,1,0);
 -      glTexCoord2f(1,1); glVertex3f(1,1,0);
 -      glTexCoord2f(1,0); glVertex3f(1,-1,0);
 -   glEnd;
 -   GlutSwapBuffers;
 - end;
 - procedure Tasten(key : byte; x,y : integer);
 - begin
 -   x:=x+y;
 -   case char(key) of
 -      'f','F': glutFullscreen;
 -      'Q','q': halt;
 -   end;
 -   writeln(key);
 - end;
 - {------------------------------------------------------------------}
 - {  Initialisierung von OpenGL                                      }
 - {------------------------------------------------------------------}
 - procedure InitGL; cdecl;
 - begin
 -  glEnable(GL_TEXTURE_2D);        // Aktiviert Texture Mapping
 -  glShadeModel(GL_SMOOTH);        // Aktiviert weiches Shading
 -  glClearColor(0.0, 0.0, 0.0, 0.5);    // Bildschirm löschen (schwarz)
 -  glClearDepth(1.0);         // Depth Buffer Setup
 -  glEnable(GL_DEPTH_TEST);        // Aktiviert Depth Testing
 -  glDepthFunc(GL_LEQUAL);        // Bestimmt den Typ des Depth Testing
 -  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
 -                                         // Qualitativ bessere Koordinaten Interpolation
 - end;
 - {------------------------------------------------------------------}
 - {  Behandelt Größenveränderung des Fensters                        }
 - {------------------------------------------------------------------}
 - procedure ResizeWndgl(Width, Height : Integer); cdecl;
 - begin
 -  if (Height = 0) then Height := 1;
 -  glViewport(0, 0, Width, Height);    // Setzt den Viewport für das OpenGL Fenster
 -  glMatrixMode(GL_PROJECTION);        // Matrix Mode auf Projection setzen
 -  glLoadIdentity();                   // Reset View
 -  gluPerspective(45.0, GLfloat(Width)/Height, 1.0, 100.0);  // Perspektive den neuen Maßen anpassen.
 -  glMatrixMode(GL_MODELVIEW);         // Zurück zur Modelview Matrix
 -  glLoadIdentity();                   // Reset View
 - end;
 - var
 -   texture1 : PTAUX_RGBImageRec;
 - begin  
 -   texture1 := auxDIBImageLoadA('wall.bmp');
 -   if not Assigned(texture1) then
 -      begin;
 -      writeln('Texturenpfad oder Dateiname falsch! Fehler beim Laden der Textur!');
 -      Halt;
 -      end;
 -  
 -   glGenTextures(1,@tex);
 -   glBindTexture(GL_TEXTURE_2D,tex);
 -   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
 -   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
 -   glTexImage2D(GL_TEXTURE_2D,0,3,texture1^.sizeX,texture1^.sizey,0,GL_RGBA,GL_UNSIGNED_BYTE,texture1^.data);
 -  
 -   writeln('Vollbild mit F, beenden mit Q');
 -   GlutInit(@argc,@argv);
 -   glutInitWindowSize(400,400);
 -   glutInitWindowPosition(100,100);
 -   glutInitDisplayMode(GLUT_RGB or GLUT_DOUBLE or GLUT_DEPTH);
 -   glutCreateWindow('OpenGL via Glut mit FreePascal.');
 -   glutReshapeFunc(@ResizeWndgl);
 -   glutDisplayFunc(@DrawGL);
 -   glutIdleFunc(@DrawGL); //Wird aufgerufen, wenn gerade kein Ereignis anfällt.
 -   glutKeyboardFunc(@Tasten);
 -   InitGl;
 -   GlutMainLoop;
 - end.
 
