diff --git a/src/game/g_window.pas b/src/game/g_window.pas
index 33fc80c2969914e7f43c22d84edbc8c8d9ba55fb..29f79e480c403d6e6779e61f2a87f72a71fed84d 100644 (file)
--- a/src/game/g_window.pas
+++ b/src/game/g_window.pas
+{$MODE DELPHI}
unit g_window;
interface
uses
- WADEDITOR;
+ wadreader;
function SDLMain(): Integer;
function GetTimer(): Int64;
implementation
uses
+{$IFDEF WINDOWS}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;
var
mode, cmode: TSDL_DisplayMode;
begin
+{$IFDEF HEADLESS}
+ Result := True;
+ Exit;
+{$ENDIF}
+
Result := False;
e_WriteLog('Setting display mode...', MSG_NOTIFY);
wFlags := SDL_WINDOW_OPENGL or SDL_WINDOW_RESIZABLE;
if gFullscreen then wFlags := wFlags or SDL_WINDOW_FULLSCREEN;
if gWinMaximized then wFlags := wFlags or SDL_WINDOW_MAXIMIZED;
-
+
if h_Wnd <> nil then
begin
SDL_DestroyWindow(h_Wnd);
h_Wnd := nil;
end;
-
+
if gFullscreen then
begin
mode.w := gScreenWidth;
h_Wnd := SDL_CreateWindow(PChar(wTitle), gWinRealPosX, gWinRealPosY, gScreenWidth, gScreenHeight, wFlags);
if h_Wnd = nil then Exit;
-
+
SDL_GL_MakeCurrent(h_Wnd, h_GL);
SDL_ShowCursor(SDL_DISABLE);
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
Result := False;
wActivate := False;
wDeactivate := False;
-
+
case ev.event of
SDL_WINDOWEVENT_MOVED:
begin
gWinRealPosY := ev.data2;
end;
end;
-
+
SDL_WINDOWEVENT_MINIMIZED:
begin
if not wMinimized then
wDeactivate := True;
end;
end;
-
+
SDL_WINDOWEVENT_RESIZED:
begin
gScreenWidth := ev.data1;
e_WriteLog('[DEBUG] WinMsgs: Resized to ' + IntToStr(ev.data1) + 'x' + IntToStr(ev.data2), MSG_NOTIFY);
end;
end;
-
+
SDL_WINDOWEVENT_EXPOSED:
SwapBuffers();
-
+
SDL_WINDOWEVENT_MAXIMIZED:
begin
if wMinimized then
end;
end;
end;
-
+
SDL_WINDOWEVENT_RESTORED:
begin
if wMinimized then
key := ev.key.keysym.scancode;
KeyPress(key);
end;
-
+
SDL_TEXTINPUT:
begin
Utf8ToUnicode(@uc, PChar(ev.text.text), 1);
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 WINDOWS}
+// windoze sux; in headless mode `GetTickCount()` (and SDL) returns shit
+function GetTimer(): Int64;
+var
+ F, C: Int64;
+begin
+ QueryPerformanceFrequency(F);
+ QueryPerformanceCounter(C);
+ Result := Round(C/F*1000{000});
+end;
+{$ELSE}
function GetTimer(): Int64;
var
t: Uint32;
lastTicks := t;
result := ticksOverflow+Int64(t);
end;
+{$ENDIF}
procedure ResetTimer();
begin
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