diff --git a/src/game/g_window.pas b/src/game/g_window.pas
index a41c9f44b08ed50dae2524f5a3a1d9c554400233..5f372f36526ca64b58316537104a2d05095f5bdc 100644 (file)
--- a/src/game/g_window.pas
+++ b/src/game/g_window.pas
+(* 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *)
+{$MODE DELPHI}
unit g_window;
interface
uses
unit g_window;
interface
uses
- WADEDITOR;
+ wadreader;
function SDLMain(): Integer;
function GetTimer(): Int64;
function SDLMain(): Integer;
function GetTimer(): Int64;
implementation
uses
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;
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;
flag: Boolean;
wTitle: PChar = nil;
wNeedTimeReset: Boolean = False;
flag: Boolean;
wTitle: PChar = nil;
wNeedTimeReset: Boolean = False;
- wWindowCreated: Boolean = False;
+ //wWindowCreated: Boolean = False;
//wCursorShown: Boolean = False;
wMinimized: Boolean = False;
//wNeedFree: Boolean = True;
wLoadingProgress: Boolean = False;
wLoadingQuit: Boolean = False;
{wWinPause: Byte = 0;}
//wCursorShown: Boolean = False;
wMinimized: Boolean = False;
//wNeedFree: Boolean = True;
wLoadingProgress: Boolean = False;
wLoadingQuit: Boolean = False;
{wWinPause: Byte = 0;}
+{$IFNDEF WINDOWS}
+ ticksOverflow: Int64 = -1;
+ lastTicks: Uint32 = 0; // to detect overflow
+{$ENDIF}
const
// TODO: move this to a separate file
const
// TODO: move this to a separate file
var
mode, cmode: TSDL_DisplayMode;
begin
var
mode, cmode: TSDL_DisplayMode;
begin
+{$IFDEF HEADLESS}
+ Result := True;
+ Exit;
+{$ENDIF}
+
Result := False;
e_WriteLog('Setting display mode...', MSG_NOTIFY);
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;
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 h_Wnd <> nil then
begin
SDL_DestroyWindow(h_Wnd);
h_Wnd := nil;
end;
-
+
if gFullscreen then
begin
mode.w := gScreenWidth;
if gFullscreen then
begin
mode.w := gScreenWidth;
h_Wnd := SDL_CreateWindow(PChar(wTitle), gWinRealPosX, gWinRealPosY, gScreenWidth, gScreenHeight, wFlags);
if h_Wnd = nil then Exit;
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);
SDL_GL_MakeCurrent(h_Wnd, h_GL);
SDL_ShowCursor(SDL_DISABLE);
res, i, k, n, pw, ph: Integer;
begin
SetLength(Result, 0);
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;
k := 0; SelRes := 0;
n := SDL_GetNumDisplayModes(0);
pw := 0; ph := 0;
begin
gWinSizeX := gScreenWidth;
gWinSizeY := gScreenHeight;
begin
gWinSizeX := gScreenWidth;
gWinSizeY := gScreenHeight;
+ {$IFDEF HEADLESS}Exit;{$ENDIF}
e_ResizeWindow(gScreenWidth, gScreenHeight);
g_Game_SetupScreenSize();
g_Menu_Reset();
e_ResizeWindow(gScreenWidth, gScreenHeight);
g_Game_SetupScreenSize();
g_Menu_Reset();
Preserve: Boolean;
begin
Result := False;
Preserve: Boolean;
begin
Result := False;
+ {$IFDEF HEADLESS}Exit;{$ENDIF}
Preserve := False;
if (gScreenWidth <> W) or (gScreenHeight <> H) then
Preserve := False;
if (gScreenWidth <> W) or (gScreenHeight <> H) then
Result := False;
wActivate := False;
wDeactivate := False;
Result := False;
wActivate := False;
wDeactivate := False;
-
+
case ev.event of
SDL_WINDOWEVENT_MOVED:
begin
case ev.event of
SDL_WINDOWEVENT_MOVED:
begin
gWinRealPosY := ev.data2;
end;
end;
gWinRealPosY := ev.data2;
end;
end;
-
+
SDL_WINDOWEVENT_MINIMIZED:
begin
if not wMinimized then
SDL_WINDOWEVENT_MINIMIZED:
begin
if not wMinimized then
wDeactivate := True;
end;
end;
wDeactivate := True;
end;
end;
-
+
SDL_WINDOWEVENT_RESIZED:
begin
gScreenWidth := ev.data1;
SDL_WINDOWEVENT_RESIZED:
begin
gScreenWidth := ev.data1;
e_WriteLog('[DEBUG] WinMsgs: Resized to ' + IntToStr(ev.data1) + 'x' + IntToStr(ev.data2), MSG_NOTIFY);
end;
end;
e_WriteLog('[DEBUG] WinMsgs: Resized to ' + IntToStr(ev.data1) + 'x' + IntToStr(ev.data2), MSG_NOTIFY);
end;
end;
-
+
SDL_WINDOWEVENT_EXPOSED:
SwapBuffers();
SDL_WINDOWEVENT_EXPOSED:
SwapBuffers();
-
+
SDL_WINDOWEVENT_MAXIMIZED:
begin
if wMinimized then
SDL_WINDOWEVENT_MAXIMIZED:
begin
if wMinimized then
end;
end;
end;
end;
end;
end;
-
+
SDL_WINDOWEVENT_RESTORED:
begin
if wMinimized then
SDL_WINDOWEVENT_RESTORED:
begin
if wMinimized then
e_WriteLog('[DEBUG] WinMsgs: Now restored', MSG_NOTIFY);
end;
end;
e_WriteLog('[DEBUG] WinMsgs: Now restored', MSG_NOTIFY);
end;
end;
-
+
SDL_WINDOWEVENT_FOCUS_GAINED:
SDL_WINDOWEVENT_FOCUS_GAINED:
+ begin
wActivate := True;
wActivate := True;
-
+ //e_WriteLog('window gained focus!', MSG_NOTIFY);
+ end;
+
SDL_WINDOWEVENT_FOCUS_LOST:
SDL_WINDOWEVENT_FOCUS_LOST:
+ begin
wDeactivate := True;
wDeactivate := True;
+ //e_WriteLog('window lost focus!', MSG_NOTIFY);
+ end;
end;
end;
-
+
if wDeactivate then
begin
if gWinActive then
begin
if wDeactivate then
begin
if gWinActive then
begin
+ e_WriteLog('deactivating window', MSG_NOTIFY);
e_EnableInput := False;
e_ClearInputBuffer();
if gMuteWhenInactive then
e_EnableInput := False;
e_ClearInputBuffer();
if gMuteWhenInactive then
+ begin
+ //e_WriteLog('deactivating sounds', MSG_NOTIFY);
e_MuteChannels(True);
e_MuteChannels(True);
+ end;
if g_debug_WinMsgs then
begin
if g_debug_WinMsgs then
begin
begin
if not gWinActive then
begin
begin
if not gWinActive then
begin
+ //e_WriteLog('activating window', MSG_NOTIFY);
e_EnableInput := True;
if gMuteWhenInactive then
e_EnableInput := True;
if gMuteWhenInactive then
+ begin
+ //e_WriteLog('activating sounds', MSG_NOTIFY);
e_MuteChannels(False);
e_MuteChannels(False);
+ end;
if g_debug_WinMsgs then
begin
if g_debug_WinMsgs then
begin
key := ev.key.keysym.scancode;
KeyPress(key);
end;
key := ev.key.keysym.scancode;
KeyPress(key);
end;
-
+
SDL_TEXTINPUT:
begin
Utf8ToUnicode(@uc, PChar(ev.text.text), 1);
SDL_TEXTINPUT:
begin
Utf8ToUnicode(@uc, PChar(ev.text.text), 1);
procedure SwapBuffers();
begin
procedure SwapBuffers();
begin
+ {$IFDEF HEADLESS}Exit;{$ENDIF}
SDL_GL_SwapWindow(h_Wnd);
end;
SDL_GL_SwapWindow(h_Wnd);
end;
if h_GL <> nil then SDL_GL_DeleteContext(h_GL);
h_Wnd := nil;
h_GL := nil;
if h_GL <> nil then SDL_GL_DeleteContext(h_GL);
h_Wnd := nil;
h_GL := nil;
- wWindowCreated := False;
+ //wWindowCreated := False;
end;
function CreateGLWindow(Title: PChar): Boolean;
end;
function CreateGLWindow(Title: PChar): Boolean;
exit;
end;
exit;
end;
+{$IFNDEF HEADLESS}
h_Gl := SDL_GL_CreateContext(h_Wnd);
if h_Gl = nil then Exit;
h_Gl := SDL_GL_CreateContext(h_Wnd);
if h_Gl = nil then Exit;
-
- wWindowCreated := True;
+{$ENDIF}
+ //wWindowCreated := True;
e_ResizeWindow(gScreenWidth, gScreenHeight);
e_InitGL();
e_ResizeWindow(gScreenWidth, gScreenHeight);
e_InitGL();
Result := True;
end;
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;
function GetTimer(): Int64;
+var
+ t: Uint32;
+ tt: Int64;
begin
begin
- Result := SDL_GetTicks() * 1000; // TODO: do we really need microseconds here?
+ 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;
end;
+{$ENDIF}
procedure ResetTimer();
begin
procedure ResetTimer();
begin
if wNeedTimeReset then
begin
if wNeedTimeReset then
begin
- Time_Delta := 27777;
+ Time_Delta := 28{(27777 div 1000)};
wNeedTimeReset := False;
end;
wNeedTimeReset := False;
end;
- t := Time_Delta div 27777;
+ t := Time_Delta div 28{(27777 div 1000)};
if t > 0 then
begin
flag := True;
if t > 0 then
begin
flag := True;
// Âðåìÿ ïðåäûäóùåãî îáíîâëåíèÿ:
if flag then
begin
// Âðåìÿ ïðåäûäóùåãî îáíîâëåíèÿ:
if flag then
begin
- Time_Old := Time - (Time_Delta mod 27777);
+ Time_Old := Time - (Time_Delta mod 28{(27777 div 1000)});
if (not wMinimized) then
begin
Draw();
if (not wMinimized) then
begin
Draw();
var
v: Byte;
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);
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
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
e_WriteLog('Creating GL window', MSG_NOTIFY);
if not CreateGLWindow(PChar(Format('Doom 2D: Forever %s', [GAME_VERSION]))) then
begin