unit settings;

interface

procedure SettingsOnInit;
procedure SettingsOnDestroy;
procedure SettingsOnIdle1;
procedure SettingsOnIdle2;

implementation

uses
  Windows,
  Messages,
  SysUtils,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,

  OpenGL15_MainForm,
  dglOpenGL;

procedure GoToFullScreen(pWidth, pHeight, pBPP, pFrequency : Word);
var
 dmScreenSettings : DevMode;
begin
// Fenster vor Vollbild vorbereiten
GLForm.WindowState := wsMaximized;
GLForm.BorderStyle := bsNone;
ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));
with dmScreenSettings do
 begin
 dmSize              := SizeOf(dmScreenSettings);
 dmPelsWidth         := pWidth;                    // Breite
 dmPelsHeight        := pHeight;                   // Höhe
 dmBitsPerPel        := pBPP;                      // Farbtiefe
 dmDisplayFrequency  := pFrequency;                // Bildwiederholfrequenz
 dmFields            := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL or DM_DISPLAYFREQUENCY;
 end;
 if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then
  begin
   MessageBox(0, 'Konnte Vollbildmodus nicht aktivieren!', 'Error', MB_OK or MB_ICONERROR);
   exit
  end;
end;

procedure SettingsOnInit;
begin
 // Wenn gewollt, dann hier in den Vollbildmodus wechseln
 // Muss vorm Erstellen des Kontextes geschehen, da durch den Wechsel der
 // Gerätekontext ungültig wird!
 // GoToFullscreen(1600, 1200, 32, 75);

 // OpenGL-Funtionen initialisieren
 InitOpenGL;
 // Gerätekontext holen
 GLForm.DC := GetDC(GlForm.Handle);
 // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
 GLForm.RC := CreateRenderingContext(GLForm.DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
 // Erstellten Renderkontext aktivieren
 ActivateRenderingContext(GLForm.DC, GLForm.RC);
 // Tiefenpuffer aktivieren
 glEnable(GL_DEPTH_TEST);
 // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) "durchlassen"
 glDepthFunc(GL_LESS);
 glEnable(GL_TEXTURE_2D);

 // Löschfarbe für Farbpuffer setzen
 glClearColor(0.5,0.5,1,0);
 // Idleevent für Rendervorgang zuweisen
 Application.OnIdle := GLForm.ApplicationEventsIdle;
 // Zeitpunkt des Programmstarts für FPS-Messung speichern
 GLForm.StartTick := GetTickCount;

end;

procedure SettingsOnDestroy;
begin
 // Renderkontext deaktiveren
 DeactivateRenderingContext;
 // Renderkontext "befreien"
 wglDeleteContext(GLForm.RC);
 // Erhaltenen Gerätekontext auch wieder freigeben
 ReleaseDC(GLForm.Handle, GLForm.DC);
 // Falls wir im Vollbild sind, Bildschirmmodus wieder zurücksetzen
 ChangeDisplaySettings(devmode(nil^), 0);
end;

procedure SettingsOnIdle1;
begin
// Farb- und Tiefenpuffer löschen
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
// In die Projektionsmatrix wechseln
glMatrixMode(GL_PROJECTION);
// Identitätsmatrix laden
glLoadIdentity;
// Viewport an Clientareal des Fensters anpassen
glViewPort(0, 0, GLForm.ClientWidth, GLForm.ClientHeight);
// Perspective, FOV und Tiefenreichweite setzen
gluPerspective(90, GLForm.ClientWidth/GLForm.ClientHeight, 1, 128);


// In die Modelansichtsmatrix wechseln
glMatrixMode(GL_MODELVIEW);
// Identitätsmatrix laden
glLoadIdentity;
end;

procedure SettingsOnIdle2;
begin


// Hinteren Puffer nach vorne bringen
SwapBuffers(GLForm.DC);

// Nummer des gezeichneten Frames erhöhen
inc(GLForm.Frames);
// FPS aktualisieren
if GetTickCount - GLForm.StartTick >= 500 then
 begin
 GLForm.FPS       := GLForm.Frames/(GetTickCount-GLForm.StartTick)*1000;
 GLForm.Frames    := 0;
 GLForm.StartTick := GetTickCount;
 GLForm.Panel5.Caption   := 'FPS: ' + FloatToStr(trunc(GLForm.FPS));
 end;
end;

end.
