X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_window.pas;h=0429b77368be262a7b3d8e08c997e6653926e5fc;hb=1fffc4a51fc4ef50b4be44ba53239d5843afab9a;hp=ef1d362bd77362b5d5045ea3ffcea44b9ed24da7;hpb=3bedb8ac6ca3fe3a45921bb840b7b6be3171d6a9;p=d2df-sdl.git diff --git a/src/game/g_window.pas b/src/game/g_window.pas index ef1d362..0429b77 100644 --- a/src/game/g_window.pas +++ b/src/game/g_window.pas @@ -23,6 +23,7 @@ function g_Window_SetSize(W, H: Word; FScreen: Boolean): Boolean; 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; @@ -42,6 +43,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 +74,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 +132,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 +162,7 @@ procedure ChangeWindowSize(); begin gWinSizeX := gScreenWidth; gWinSizeY := gScreenHeight; + {$IFDEF HEADLESS}Exit;{$ENDIF} e_ResizeWindow(gScreenWidth, gScreenHeight); g_Game_SetupScreenSize(); g_Menu_Reset(); @@ -165,6 +174,7 @@ var Preserve: Boolean; begin Result := False; + {$IFDEF HEADLESS}Exit;{$ENDIF} Preserve := False; if (gScreenWidth <> W) or (gScreenHeight <> H) then @@ -381,6 +391,7 @@ end; procedure SwapBuffers(); begin + {$IFDEF HEADLESS}Exit;{$ENDIF} SDL_GL_SwapWindow(h_Wnd); end; @@ -412,9 +423,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); @@ -423,10 +435,42 @@ begin 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 @@ -506,11 +550,11 @@ 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; @@ -542,7 +586,7 @@ begin // Âðåìÿ ïðåäûäóùåãî îáíîâëåíèÿ: 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(); @@ -566,6 +610,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 +624,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