DEADSOFTWARE

added headless mode
[d2df-sdl.git] / src / game / g_window.pas
index 419e135299da48568c51fe8974a8a2389016c0c6..c159ddd236d40221480036aa03394f51e41b51f9 100644 (file)
@@ -42,6 +42,8 @@ var
   wLoadingProgress: Boolean = False;
   wLoadingQuit: Boolean = False;
   {wWinPause: Byte = 0;}
+  ticksOverflow: Int64 = -1;
+  lastTicks: Uint32 = 0; // to detect overflow
 
 const
   // TODO: move this to a separate file
@@ -71,6 +73,11 @@ function g_Window_SetDisplay(PreserveGL: Boolean = False): Boolean;
 var
   mode, cmode: TSDL_DisplayMode;
 begin
+{$IFDEF HEADLESS}
+  Result := True;
+  Exit;
+{$ENDIF}
+  
   Result := False;
 
   e_WriteLog('Setting display mode...', MSG_NOTIFY);
@@ -124,7 +131,7 @@ var
   res, i, k, n, pw, ph: Integer;
 begin
   SetLength(Result, 0);
-
+  {$IFDEF HEADLESS}Exit;{$ENDIF}
   k := 0; SelRes := 0;
   n := SDL_GetNumDisplayModes(0);
   pw := 0; ph := 0;
@@ -154,6 +161,7 @@ procedure ChangeWindowSize();
 begin
   gWinSizeX := gScreenWidth;
   gWinSizeY := gScreenHeight;
+  {$IFDEF HEADLESS}Exit;{$ENDIF}
   e_ResizeWindow(gScreenWidth, gScreenHeight);
   g_Game_SetupScreenSize();
   g_Menu_Reset();
@@ -165,6 +173,7 @@ var
   Preserve: Boolean;
 begin
   Result := False;
+  {$IFDEF HEADLESS}Exit;{$ENDIF}
   Preserve := False;
 
   if (gScreenWidth <> W) or (gScreenHeight <> H) then
@@ -381,6 +390,7 @@ end;
 
 procedure SwapBuffers();
 begin
+  {$IFDEF HEADLESS}Exit;{$ENDIF}
   SDL_GL_SwapWindow(h_Wnd);
 end;
 
@@ -412,9 +422,10 @@ begin
     exit;
   end;
 
+{$IFNDEF HEADLESS}
   h_Gl := SDL_GL_CreateContext(h_Wnd);
   if h_Gl = nil then Exit;
-
+{$ENDIF}
   //wWindowCreated := True;
 
   e_ResizeWindow(gScreenWidth, gScreenHeight);
@@ -424,8 +435,28 @@ begin
 end;
 
 function GetTimer(): Int64;
+var
+  t: Uint32;
+  tt: Int64;
 begin
-  Result := SDL_GetTicks() {* 1000}; // TODO: do we really need microseconds here? k8: NOPE!
+  t := SDL_GetTicks() {* 1000}; // TODO: do we really need microseconds here? k8: NOPE!
+  if ticksOverflow = -1 then
+  begin
+    ticksOverflow := 0;
+    lastTicks := t;
+  end
+  else
+  begin
+    if lastTicks > t then
+    begin
+      // overflow, increment overflow ;-)
+      ticksOverflow := ticksOverflow+(Int64($ffffffff)+Int64(1));
+      tt := (Int64($ffffffff)+Int64(1))+Int64(t);
+      t := Uint32(tt-lastTicks);
+    end;
+  end;
+  lastTicks := t;
+  result := ticksOverflow+Int64(t);
 end;
 
 procedure ResetTimer();
@@ -566,6 +597,7 @@ procedure InitOpenGL(VSync: Boolean);
 var
   v: Byte;
 begin
+  {$IFDEF HEADLESS}Exit;{$ENDIF}
   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);
@@ -579,6 +611,10 @@ end;
 
 function SDLMain(): Integer;
 begin
+{$IFDEF HEADLESS}
+  e_NoGraphics := True;
+{$ENDIF}
+
   e_WriteLog('Creating GL window', MSG_NOTIFY);
   if not CreateGLWindow(PChar(Format('Doom 2D: Forever %s', [GAME_VERSION]))) then
   begin