DEADSOFTWARE

Now ported to android!
[d2df-sdl.git] / src / game / g_window.pas
index f7f06d89d2aa5e3fc8712b12f30d99e5c20cdbb9..90c5950caa830d59d0670e3aba4e3f4eed6fb6a8 100644 (file)
@@ -1,4 +1,4 @@
-(* Copyright (C)  Doom 2D: Forever Developers
+ (* Copyright (C)  Doom 2D: Forever Developers
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -32,6 +32,7 @@ procedure Sleep (ms: LongWord);
 function GetDisplayModes (dbpp: LongWord; var selres: LongWord): SSArray;
 function g_Window_SetDisplay (preserveGL: Boolean=false): Boolean;
 function g_Window_SetSize (w, h: Word; fullscreen: Boolean): Boolean;
+procedure g_SetVSync (vsync: Boolean);
 
 procedure ProcessLoading (forceUpdate: Boolean=false);
 
@@ -50,8 +51,13 @@ implementation
 
 uses
 {$IFDEF WINDOWS}Windows,{$ENDIF}
+{$IFDEF USE_NANOGL}
+  nanoGL,
+{$ELSE}
+  GL, GLExt,
+{$ENDIF}
   SysUtils, Classes, MAPDEF,
-  SDL2, GL, GLExt, e_graphics, e_log, e_texture, g_main,
+  SDL2, e_graphics, e_log, e_texture, g_main,
   g_console, e_input, g_options, g_game,
   g_basic, g_textures, e_sound, g_sound, g_menu, ENet, g_net,
   g_map, g_gfx, g_monsters, g_holmes, xprofiler,
@@ -69,10 +75,10 @@ var
 {$IF not DEFINED(HEADLESS)}
   wTitle: PChar = nil;
   wasFullscreen: Boolean = true; // so we need to recreate the window
-  wMaximized: Boolean = false;
 {$ENDIF}
   wNeedTimeReset: Boolean = false;
   wMinimized: Boolean = false;
+  wMaximized: Boolean = false;
   wLoadingProgress: Boolean = false;
   wLoadingQuit: Boolean = false;
 {$IFNDEF WINDOWS}
@@ -85,7 +91,13 @@ procedure KillGLWindow (preserveGL: Boolean);
 begin
   if (h_GL <> nil) and (not preserveGL) then begin if (assigned(oglDeinitCB)) then oglDeinitCB(); end;
   if (h_Wnd <> nil) then SDL_DestroyWindow(h_Wnd);
-  if (h_GL <> nil) and (not preserveGL) then SDL_GL_DeleteContext(h_GL);
+  if (h_GL <> nil) and (not preserveGL) then
+  begin
+    {$IFDEF USE_NANOGL}
+      nanoGL_Destroy;
+    {$ENDIF USE_NANOGL}
+    SDL_GL_DeleteContext(h_GL);
+  end;
   h_Wnd := nil;
   if (not preserveGL) then h_GL := nil;
 end;
@@ -105,7 +117,7 @@ begin
   e_WriteLog('Setting display mode...', TMsgType.Notify);
 
   wFlags := SDL_WINDOW_OPENGL {or SDL_WINDOW_RESIZABLE};
-  if gFullscreen then wFlags := wFlags or SDL_WINDOW_FULLSCREEN else wFlags := wFlags or SDL_WINDOW_RESIZABLE;
+  if gFullscreen then wFlags := wFlags {or SDL_WINDOW_FULLSCREEN} else wFlags := wFlags or SDL_WINDOW_RESIZABLE;
   if (not gFullscreen) and (not preserveGL) and gWinMaximized then wFlags := wFlags or SDL_WINDOW_MAXIMIZED else gWinMaximized := false;
 
   if gFullscreen then
@@ -144,12 +156,15 @@ begin
   begin
     KillGLWindow(preserveGL);
     h_Wnd := SDL_CreateWindow(PChar(wTitle), gWinRealPosX, gWinRealPosY, gScreenWidth, gScreenHeight, wFlags);
+    if gFullscreen then
+      SDL_SetWindowFullscreen(h_Wnd, SDL_WINDOW_FULLSCREEN);
     if (h_Wnd = nil) then exit;
   end;
   wasFullscreen := gFullscreen;
 
   SDL_GL_MakeCurrent(h_Wnd, h_GL);
   SDL_ShowCursor(SDL_DISABLE);
+  if (h_GL <> nil) then g_SetVSync(gVSync);
   if (gFullscreen) then
   begin
     nw := 0;
@@ -519,7 +534,17 @@ begin
   if (h_GL = nil) then exit;
   fuiScrWdt := gScreenWidth;
   fuiScrHgt := gScreenHeight;
+  SDL_GL_MakeCurrent(h_Wnd, h_GL);
+{$IFDEF USE_NANOGL}
+  if nanoGL_Init() = 0 then
+  begin
+    KillGLWindow(false);
+    e_WriteLog('nanoGL initialization error', TMsgType.Fatal);
+    exit;
+  end;
+{$ENDIF USE_NANOGL}
   if (assigned(oglInitCB)) then oglInitCB();
+  if (h_GL <> nil) then g_SetVSync(gVSync);
 {$ENDIF}
 
   e_ResizeWindow(gScreenWidth, gScreenHeight);
@@ -747,7 +772,7 @@ begin
 end;
 
 
-procedure InitOpenGL (vsync: Boolean);
+procedure g_SetVSync (vsync: Boolean);
 {$IF not DEFINED(HEADLESS)}
 var
   v: Byte;
@@ -755,15 +780,35 @@ var
 begin
 {$IF not DEFINED(HEADLESS)}
   if vsync then v := 1 else v := 0;
-  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
-  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
-  SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
-  SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
-  SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
-  SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
-  SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
-  SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); // lights; it is enough to have 1-bit stencil buffer for lighting, but...
-  SDL_GL_SetSwapInterval(v);
+  if (SDL_GL_SetSwapInterval(v) <> 0) then
+  begin
+    e_WriteLog('oops; can''t change vsync option, restart required', TMsgType.Warning);
+  end
+  else
+  begin
+    if vsync then e_WriteLog('VSync: ON', TMsgType.Notify) else e_WriteLog('VSync: OFF', TMsgType.Notify);
+  end;
+{$ENDIF}
+end;
+
+
+procedure InitOpenGL ();
+begin
+{$IF not DEFINED(HEADLESS)}
+  {$IFDEF USE_NANOGL}
+    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1);
+    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
+    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);    
+  {$ELSE}
+    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
+    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
+    SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
+    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
+    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
+    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
+    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+    SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); // lights; it is enough to have 1-bit stencil buffer for lighting, but...
+  {$ENDIF}
 {$ENDIF}
 end;
 
@@ -911,12 +956,13 @@ begin
   end;
 
   e_WriteLog('Initializing OpenGL', TMsgType.Notify);
-  InitOpenGL(gVSync);
+  InitOpenGL();
 
   e_WriteLog('Creating GL window', TMsgType.Notify);
   if not CreateGLWindow(PChar(Format('Doom 2D: Forever %s', [GAME_VERSION]))) then
   begin
     result := 0;
+    e_WriteLog('Unable to create GL window: ' + SDL_GetError(), TMsgType.Fatal);
     exit;
   end;