diff --git a/src/game/g_window.pas b/src/game/g_window.pas
index ef1d362bd77362b5d5045ea3ffcea44b9ed24da7..0429b77368be262a7b3d8e08c997e6653926e5fc 100644 (file)
--- a/src/game/g_window.pas
+++ b/src/game/g_window.pas
implementation
uses
+{$IFDEF WIN32}Windows,{$ENDIF}
SDL2, GL, GLExt, e_graphics, e_log, g_main,
g_console, SysUtils, e_input, g_options, g_game,
g_basic, g_textures, e_sound, g_sound, g_menu, ENet, g_net;
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
var
mode, cmode: TSDL_DisplayMode;
begin
+{$IFDEF HEADLESS}
+ Result := True;
+ Exit;
+{$ENDIF}
+
Result := False;
e_WriteLog('Setting display mode...', MSG_NOTIFY);
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;
begin
gWinSizeX := gScreenWidth;
gWinSizeY := gScreenHeight;
+ {$IFDEF HEADLESS}Exit;{$ENDIF}
e_ResizeWindow(gScreenWidth, gScreenHeight);
g_Game_SetupScreenSize();
g_Menu_Reset();
Preserve: Boolean;
begin
Result := False;
+ {$IFDEF HEADLESS}Exit;{$ENDIF}
Preserve := False;
if (gScreenWidth <> W) or (gScreenHeight <> H) then
procedure SwapBuffers();
begin
+ {$IFDEF HEADLESS}Exit;{$ENDIF}
SDL_GL_SwapWindow(h_Wnd);
end;
exit;
end;
+{$IFNDEF HEADLESS}
h_Gl := SDL_GL_CreateContext(h_Wnd);
if h_Gl = nil then Exit;
-
+{$ENDIF}
//wWindowCreated := True;
e_ResizeWindow(gScreenWidth, gScreenHeight);
Result := True;
end;
+{$IFDEF WIN32}
+// windoze sux; in headless mode `GetTickCount()` (and SDL) returns shit
function GetTimer(): Int64;
+var
+ F, C: Int64;
begin
- Result := SDL_GetTicks() * 1000; // TODO: do we really need microseconds here?
+ QueryPerformanceFrequency(F);
+ QueryPerformanceCounter(C);
+ Result := Round(C/F*1000{000});
end;
+{$ELSE}
+function GetTimer(): Int64;
+var
+ t: Uint32;
+ tt: Int64;
+begin
+ 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;
+{$ENDIF}
procedure ResetTimer();
begin
if wNeedTimeReset then
begin
- Time_Delta := 27777;
+ Time_Delta := (27777 div 1000);
wNeedTimeReset := False;
end;
- t := Time_Delta div 27777;
+ t := Time_Delta div (27777 div 1000);
if t > 0 then
begin
flag := True;
// Âðåìÿ ïðåäûäóùåãî îáíîâëåíèÿ:
if flag then
begin
- Time_Old := Time - (Time_Delta mod 27777);
+ Time_Old := Time - (Time_Delta mod (27777 div 1000));
if (not wMinimized) then
begin
Draw();
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);
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